echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!!
分布式鎖的基本要求
- 互斥
- 沒有死鎖
- 我持有的鎖只能被我釋放
分布式鎖的釋放和獲取代碼實現
package com.example.echo.redis.distlock;
import redis.clients.jedis.Jedis;
import java.util.Collections;
/**
* @author XLecho
* Date 2019/11/18 0018
* Time 21:14
*/
public class DistLock {
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";
private static final Long RELEASE_SUCCESS = 1L;
/**
* 嘗試獲取分布式鎖
*
* @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);
return LOCK_SUCCESS.equals(result);
}
/**
* 釋放分布式鎖
*
* @param jedis redis客戶端
* @param lockKey 鎖
* @param requestId 請求標識
* @return
*/
public static boolean releaseDistributedLock(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));
return RELEASE_SUCCESS.equals(result);
}
}
做一個有底線的博客主