SpringBoot集成redis实现分布式锁的示例代码
1、准备
使用redis实现分布式锁,需要用的setnx(),所以需要集成Jedis
需要引入jar,jar最好和redis的jar版本对应上,不然会出现版本冲突,使用的时候会报异常redis.clients.jedis.Jedis.set(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;
我使用的redis版本是2.3.0,Jedis使用的是3.3.0
redis.clients jedis 3.3.0
2、配置参数
spring: redis: host:localhost port:6379 password:root timeout:5000 #Redis数据库索引(默认为0) database:0 #连接池最大连接数(使用负值表示没有限制) jedis: pool: #连接池最大连接数(使用负值表示没有限制) max-active:8 #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait:-1 #连接池中的最大空闲连接 max-idle:8 #连接池中的最小空闲连接 min-idle:0 #获取连接时检测是否可用 testOnBorrow:true
3、配置JedisPool
importlombok.extern.slf4j.Slf4j; importorg.apache.commons.lang3.StringUtils; importorg.springframework.beans.factory.annotation.Value; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importredis.clients.jedis.JedisPool; importredis.clients.jedis.JedisPoolConfig; /** *Jedis配置项 *@authoConnorSong *@date2021/1/219:55上午 */ @Configuration @Slf4j publicclassJedisPoolCinfigration{ @Bean publicJedisPoolConfigjedisPoolConfig(@Value("${spring.redis.jedis.pool.max-active}")intmaxActive, @Value("${spring.redis.jedis.pool.max-idle}")intmaxIdle, @Value("${spring.redis.jedis.pool.min-idle}")intminIdle, @Value("${spring.redis.jedis.pool.max-wait}")longmaxWaitMillis, @Value("${spring.redis.jedis.pool.testOnBorrow}")booleantestOnBorrow){ JedisPoolConfigjedisPoolConfig=newJedisPoolConfig(); jedisPoolConfig.setMaxTotal(maxActive); jedisPoolConfig.setMaxIdle(maxIdle); jedisPoolConfig.setMinIdle(minIdle); jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); jedisPoolConfig.setTestOnBorrow(testOnBorrow); returnjedisPoolConfig; } @Bean publicJedisPooljedisPool(@Value("${spring.redis.host}")Stringhost, @Value("${spring.redis.password}")Stringpassword, @Value("${spring.redis.port}")intport, @Value("${spring.redis.timeout}")inttimeout,JedisPoolConfigjedisPoolConfig){ log.info("=====创建JedisPool连接池====="); if(StringUtils.isNotEmpty(password)){ returnnewJedisPool(jedisPoolConfig,host,port,timeout,password); } returnnewJedisPool(jedisPoolConfig,host,port,timeout); } }
4、分布式锁工具类
importlombok.extern.slf4j.Slf4j; importredis.clients.jedis.Jedis; importredis.clients.jedis.params.SetParams; importjava.util.Collections; /** *jedis分布式锁工具类 *@authoConnorSong *@date2021/1/206:26下午 */ @Slf4j publicclassJedisLockUtils{ privatestaticfinalStringLOCK_SUCCESS="OK"; privatestaticfinalLongRELEASE_SUCCESS=1L; /** *尝试获取分布式锁 *@paramjedisRedis客户端 *@paramlockKey锁 *@paramlockValuevalue *@paramexpireTime超期时间(秒) *@return是否获取成功 */ publicstaticbooleantryGetLock(Jedisjedis,StringlockKey,StringlockValue,intexpireTime){ log.info("----获取Jedis分布式锁----lockKey:{}",lockKey); try{ //方案一,具有原子性,并且可以设置过期时间,避免拿到锁后,业务代码出现异常,无法释放锁 Stringresult=jedis.set(lockKey,lockValue,newSetParams().nx().ex(expireTime)); if(LOCK_SUCCESS.equals(result)){ returntrue; } returnfalse; //方案二,setnx()具有原子性,但是有后续判断,整体不具有原子性,不能设置过期时间 ////setnx(lockkey,当前时间+过期超时时间),如果返回1,则获取锁成功;如果返回0则没有获取到锁 //Stringvalue=newDate().getTime()+expireTime+""; //if(1==jedis.setnx(lockKey,value)){ //returntrue; //}else{ //StringoldExpireTime=jedis.get(lockKey); //if(Long.valueOf(oldExpireTime)到此这篇关于SpringBoot集成redis实现分布式锁的示例代码的文章就介绍到这了,更多相关SpringBootredis分布式锁内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。