redis实现简单分布式锁(RedisTemplate)
@Component
public class RedisDistributedLock {
@Autowired
private RedisTemplate<String, String> redisTemplate;
// 锁的过期时间,单位毫秒
private static final long LOCK_EXPIRE_TIME = 30000;
// 获取锁的 Lua 脚本
private static final String LOCK_SCRIPT =
"if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then " +
"redis.call('pexpire', KEYS[1], ARGV[2]); " +
"return true; " +
"else return false; " +
"end";
// 释放锁的 Lua 脚本
private static final String UNLOCK_SCRIPT =
"if redis.call('get', KEYS[1]) == ARGV[1] then " +
"redis.call('del', KEYS[1]); " +
"return true; " +
"else return false; " +
"end";
// 获取分布式锁
public boolean lock(String key, String value) {
String[] keys = {key};
String[] args = {value, String.valueOf(LOCK_EXPIRE_TIME)};
RedisScript<Boolean> script = new DefaultRedisScript<>(LOCK_SCRIPT, Boolean.class);
Boolean result = redisTemplate.execute(script, Arrays.asList(keys), args);
return result != null && result;
}
// 释放分布式锁
public boolean unlock(String key, String value) {
String[] keys = {key};
String[] args = {value};
RedisScript<Boolean> script = new DefaultRedisScript<>(UNLOCK_SCRIPT, Boolean.class);
Boolean result = redisTemplate.execute(script, Arrays.asList(keys), args);
return result != null && result;
}
}
本文作者:陌上人如玉এ
本文链接:https://www.cnblogs.com/wxs520/p/17878439.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步