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

Redis分布式锁

时间:2018-10-28 11:25:31      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:redis分布式   nts   default   col   分布   port   ESS   The   ted   

 1 package com.zad.jedis;
 2 
 3 import redis.clients.jedis.Jedis;
 4 
 5 import java.util.Collections;
 6 
 7 /**
 8  * 描述:
 9  * 分布式锁
10  *
11  * @author zad
12  * @create 2018-09-14 13:58
13  */
14 public class Distributed {
15     private static final String LOCK_SUCCESS = "OK";
16     private static final String SET_IF_NOT_EXIST = "NX";
17     private static final String SET_WITH_EXPIRE_TIME = "PX";
18     private static final Integer RELEASE_SUCCESS = 1;
19     private static final Integer DEFAULT_TIME = 5;
20 
21     /**
22      * 尝试获取分布式锁
23      *
24      * @param jedis      Redis客户端
25      * @param lockKey    锁
26      * @param requestId  请求标识
27      * @return 是否获取成功
28      */
29     public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId) {
30 
31         String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, DEFAULT_TIME);
32 
33         if (LOCK_SUCCESS.equals(result)) {
34             return true;
35         }
36         return false;
37 
38     }
39 
40 
41     /**
42      * 尝试获取分布式锁
43      *
44      * @param jedis      Redis客户端
45      * @param lockKey    锁
46      * @param requestId  请求标识
47      * @param expireTime 超期时间
48      * @return 是否获取成功
49      */
50     public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
51 
52         String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
53 
54         if (LOCK_SUCCESS.equals(result)) {
55             return true;
56         }
57         return false;
58 
59     }
60 
61     /**
62      * 释放分布式锁
63      *
64      * @param jedis     Redis客户端
65      * @param lockKey   锁
66      * @param requestId 请求标识
67      * @return 是否释放成功
68      */
69     public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
70 
71         String script = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";
72         Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
73 
74         if (RELEASE_SUCCESS.equals(result)) {
75             return true;
76         }
77         return false;
78 
79     }
80 }

 

Redis分布式锁

标签:redis分布式   nts   default   col   分布   port   ESS   The   ted   

原文地址:https://www.cnblogs.com/zad27/p/9864485.html

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