分布式锁的基本原理和基于lua脚本的实现(Redisson)
为了确保分布式锁可用,我们要确保锁的实现同时满足以下四个条件:
- 互斥性。在任意时刻,只有一个客户端能持有锁。
- 不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。
- 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。
- 加锁和解锁必须具有原子性
而这四个条件,Redisson实现的分布式锁都可以满足,同时Redisson实现的分布式锁,还是可重入的。
@Service
public class TestServiceImpl implements TestService {@AutowiredRedissonClient redissonClient;@Overridepublic void incrWithLock() {// 获取锁RLock redisLock = redissonClient.getLock("lock:number");try {// 加锁,失败会在这里阻塞redisLock.lock();// 加锁成功,代码执行到这里RBucket<Integer> bucket = redissonClient.getBucket("number");// 获取key为number的value值int number = bucket.get();// 自增1number++;// 在放回redisbucket.set(number);} finally {// 释放锁redisLock.unlock();}}
}