Redis?Lua同步鎖實(shí)現(xiàn)源碼解析
更新時(shí)間:2023年05月18日 10:43:23 作者:多喝灬丶燙水
這篇文章主要為大家介紹了Redis?Lua同步鎖實(shí)現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
Redis+Lua同步鎖
Jedis配置
@Configuration
@Getter
@Setter
@Slf4j
@ConfigurationProperties(prefix = "jedis")
public class JedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
private int timeout;
private int maxTotal;
private int maxIdle;
private int minIdle;
@Bean
public JedisPool jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxTotal(maxTotal);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);
log.info("JedisPool連接成功:" + host + "\t" + port);
return jedisPool;
}
}Jedis工具類(lèi)→獲取jedis
@Component
public class JedisUtil {
@Resource
private JedisPool jedisPool;
/**
* 獲取Jedis資源
*/
public Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 釋放Jedis連接
*/
public void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}redis 鎖工具類(lèi)
public class RedisLockUtil {
private static final Long RELEASE_SUCCESS = 1L;
private static final String PREFIX = "API_LOCK_";
/**
* 釋放分布式鎖
*
* @param jedis
* @param lockKey
* @param valve
* @return boolean
* @author ll
* @date 2023/02/09 14:31
*/
public static boolean unLock(Jedis jedis, String lockKey, String valve) {
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(PREFIX + lockKey), Collections.singletonList(PREFIX + valve));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 加分布式鎖
*
* @param jedis
* @param lockKey
* @param valve
* @param timeout
* @return boolean
* @author ll
* @date 2023/02/09 14:31
*/
public static boolean lock(Jedis jedis, String lockKey, String valve, int timeout) {
String script = "if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then" +
" redis.call('expire',KEYS[1],ARGV[2]) return 1 else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(PREFIX + lockKey), Lists.newArrayList(PREFIX + valve, String.valueOf(timeout)));
//判斷是否成功
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
}加鎖示例(jedis+lua)
@Slf4j
@Component
public class InterfaceEventListener {
@Resource
private JedisUtil jedisUtil;
@Value("${jedis.lock.cycle-number}")
private int cycleNumber;
@Value("${jedis.lock.expire-time}")
private int expireTime;
@Value("${jedis.lock.sleep-time}")
private int sleepTime;
@Value("${spring.redis.database}")
private int database;
public void onApplicationEvent(InterfaceEvent event) {
Jedis jedis = jedisUtil.getJedis();
jedis.select(database);
boolean unLock = false;
boolean lock;
int currentNumber = 0;
try {
do {
lock = RedisLockUtil.lock(jedis, "lockKey", "valve", expireTime);
if (lock) {
try {
//todo 加鎖的代碼
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
unLock = RedisLockUtil.unLock(jedis, detectCode, detectCode);
}
}
currentNumber++;
Thread.sleep(sleepTime);
}
while (!unLock && currentNumber < cycleNumber);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
} finally {
jedisUtil.close(jedis);
}
}
}以上就是Redis Lua同步鎖實(shí)現(xiàn)源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Redis Lua同步鎖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis?數(shù)據(jù)傾斜產(chǎn)生的原因及問(wèn)題詳解
數(shù)據(jù)傾斜是指在Redis分布式集群(如Redis?Cluster或Codis)中,數(shù)據(jù)(內(nèi)存占用)或訪問(wèn)請(qǐng)求(QPS)沒(méi)有均勻地分布到各個(gè)節(jié)點(diǎn)上,導(dǎo)致部分節(jié)點(diǎn)負(fù)載過(guò)高,而其他節(jié)點(diǎn)相對(duì)空閑的現(xiàn)象,文章詳細(xì)介紹了Redis數(shù)據(jù)傾斜的概念、原因、診斷方法以及解決方案,感興趣的朋友一起看看吧2026-01-01
redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列的示例代碼
在高并發(fā)場(chǎng)景下,延遲隊(duì)列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
spring?boot整合redis中間件與熱部署實(shí)現(xiàn)代碼
spring?boot整合redis最常用的有三個(gè)工具庫(kù)Jedis,Redisson,Lettuce,本文重點(diǎn)介紹spring?boot整合redis中間件與熱部署實(shí)現(xiàn),需要的朋友可以參考下2023-01-01

