Redis分布式锁的生产问题解决方案

AI-摘要
DeepSeek GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
Redis分布式锁的生产问题解决方案
liuzhihang使用方式
SET KEY VALUE TIME NX
DEL KEY
一般使用 NX, 只有在锁不存在的时候才加锁成功, 设置时间是为了锁永远得不到释放
存在问题及解决方法
-
A加锁, B释放
方法: Redisson 在tryLock时
1
2
3
4
5
6
7long threadId = Thread.currentThread().getId();
protected String getLockName(long threadId) {
return id + ":" + threadId;
}
// id 为 UUID会将当前 uuId+线程id写入到锁信息中, unlock时会校验是否是当前线程
-
A lock锁住之后, 设置了时间, 但是在时间内未完成, 导致锁自动释放, 然后B获取锁同时进行操作
方法: Redisson 在lock时会启动异步线程, 自动延期, 时间为 lockWatchdogTimeout(默认30s)
1
2
3
4Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {
省略...
}, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS);看源码是延时 1/3的时间后开始, 就是每次1/3时间的时候延期一次. 这样理解不知道对不对
-
主从下, A 加锁 Master 成功后未同步给Slave 便宕机, 导致 B发现未加锁
方法: 可以修改源码, 同时加锁Master-Slave 才算加锁成功 -
集群状态下可以参考RedLock(红锁), 加锁多台机器, 多数成功才算成功(locks.size()/2 + 1)
1
2
3
4
5public class RedissonRedLock extends RedissonMultiLock {
public RedissonRedLock(RLock... locks) {
super(locks);
}
}
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果