spring-integration-redis中分布式锁RedisLockRegistry的使用
创始人
2024-05-30 19:57:34
0

pom依赖:

org.springframework.boot

spring-boot-starter-data-redis

org.springframework.integration

spring-integration-redis

配置:

@Configuration

public class RedisLockConfig {

@Bean

public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {

//第一个参数redisConnectionFactory

//第二个参数registryKey,分布式锁前缀,设置为项目名称会好些

//该构造方法对应的分布式锁,默认有效期是60秒.可以自定义

return new RedisLockRegistry(redisConnectionFactory, "boot-launch");

//return new RedisLockRegistry(redisConnectionFactory, "boot-launch",60);

}

}

方式1:

Lock lock = redisLockRegistry.obtain("lockkey-" + 1);
//tryLock尝试获取锁(成功返回true,失败返回false);if (lock.tryLock()) {try {// 业务代码块} finally {//走到这里说明获取锁一定是成功的try{lock.unlock();}catch (IllegalStateException e){//业务操作时间过长,会导致锁超时内系统释放,这里就会产生超时异常log.error("释放时发现锁过期");}}} else {//走到这里说明获取锁一定是失败的的log.info("并发抢锁失败");}

方式2:

Lock lock = redisLockRegistry.obtain("lockkey-" + 1);
//lock()一直循环获取锁,循环周期为100毫秒(成功了则无返回,失败了则抛异常),理论上一定能获取到锁,因为会一直循环取锁try {lock.lock();// 业务代码块(这里要判断并发情况下的业务幂等性)}catch (CannotAcquireLockException e){//当redis挂掉时执行redis操作失败会产生异常CannotAcquireLockException;说明获取锁失败了log.error("get redis lock fail");} finally {//走到这里 获取锁不一定是成功的,异常时也走,因此需要判断lock状态if(Objects.noNull(lock)){//锁存在才需要释放try{lock.unlock();}catch (IllegalStateException e){//业务操作时间过长,会导致锁超时内系统释放,这里就会产生超时异常log.error("释放时发现锁过期");}}}

方式3:

Lock lock = redisLockRegistry.obtain("lockkey-" + 1);
try {
//tryLock(3, TimeUnit.SECONDS):在3秒钟内循环获取锁,超过3秒还没有获取到就认为获取失败了,这个方法会抛出异常InterruptedException,boolean isLocked = lock.tryLock(3, TimeUnit.SECONDS);if (isLocked) {// 业务代码块}} catch (InterruptedException e) {log.error("get redis lock fail");}finally {//获取锁失败的时候也会走,需要判断锁失败时不去释放if(Objects.noNull(lock)){//锁存在才需要释放try{lock.unlock();}catch (IllegalStateException e){//业务操作时间过长,会导致锁超时内系统释放,这里就会产生超时异常log.error("释放时发现锁过期");}}}

总结:

解决同一个用户并发操作同一个资源时,如提交时按钮连击、多端调用同一个业务接口:使用方式1;方式2(使用方式2时需要做幂等判断,如连击操作多次调用时,对第二次调用不做处理)

解决并发限流时,如抽奖系统中对商品sku库存做锁操作,防止多个用户同时扣减库存导致库存数量少扣:使用方式2、或者方式3(锁等待时间=预计业务代码执行时间)

三方式都要注意释放锁时做锁过期处理

相关内容

热门资讯

安卓系统home键隐藏,提升手... 你有没有发现,手机里的安卓系统越来越智能了?有时候,一些小小的改动就能带来大大的惊喜。今天,就让我来...
手机怎么刷屏安卓版系统,安卓手... 你有没有发现,现在手机刷屏简直成了朋友圈的标配?不管是美食、旅行还是日常琐事,大家都喜欢用手机刷屏来...
小米安卓系统电视机,畅享视听盛... 亲爱的读者们,你是否曾想过,家里的电视也能像智能手机一样智能呢?今天,就让我带你一起探索一下小米安卓...
安卓系统怎么设置最好的,nn`... 你有没有发现,安卓系统就像一个万能的魔法盒,里面藏着无数的小秘密和神奇的功能?想要让你的安卓手机发挥...
安卓哪个品牌系统顺畅,哪个品牌... 手机系统,这个话题可是让不少安卓用户头疼不已。市面上那么多品牌,哪个的系统用起来最顺畅呢?今天,就让...
安卓系统相机不能启动,安卓相机... 手机里的安卓系统相机突然不能启动了,这可真是让人头疼啊!你有没有遇到过这种情况呢?别急,今天就来跟你...
安卓原生系统时间校准,基于安卓... 手机时间不准了?别急,我来教你如何轻松搞定安卓原生系统时间校准! 话题引入:手机时间不准,是不是让你...
主机系统内存和安卓联机,主机系... 你有没有想过,为什么你的手机在玩大型游戏时总是卡得要命?又或者,为什么你的电脑在处理复杂任务时,反应...
安卓如何手机上刷系统,轻松升级... 你有没有想过,你的安卓手机是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来教你怎么给它来个“青...
苹果系统观战安卓好友,观战新体... 亲爱的读者,你是否也有过这样的经历:一边享受着苹果系统的优雅与流畅,一边又忍不住好奇地观战安卓好友们...
安卓系统最好是哪个,最佳生成方... 你有没有想过,手机里的安卓系统哪个才是最适合你的呢?在这个信息爆炸的时代,手机已经成为了我们生活中不...
改时间安卓系统vivo,探索v... 你有没有发现,最近你的vivo手机有点儿“慢吞吞”的?别急,别急,让我来给你支个招儿,让你的安卓系统...
安卓系统的旋钮在哪,旋钮生成位... 你有没有发现,有时候手机上的小细节也能让人头疼不已?比如说,安卓系统的旋钮在哪?这问题看似简单,但不...
安卓手机app系统软件,探索安... 你有没有发现,现在手机里的app简直就像是个小宇宙,各种功能应有尽有,让人眼花缭乱。尤其是安卓手机,...
win111安卓子系统,开启跨... 哇,你有没有听说最近的大新闻?那就是Windows 11的安卓子系统!是的,你没听错,Windows...
游戏摇杆连安卓系统电视,畅享游... 你有没有想过,家里的安卓系统电视也能玩起游戏来?没错,就是那种让你手舞足蹈、热血沸腾的游戏摇杆!今天...
nokia平板系统兼容安卓,尽... 你有没有想过,那些曾经陪伴我们度过无数时光的诺基亚手机,现在竟然也能摇身一变,成为平板电脑的得力助手...
安卓原生系统是什么品牌,探索安... 你有没有想过,为什么你的手机那么流畅,界面那么美观?这背后,可是有一个强大的“大脑”在默默支撑着呢!...
安卓3大操作系统,从三大分支看... 你知道吗?在安卓的世界里,操作系统可是有着三大巨头呢!它们就像安卓世界的三驾马车,各自有着独特的魅力...
开源文件管理系统安卓,打造个性... 你有没有想过,手机里那些乱糟糟的文件,要是能有个好帮手,生活该有多轻松啊?今天,就让我带你走进一个神...