Redis分布式锁
- 由于判断锁和释放锁是两个步骤,在判断一致后如果线程阻塞导致锁超时释放。之后阻塞结束,当前线程继续执行释放了其它线程的锁。锁设计失败
- 解决方法:通过lua封装比较和释放锁两个步骤:要么同时成功,要么同时失败
- 我的疑问?为什么不对判断和释放锁两个步骤再加锁
@Override
public void unlock() {
// 调用lua脚本
stringRedisTemplate.execute(
UNLOCK_SCRIPT,
Collections.singletonList(KEY_PREFIX + name),
ID_PREFIX + Thread.currentThread().getId());
}
@Override
public void unlock() {
// 获取线程表示
String threadId = ID_PREFIX + Thread.currentThread().getId();
// 获取锁中标识
String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + name);
// 判断标识是否一致
if (threadId.equals(id)) {
// 释放锁
stringRedisTemplate.delete(KEY_PREFIX + name);
}
}
标签:释放,name,Redis,Lua,PREFIX,线程,stringRedisTemplate,分布式
From: https://www.cnblogs.com/Biang-blog/p/18329630