redis setnx 实现分布式锁

    对于如何实现分布式锁,方法有很多,这里介绍下使用redis setnx的实现方式。

    首先分析下为什么 redis setnx 能实现分布式锁功能。

    第一 redis本身相对于我们的多实例分布式应用程序来说,它是可全局共享的,每个实例都能访问同一个redis服务器(有点废话了)。

    第二 redis的操作都是原子性的。

    第三 来看下redis的setnx 特点。

    Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

    实例演示


redis> EXISTS job                # job 不存在
(integer) 0
redis> SETNX job "programmer"    # job 设置成功
(integer) 1
redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败
(integer) 0
redis> GET job                   # 没有被覆盖
"programmer"

   好了,上代码(其中redisUtils就不贴代码了):

public void lock(){
   String lockKey = "lock";
   long lock = redisUtils.setnx(lockKey, "1");
   int i = 0;
   while (lock < 1){
      i ++;
      if (i > 30){
         //30次后无法取得锁
         throw new Exception("无法获取锁");
      }
      Thread.sleep(50);
      lock = redisUtils.setnx(lockKey, "1");
   }
   //成功获取到锁,
   dosomesing();
   redisUtils.del(lockKey);
}

public void dosomesing(){
   System.out.println("正在执行。。。");
}

 在dosomesing中去执行你需要保证同步的业务就ok了。

 总结:

        用redis setnx做分布式锁,只是一个小技巧而已,其最重要的原理,记住一条:Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值