Redisson是一个用于Java的分布式和高可用的Java对象的框架,它基于Redis实现。在Spring Boot应用程序中集成Redisson可以帮助我们更轻松地实现分布式锁、分布式对象、分布式集合等功能。本文将介绍如何在Spring Boot项目中集成Redisson,并展示一些基本用法。
添加依赖
在Spring Boot项目中,打开pom.xml文件并添加以下Redisson的Maven依赖:
<!-- redisson --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.25.2</version></dependency>
添加配置文件
在application.yml文件中添加Redisson的配置信息:
spring:redisson:# 单机模式host: 192.168.10.106
port:6379# 哨兵模式sentinel:master: mymaster
nodes: 192.168.10.106:6209,192.168.10.106:6219,192.168.10.106:6229# 集群模式cluster: 192.168.10.106:6109,192.168.10.106:6119,192.168.10.106:6129# 密码password: xj2022
注意: 我们如果只有一个redis客户端的话我们在此处只需要配置一种模式,别的配置信息留空即可,我们会通过配置类优先找 哨兵配置,没有的话再找cluster集群配置,没有的话再找单机配置。
添加配置类
在代码中添加配置类RedissonConfig:
importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.StringUtils;importorg.redisson.Redisson;importorg.redisson.api.RedissonClient;importorg.redisson.client.codec.StringCodec;importorg.redisson.config.Config;importorg.redisson.config.ReadMode;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@Configuration@Slf4jpublicclassRedissonConfig{@Value("${spring.redisson.sentinel.nodes}")privateString sentinel;@Value("${spring.redisson.sentinel.master}")privateString masterName;@Value("${spring.redisson.cluster}")privateString cluster;@Value("${spring.redisson.host}")privateString host;@Value("${spring.redisson.port}")privateString port;@Value("${spring.redisson.password}")privateString password;privateint timeout =2000;privateint scanInterval =60000;privatestaticString ADDRESS_PREFIX ="redis://";/**
* 单机模式
*/@BeanpublicRedissonClientinitBean(){// 哨兵模式if(StringUtils.isNotBlank(sentinel)){
log.info("redis is sentinel mode");returnredissonSentinel();}// 集群模式if(StringUtils.isNotBlank(cluster)){
log.info("redis is cluster mode");returnredissonCluster();}// 单机模式if(StringUtils.isNotBlank(host)){
log.info("redis is single mode");returnredissonSingle();}
log.error("redisson config can not support this redis mode");returnnull;}/**
* 单机模式
*/privateRedissonClientredissonSingle(){Config config =newConfig();String address = ADDRESS_PREFIX+host+":"+port;//设置
config.setCodec(newStringCodec())//这是用的集群server.useSingleServer().setAddress(address).setTimeout(timeout).setPassword(password);returnRedisson.create(config);}/**
* 哨兵模式
*/privateRedissonClientredissonSentinel(){String[] nodes = sentinel.split(",");//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加for(int i=0;i<nodes.length;i++){
nodes[i]= ADDRESS_PREFIX+nodes[i];}Config config =newConfig();//设置
config.setCodec(newStringCodec()).useSentinelServers().setMasterName(masterName).setPassword(password).setTimeout(timeout).addSentinelAddress(nodes)// 在Redisson启动期间启用sentinels列表检查,默认为true,这里我们设置为false,不检查.setCheckSentinelsList(false);returnRedisson.create(config);}/**
* 集群模式
*/privateRedissonClientredissonCluster(){String[] nodes = cluster.split(",");//redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加for(int i=0;i<nodes.length;i++){
nodes[i]= ADDRESS_PREFIX+nodes[i];}Config config =newConfig();//设置
config.setCodec(newStringCodec())//这是用的集群server.useClusterServers()//设置集群状态扫描时间.setScanInterval(scanInterval).addNodeAddress(nodes).setPassword(password).setReadMode(ReadMode.MASTER);;returnRedisson.create(config);}}
这样,我们就配置好了redisson,我们可以在代码中使用了。
示例:分布式锁
以下是一个使用redisson 分布式锁的示例代码
importjakarta.annotation.Resource;importlombok.extern.slf4j.Slf4j;importorg.redisson.api.RLock;importorg.redisson.api.RedissonClient;importorg.springframework.stereotype.Service;importjava.util.concurrent.TimeUnit;@Service@Slf4jpublicclassRedissonTestService{@ResourceprivateRedissonClient redissonClient;//锁过期时间privatestaticfinalLong LOCK_KEY_TIME =120L;publicvoiddoJobTask(){//定时任务执行周期较短,为防止数据重复修改,加入锁RLock lock = redissonClient.getLock("your_task_name");// 尝试获取锁并设定锁的过期时间boolean acquired =false;try{//获取锁
acquired = lock.tryLock(0, LOCK_KEY_TIME,TimeUnit.SECONDS);}catch(InterruptedException e){
log.error("取锁失败");}if(acquired){try{// 执行业务逻辑}catch(Exception e){
log.error("处理失败");//业务异常处理逻辑}finally{// 释放锁
lock.unlock();}}else{// 获取锁失败,说明有其他线程或进程正在处理数据// 可以进行重试或触发告警机制}}}
这只是一个简单的示例,你可以根据需要使用更高级的Redisson功能。
总结
通过集成Redisson,我们可以轻松地实现分布式系统中的各种功能,提高应用程序的可伸缩性和可靠性。我们在生产环境会经常有跨机房使用承载网连接redis的情况,我们后续会在写一篇关于redisson实现承载网转换源码改造的文章。希望本文能够帮助你快速入门Spring Boot集成Redisson,并在实际项目中应用这些功能。
版权归原作者 修己xj 所有, 如有侵权,请联系我们删除。