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

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

发布时间:2021-05-29 13:06:22 所属栏目:编程 来源:互联网
导读:将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 { 

(编辑:湖南网)

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

热点阅读