jedis

RedisSystemException: java.lang.ClassCastException: [B cannot be cast to java.lang.Long

孤人 提交于 2021-01-28 00:33:28
问题 I meet this exception when using jedis with spring-data-redis in multi threading environment: org.springframework.data.redis.RedisSystemException: Unknown redis exception; nested exception is java.lang.ClassCastException: [B cannot be cast to java.lang.Long at org.springframework.data.redis.FallbackExceptionTranslationStrategy.getFallback(FallbackExceptionTranslationStrategy.java:48) at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate

springboot项目redis分布式锁实现(基于luttuce)

左心房为你撑大大i 提交于 2021-01-27 11:17:51
问题背景 对于大部分的后端服务,服务很多都是多实例部署的,而在我们的工程中,比如说代码中定义的定时任务需要从数据库中捞数据,那么多机部署上的每个实例都会执行,那么就会存在数据重复上报,那么就不可避免得出现脏数据,影响数据的准确性。 问题分析 解决这个问题最直接的思路就是,当多机部署中无论哪个实例捞到了某条数据,那么其他的实例就不能再次捞取。针对这个思路,我们大致可以有以下两个解决方案: 1. 在数据库层解决。给访问的数据表中,增一个字段flag,标识是否已经上报过,每个实例上报一条,就更新一下这个状态,后面的实例再读到这一条时,发现上报过了,就不处理了。这就要改一下现在的读取方式,需要从数据库中逐条读取,避免脏数据。 2. 引入分布式锁,最简单的,就用redis实现,每个实例开始定时任务前,先尝试在redis中获取锁,如果获取得到,这个实例的定时任务就执行,否则就跳过。 对于第一个解决方案的实现本文不予说明,这种实现方式虽然可行,但是对于频繁更新数据库的操作我个人是非常不推荐的,性能方面可能会受到影响。本文主要想介绍一下方案2的实现。 方案实现 对于多机部署的问题,自然而然就可以想到分布式锁来保证任务执行的准确性。在Springboot项目中,最直接就是通过redis实现,我们知道,从Springboot 2.X开始,底层的redis客户端从Jedis换成了luttuce

分布式锁的性质jedis

戏子无情 提交于 2021-01-24 09:43:41
可靠性。首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性。在任意时刻,只有一个客户端能持有锁。 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 组件依赖 首先我们要通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码: redis.clients jedis 2.9.0 加锁代码 正确姿势 Talk is cheap, show me the code。先展示代码,再带大家慢慢解释为什么这样实现: public class RedisTool { private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; /** * 尝试获取分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识

Redis和SpringDataRedis

断了今生、忘了曾经 提交于 2021-01-24 02:48:30
一.Redis简介 ​    Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,运行在内存中,由ANSI C编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 、MongoDB等。 1.Redis数据结构 ​ 字符串类型 string ​ 散列类型 hash ​ 列表类型 list 有序可重复 ​ 集合类型 set 无序不可重复 有序集合类型 sortedset 有序不可重复 2.Redis应用场景 做缓存: 缓存的是使用频次较高,但不是特别重要的数据,请求来时,优先查询非关系型数据库,如果没有查到则查询关系型数据库,从关系型数据库中查询到结果后,将结果存放到非关系型数据库中,并将结果返回给浏览器.如果查询到了,直接将查询结果返回给浏览器即可。 当用户执行 增 删 改操作时,优先操作关系型数据库, ( 会造成Redis数据丢失 ) 操作完毕后,删除非关系型数据库中的相关数据. ( 需要Redis数据同步 ) 二.Redis持久化: 注意: 要想使用redis的持久化操作,启动redis时必须采用配置文件 使用指定配置文件开启服务 (会持久化) ★★★★★ ​ 启动服务器: 在dos命令中输入 redis-server.exe redis.windows.conf ​ 启动客户端: 在dos命令中输入

网站性能优化小结和spring整合redis

眉间皱痕 提交于 2021-01-23 07:04:15
现在越来越多的地方需要非关系型数据库了,最近网站优化,当然从页面到服务器做了相应的优化后,通过在线网站测试工具与之前没优化对比,发现有显著提升。 服务器优化目前主要优化tomcat,在tomcat目录下的server.xml文件配置如下内容: <Connector port="1818"   protocol="HTTP/1.1"   maxHttpHeaderSize="8192"   maxThreads="1000"   minSpareThreads="100"   maxSpareThreads="1000"   minProcessors="100"   maxProcessors="1000"   enableLookups="false"   compression="on"   compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"   connectionTimeout="20000"   URIEncoding="utf-8"   acceptCount="1000"   redirectPort="8443"   disableUploadTimeout="true"/> 参数说明: Protocol

Spring Data Redis 使用Lettuce在Redis集群中无法高可用

落爺英雄遲暮 提交于 2021-01-23 00:27:25
Spring Data Redis 使用Lettuce在Redis集群中无法高可用 Spring boot 2.1.X 下Spring-data-redis-start 使用 Lettuce 作为Redis连接池 问题场景 在App运行期间Redis集群中某个Master节点 Shutdown,导致应用连接Redis报错,错误信息 连接超时。 解决方案 Lettuce 解决方法 使用 RedisClusterClient.reloadPartitions 自动reload pattitions。 链接地址: https://lettuce.io/core/release/reference/index.html#redis-cluster.refreshing-the-cluster-topology-view Spring-data-redis 解决方法 重写 RedisConnectionFactory Bean @Data @Component public class RedisConfig { @Autowired RedisProperties redisProperties; @Bean public RedisConnectionFactory newLettuceConnectionFactory() { ClusterTopologyRefreshOptions

Java连接redis

喜你入骨 提交于 2021-01-12 01:50:39
一.依赖包 jedis-2.1.0.jar commons-pool-1.6.jar 二.实例 //连接参数 public class RedisConfig { public static int Maxactive=0 ; public static int RetryNum=0 ; public static int Maxidle=0 ; public static int Maxwait=0 ; public static int Timeout=0 ; public static String ip="" ; public static int port=0 ; } public class RedisUtil { protected Logger log = LoggerFactory.getLogger(getClass()); private static Map<String,JedisPool> maps = new HashMap<String,JedisPool> (); /** * 私有构造器. */ private RedisUtil() { } /** * 获取连接池. * @return 连接池实例 */ private static JedisPool getPool(String ip, int port) { String key = ip+

【Redis】Jedis

巧了我就是萌 提交于 2021-01-07 10:51:27
Jedis idea 连接redis 连接本地redis 连接远程redis 常用api 基本 String list set 添加 移除 集合运算 hash 事务 idea 连接redis 连接本地redis 连接本地redis, 则打开本地redis-server 打开后界面如下 public class TestPing { public static void main ( String [ ] args ) { //1. new 一个jedis 对象 Jedis jedis = new Jedis ( "127.0.0.1" , 6379 ) ; //连接本地 //jedis 的命令就是redis的命令 System . out . println ( jedis . ping ( ) ) ; } } 连接远程redis 修改redis.conf 把bind 修改成0.0.0.0 连接redis-server ( base ) flora@MAC-3DGroup:~/myredis$ redis-server ./redis.conf 注意用 ps -ef | grep redis 查看进程时 要是0.0.0.0 才对 java代码 public class TestPing { public static void main ( String [ ] args ) {

分布式锁的由来、特点、及Redis分布式锁的实现详解

梦想的初衷 提交于 2021-01-06 04:56:03
什么是分布式锁 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。 1.线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如Synchronized、Lock等。 2.进程锁 为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。 3.分布式锁 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。 分布式锁的由来 在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。 但是在分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁的由来。 当多个进程不在同一个系统中,就需要用分布式锁控制多个进程对资源的访问。 分布式锁的特点 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 1、 互斥性 :任意时刻,只能有一个客户端获取锁,不能同时有两个客户端获取到锁。 2、 安全性 :锁只能被持有该锁的客户端删除

什么是分布式锁?Redis实现分布式锁详解

二次信任 提交于 2021-01-05 10:18:52
     在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?今天继续由陈睿|mikechen来继续分享Redis这个系列。   01.什么是分布式锁   要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。   1.线程锁   主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。   2.进程锁   为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。   3.分布式锁   当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。   02.分布式锁的要求   首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:   1、互斥性:任意时刻,只能有一个客户端获取锁,不能同时有两个客户端获取到锁。   2、安全性:锁只能被持有该锁的客户端删除,不能由其它客户端删除。   3、死锁:获取锁的客户端因为某些原因