Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。
获取锁:
# 添加锁,NX是互斥、EX是设置超时时间
SET lock value NX EX 10
释放锁
# 释放锁,删除即可
DEL key
redission实现的分布式锁
执行流程
在redisson的分布式锁中,提供了一个WatchDog(看门狗),一个线程获取锁成功以后, WatchDog会给持有锁的线程续期(默认是每隔10秒续期一次)
示例代码
public void redisLock() throws InterruptedException{
// 获取锁,执行锁的名称
RLock lock = redissonClient.getLock("lock");
try {
boolean isLock = lock.trylock(10, TimeUnit.SECONDS);
if (isLock){
System.out.println("执行业务");
}
}finally {
lock.unlock();
}
}
主从一致性
如果主节点宕机了,redis的哨兵模式会选择一个从节点作为主节点,如果有新的线程,会直接请求新的主节点,这样新的线程也会获得锁,这样会丧失锁的特性,造成脏数据。
RedLock(红锁):不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁
(n / 2 + 1),避免在一个redis实例上加锁。
缺点:高并发环境下,性能变差
可以使用redisson提供的红锁来解决,但是这样的话,性能就太低了,如果业务中非要保证数据的强一致性,建议采用zookeeper实现的分布式锁