当前位置: 首页 > 科技观察

Redis实战详解Redisson使用技巧,干活!

时间:2023-03-20 00:04:55 科技观察

1.总结什么是Redisson?来自官网的描述如下!Redisson是基于Redis实现的Java内存数据网格客户端(In-MemoryDataGrid)。它不仅提供了一系列redis通用数据结构命令服务,还提供了很多分布式服务,比如分布式锁、分布式对象、分布式集合、分布式远程服务、分布式调度任务服务等等。与Jedis、Lettuce等基于redis命令封装的客户端相比,Redisson提供的功能更加高端和抽象。更多功能特性和开发文档可移至github获取。访问地址如下:https://img.ydisp.cn/news/20221227/uwcg1eyqix1Redisson操作strings、hashes、lists、sets、Sortedsets以及Bloomfilters和分布式锁等特性。2.Redisson2.1。基本用途和过去一样。首先创建一个maven项目,添加redisson依赖包。org.redissonredisson3.13.6单机环境下,简单示例如下!公共类RedissonMain{publicstaticvoidmain(String[]args){Configconfig=newConfig();config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456").setDatabase(0);//获取客户端RedissonClientredissonClient=Redisson.create(config);//获取所有keyredissonClient.getKeys().getKeys().forEach(key->System.out.println(key));//关闭客户端redissonClient.shutdown();}}ps:创建RedissonClient对象实例的方式有很多种,可以直接在代码中设置Redis服务的相关参数来创建,也可以通过加载JSON格式和YAML格式,或者创建一个SpringXML配置文件。详细的参数配置可以移步上面提到的Redisson开发文档。2.2.字符串操作Redisson支持通过RBucket对象操作字符串数据结构。你可以通过RBucket实例设置值或者设置值和有效期。一个简单的例子如下!//字符串操作RBucketrBucket=redissonClient.getBucket("strKey");//设置value和key的有效期rBucket.set("张三",30,TimeUnit.SECONDS);//获取valueSystemby键.out.println(redissonClient.getBucket("strKey").get());2.3.对象操作Redisson支持将对象作为值存储在redis中。存储的对象必须提前实现Serializable接口,否则会报错。一个简单的例子如下!publicclassStudentimplementsSerializable{privateLongid;私有字符串名称;私人整数年龄;//set,get...@OverridepublicStringtoString(){return"Student{"+"id="+id+",name='"+name+'\''+",age="+age+'}';}}//Student对象Studentstudent=newStudent();student.setId(1L);student.setName("张三");student.setAge(18);//对象操作RBucketrBucket=redissonClient.getBucket("objKey");//设置value和key的有效期rBucket.set(student,30,TimeUnit.SECONDS);//通过key获取valueSystem.out.println(redissonClient.getBucket("objKey").get());2.4.哈希操作Redisson支持通过RMap对象对哈希数据结构进行操作。一个简单的例子如下!//哈希运算RMaprMap=redissonClient.getMap("mapkey");//Setkey-valuerMap.put("id","123");rMap.put("姓名","赵四");rMap.put("age","50");//设置过期时间rMap.expire(30,TimeUnit.SECONDS);//获取valueSystem.out.println(redissonClient.getMap("mapkey").get(“姓名”));2.5.列表操作Redisson支持通过RList对象对列表数据结构进行操作,一个简单的例子如下!//字符串操作RListrList=redissonClient.getList("listkey");Studentstudent1=newStudent();student1.setId(1L);student1.setName("张三");student1.setAge(18);rList.add(student1);Studentstudent2=newStudent();student2.setId(2L);student2.setName("李四");student2.setAge(19);rList.add(student2);//设置过期时间rList.expire(30,TimeUnit.SECONDS);//通过key获取valueSystem.out.println(redissonClient.getList("listkey"));2.6.集合操作Redisson支持通过RSet对象对集合数据结构进行操作,一个简单的例子如下!//字符串操作RSetrSet=redissonClient.getSet("setkey");Studentstudent1=newStudent();student1.setId(1L);student1.setName("张三");student1.setAge(18);rSet.add(student1);Studentstudent2=newStudent();student2.setId(2L);student2.setName("Lisi");student2.setAge(19);rSet.add(student2);//设置过期时间rSet.expire(30,TimeUnit.SECONDS);//按键获取valueSystem.out。println(redissonClient.getSet("setkey"));2.6.有序集操作Redisson支持通过RSortedSet对象对有序集数据结构进行操作。在使用对象进行存储之前,实体对象必须先实现Comparable接口并重写比较逻辑,否则会报错,一个简单的例子如下!publicclassStudentimplementsSerializable,Comparable{privateLongid;私有字符串名称;私人整数年龄;//get,set.....@OverridepublicStringtoString(){return"Student{"+"id="+id+",name='"+name+'\''+",age="+年龄+'}';}@OverridepublicintcompareTo(Studentobj){returnthis.getId().compareTo(obj.getId());}}//有序集合操作RSortedSetsortSetkey=redissonClient.getSortedSet("sortSetkey");Studentstudent1=newStudent();student1.setId(1L);student1.setName("张三");student1.setAge(18);sortSetkey.add(student1);Studentstudent2=newStudent();student2.setId(2L);student2.setName("李四");student2.setAge(19);sortSetkey.add(student2);//通过key获取值System.out.println(redissonClient.getSortedSet("sortSetkey"));2.7、布隆过滤器布隆过滤器(BloomFilter)是布卢姆在1970年提出的,它实际上是一个很长的二值向量和一系列随机映射函数。布隆过滤器可以用来检索一个元素是否在一个其优点是空间效率和查询时间都比一般算法好很多,缺点是存在一定的误识别率和删除难度。Redisson支持通过RBloomFilter对象操作布隆过滤器,一个简单的例子如下!RBloomFilterrBloomFilter=redissonClient.getBloomFilter("seqId");//初始化期望插入数据量为10000,期望错误率0.01rBloomFilter.tryInit(10000,0.01);//插入一些数据rBloomFilter.add("100");rBloomFilter.add("200");rBloomFilter.add("300");//设置过期时间rBloomFilter.expire(30,TimeUnit.SECONDS);//判断是否存在System.out.println(rBloomFilter.contains("300"));System.out.println(rBloomFilter.contains("200"));System.out.println(rBloomFilter.contains("999"));2.8.分布式自增IDID是数据的唯一标识,传统的做法是使用UUID和数据库的自增ID。但是,由于UUID是无序的,不能附带一些其他信息,实际效果有限。随着业务的发展,数据量会越来越大,数据需要分表甚至分库。分表后,每个表的数据会按照自己的节奏增长,会造成ID冲突。因此,需要一种单独的机制来生成唯一ID。Redis原生支持生成全局唯一ID。一个简单的例子如下!finalStringlockKey="aaaa";//通过redis自增获取序列号RAtomicLongatomicLong=redissonClient.getAtomicLong(lockKey);//设置过期时间atomicLong.expire(30,TimeUnit.SECONDS);//获取值System.out.println(atomicLong.incrementAndGet());2.9.分布式锁Redisson最大的亮点也是使用最多的功能,就是提供了强大的分布式锁实现。其特点是:使用方便、安全!一个简单的使用示例如下!配置config=newConfig();config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456").setDatabase(0);RedissonClientredissonClient=Redisson.create(config);//获取锁对象实例finalStringlockKey="abc";RLockrLock=redissonClient.getLock(lockKey);try{//尝试在5秒内获取锁,获取到则自动释放最多60秒booleanres=rLock.tryLock(5L,60L,TimeUnit.SECONDS);if(res){//成功获取锁,处理这里的业务System.out.println("获取锁成功");}}赶上(异常e){系统。out.println("获取锁失败,失败原因:"+e.getMessage());}finally{//无论如何,最终解锁rLock.unlock();}//关闭客户端redissonClient.shutdown();以上是单机环境下分布式锁的实现逻辑。如果是在集群环境下,应该怎么处理呢?Redisson提供RedissonRedLock操作类,又称红锁,实现原理简单总结如下:如果有多个redis集群,当且仅当大多数(N/2+1,比如有3个redis节点,那么至少有2个节点)redis节点已经获取到锁,并且获取锁花费的总时间小于锁过期时间,则认为加锁成功。如果获取失败,客户端会在所有的Redis实例上解锁在运行集群环境下,redis服务端并没有直接有任何复制或者其他隐含的分布式协调机制,否则可能会有实际效果的可能RedissonRedLock简单的使用例子是如下!配置config1=newConfig();config1.useSingleServer().setAddress("redis://192.168.3.111:6379").setPassword("a123456").setDatabase(0);RedissonClientredissonClient1=Redisson.create(config1);Configconfig2=newConfig();config2.useSingleServer().setAddress("redis://192.168.3.112:6379").setPassword("a123456").setDatabase(0);RedissonClientredissonClient2=Redisson.create(config2);Configconfig3=newConfig();config3.useSingleServer().setAddress("redis://192.168.3.113:6379").setPassword("a123456").setDatabase(0);RedissonClientredissonClient3=Redisson.create(config3);//获取多个RLock对象finalStringlockKey="abc";RLocklock1=redissonClient1.getLock(lockKey);RLocklock2=redissonClient2.getLock(lockKey);RLocklock3=redissonClient3.getLock(lockKey);//基于多个RLock对象构造RedissonRedLock(核心区别就在这里)RedissonRedLockredLock=newRedissonRedLock(lock1,lock2,lock3);try{//5秒内尝试获取锁。如果获得,会在60秒内自动释放。布尔res=redLock.tryLock(5L,60L,TimeUnit.SECONDS);if(res){//成功获取锁,处理这里的业务System.out.println("获取锁成功");}}catch(Exceptione){System.out.println("获取锁失败,失败原因:"+e.getMessage());}finally{//无论如何,最后一定要解锁redLock.unlock();}更详细的分布式锁实现原理分析,可以移步此地址参考https://blog.csdn.net/asd051377305/article/details/1083844902.10、集群模式以上描述的都是单机模式。如果是集群环境,我们可以这样配置:configconfig=newConfig();config.useClusterServers().setScanInterval(2000)//集群状态扫描间隔,单位毫秒//可以使用"rediss://"以启用SSL连接。addNodeAddress("redis://127.0.0.1:7000","redis://127.0.0.1:7001").addNodeAddress("redis://127.0.0.1:7002");RedissonClientredisson=Redisson.create(config);2.11哨兵模式哨兵模式,参数配置方法如下:Configconfig=newConfig();config.useSentinelServers().setMasterName("mymaster")//可以使用"rediss://"开启SSL连接。addSentinelAddress("127.0.0.1:26389","127.0.0.1:26379").addSentinelAddress("127.0.0.1:26319");RedissonClientredisson=Redisson.create(config);2.12.Master-slavemode主从模式,参数配置方法如下:configconfig=newConfig();config.useMasterSlaveServers()//可以使用"rediss://"开启SSL连接.setMasterAddress("redis//127.0.0.1:6379").addSlaveAddress("redis://127.0.0.1:6389","redis://127.0.0.1:6332","redis://127.0.0.1:6419")。添加从机A地址("redis://127.0.0.1:6399");RedissonClientredisson=Redisson.create(config);3.小结在前面的文章中,我们详细介绍了Jedis和Lettuce,不禁要问一个问题:Redisson、Jedis和Lettuce有什么区别?现在我们回过头来总结一下!Jedis:Redis官方推出的一款通过Java连接Redis客户端的工具包。它提供了类似于Redis原生命令的全面支持,是目前使用最广泛的java客户端。Lettuce:一个可扩展的线程安全的Redis客户端,基于Netty开发的通信框架,支持哨兵、集群、管道、自动重连等Redis高级特性。从SpringBoot2.x开始,Lettuce已经取代Jedis成为首选的Redis客户端。Redisson:基于Redis构建的综合型新型中间件,其通信基于Netty,是企业级开发使用Redis的最佳模型。综上所述,Jedis对Redis的命令进行了非常全面的封装,而Lettuce则进一步丰富了API,支持Redis的各种高级特性。但是两者并没有更进一步,只是给了你操作Redis数据库的工具,而Redisson建立了一套基于Redis、Lua和Netty的分布式解决方案,比如分布式锁的实现,分布式对象操作等等。在实际使用中,Lettuce+Redisson经常组合使用,两者相辅相成。关于分布式锁实现的应用,建议在生产环境中尽量使用单点环境来实现,基本解决了大部分分布式锁的问题。如果现在的服务环境真的很复杂,可以使用RedissonRedLock来实现。4.参考1.Redisson开发文档2.王同学-说说Java客户端Redisson3和VenlenterRedis官方推荐的顶级推荐-Redis分布式锁-本文完全看懂(Redission实现分布式锁的完美解决方案)