Redisson 实现分布式锁

在我们工作中高并发的情况下常常会用到分布式锁,然而自己实现分布式锁是一个非常繁琐复杂的流程,Redisson这个框架就帮我们解决了这个问题,我们只需要简单的配置一下,获得锁对象,使用锁,解锁就可以了。

Redisson实现流程


  1. 现在有线程1和线程2两个线程要对redis进行操作,假如线程1先一步进入了进入了这个业务那么线程1就会向Redis中加一把锁(此锁有过期时间)

  1. 当线程1加锁后会启动一个专门的线程去判断线程1中的锁有没有被线程自己释放掉防止锁自己过期,判断如果线程1没有主动释放锁就会将锁的过期时间延长直到线程1主动释放锁。(这一步防止线程1的业务还没有走完锁过期,同样也会出现并发问题。)

  1. 线程2再次进入这个业务会先判断也就是和setnx这个命令差不多,但是redisson的底层使用的是lua脚本去尝试给redis加锁,如果线程1的锁还没有释放那么线程2不可能加锁成功,此时线程2会while循环进入自旋直到线程1释放锁。

  1. 当线程1释放锁后线程2停止自旋加锁成功重复线程1的操作。

代码步骤:

//通过@Bean按照自己的需求返回一个Redisson对象(这个是单机模式下操作的)
@Bean
publicReidssonredisson(){
    Configconfig=newConfig();
    config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);
    return (Redisson) Redisson.create(config);
}
​

​
RlockredissonLock=redisson.getLock("key的值");              //这一步是获取锁对象
try{
    
    redissonLock.lock();                                        //加锁
    
    /**
    *业务代码
    */
    
}fianlly{
    
    redissonLock.unlock();                                      //释放锁
    
}

使用Redisson只需要简单的几步就可以实现分布式锁,还是会出现一些问题,但是遇到的问题几乎很少会出现,例如我们在使用redis的主从模式的时候redis会先将上锁成功的信息返回给客户端再讲锁信息进行一个同步,假如锁成功的消息已经返回给客户端了但是还没有来得及进行同步此时Master宕机了那么就会出现其他线程上锁成功,也会出现并发安全问题。处理这种业务可以选择zookeeper来处理分布式事务,也可以选用redisson中带的红锁(不建议)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值