码迷,mamicode.com
首页 > 其他好文 > 详细

redis分布式锁

时间:2020-04-30 21:36:53      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:添加   false   key   turn   mil   except   超时   system   排队   

redis分布式锁。

redis单线程理解:

  redis操作基于命令,在一个命令执行过程中,其他命令处于等待排队状态。不可能同时执行两个命令。

 

故redis很适合锁分布式锁

 

代码:

 1  private static String lockKey = "myLockKey";
 2 
 3     /**
 4      * value:当前时间ms值 + 超时时间(如3s)
 5      * @param jedis
 6      * @param value
 7      * @return
 8      */
 9     public boolean lock(Jedis jedis, String value){
10         Long result = jedis.setnx(lockKey, value);
11         //添加成功
12         if(result == 1){
13             return true;
14         }
15         String oldValue = jedis.get(lockKey);
16         //锁过期
17         if(!StringUtils.isEmpty(oldValue) && Long.parseLong(oldValue) < System.currentTimeMillis()){
18 
19             String val = jedis.getSet(lockKey, value);
20             //因为redis是单线程的,这些判断很有必要
21             if(!StringUtils.isEmpty(val) && val.equals(value)){
22                 return true;
23             }
24         }
25         return false;
26 
27 
28     }
29 
30     /**
31      *
32      * @param jedis
33      * @param value:与获取锁的value一致
34      */
35     public void unLock(Jedis jedis, String value){
36         try{
37             String old = jedis.get(lockKey);
38             if(!StringUtils.isEmpty(old) && old.equals(value)){
39                 jedis.del(lockKey);
40             }
41         }catch (Exception e){
42             e.printStackTrace();
43         }
44 
45 
46     }

 

setnx:若存在,则不添加,返回0

    若不存在,添加成功,返回1

 

redis分布式锁

标签:添加   false   key   turn   mil   except   超时   system   排队   

原文地址:https://www.cnblogs.com/zchok/p/12810957.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!