Jedis實現分布式鎖
阿新 • • 發佈:2018-07-27
分布式鎖 password tdi with htm .get 操作 狀態 cnblogs
Jedis pom
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
JedisUtil
import redis.clients.jedis.*; import java.util.ArrayList; import java.util.List; public class RedisUtil { // Redis 服務器 IP private String address = "127.0.0.1"; // Redis的端口號 private int port = 6379; // 訪問密碼 private String password = "123456"; // 連接 redis 等待時間 private int timeOut = 10000; // 可用連接實例的最大數目,默認值為8; // 如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態為exhausted(耗盡) private int maxTotal = -1; // 控制一個pool最多有多少個狀態為idle(空閑的)的jedis實例,默認值也是8 private int maxIdle = 200; // 等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException private int maxWait = 10000; // 在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的 private boolean testOnBorrow = true; // 連接池 private JedisPool jedisPool = null; // 構造函數 public RedisUtil() { try { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxTotal); config.setMaxIdle(maxIdle); config.setMaxWaitMillis(maxWait); config.setTestOnBorrow(testOnBorrow); jedisPool = new JedisPool(config, address, port, timeOut, password); } catch(Exception e) { e.printStackTrace(); } } // 獲取 Jedis 實例 public Jedis getJedis() { if (jedisPool != null) { return jedisPool.getResource(); } return null; } }
Jedis實現分布式鎖
import redis.clients.jedis.Jedis; import java.util.Collections; public class RedisTest { private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; /** * 嘗試獲取分布式鎖 * @param jedis Redis客戶端 * @param lockKey 鎖 * @param requestId 請求標識 * @param expireTime 超期時間 * @return 是否獲取成功 */ public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) { String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); if (LOCK_SUCCESS.equals(result)) { return true; } return false; } public static boolean tryReleaseLock(Jedis jedis,String lockKey, String requestId) { String script = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end"; Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId)); if(LOCK_SUCCESS.equals(jedis.del(lockKey))) return true; return false; } public static void main(String[] args) { System.out.println(tryGetDistributedLock(new RedisUtil().getJedis(), new String("mykey"),new String("hhhh"),50)); } }
from ruthless and liuyang0
Jedis實現分布式鎖