加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

明白微服务下分布式锁的正确姿势

发布时间:2021-05-29 14:09:47 所属栏目:编程 来源:互联网
导读:将key的值设为value ,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何动作。 setnx:当key存在,不做任何操作,key不存在,才设置 加锁: SET orderI
副标题[/!--empirenews.page--]

将key的值设为value ,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何动作。setnx:当key存在,不做任何操作,key不存在,才设置

加锁:

SET orderId driverId NX PX 30000 

上面的命令如果执行成功,则客户端成功获取到了锁,接下来就可以访问共享资源了;而如果上面的命令执行失败,则说明获取锁失败。 

释放锁:关键,判断是不是自己加的锁。

GrabService :

public interface GrabService { 

 

    /** 

     * 商品抢单 

     * @param orderId 

     * @param driverId 

     * @return 

     */ 

    public ResponseResult grabOrder(int orderId, int driverId); 

GrabRedisLockServiceImpl :

@Service("grabRedisLockService") 

public class GrabRedisLockServiceImpl implements GrabService { 

 

  @Autowired 

  StringRedisTemplate stringRedisTemplate; 

 

  @Autowired 

  OrderService orderService; 

 

    @Override 

    public ResponseResult grabOrder(int orderId , int driverId){ 

        //生成key 

      String lock = "order_"+(orderId+""); 

      /* 

       *  情况一,如果锁没执行到释放,比如业务逻辑执行一半,运维重启服务,或 服务器挂了,没走 finally,怎么办? 

       *  加超时时间 

       */ 

//      boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+""); 

//      if(!lockStatus) { 

//        return null; 

//      } 

 

      /* 

       *  情况二:加超时时间,会有加不上的情况,运维重启 

       */ 

//      boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+""); 

//      stringRedisTemplate.expire(lock.intern(), 30L, TimeUnit.SECONDS); 

//      if(!lockStatus) { 

//        return null; 

//      } 

 

      /* 

       * 情况三:超时时间应该一次加,不应该分2行代码, 

       *  

       */ 

      boolean lockStatus = stringRedisTemplate.opsForValue().setIfAbsent(lock.intern(), driverId+"", 30L, TimeUnit.SECONDS); 

      if(!lockStatus) { 

        return null; 

      } 

 

      try { 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读