Redis实现分布式锁的原理是什么?采用的什么存储结构?如何实现分布式锁?
Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则 SET)的简写。
# 添加锁,NX是互斥、EX是设置超时时间
SET lock value NX EX 10
# 释放锁,删除即可
DEL key
当线程获取锁成功后,设置了过期时间,如果业务执行的时间太长了,超过了锁的失效时间,锁就会自动释放了,但是业务还没有执行完成,这时有其他线程就可以获取锁成功。此时,就无法保证业务执行的原子性了。
加锁、设置过期时间等操作都是基于lua脚本完成的
public void redisLock() throws InterruptedException {
//获取锁 (重入锁),执行锁的名称
RLock lock = redissonClient.getLock("heimalock");
try {
//尝试获取锁,参数分别是:获取锁的最大等待时间(期间会重试),锁自动释放时间,时间单位
// boolean isLock = lock.tryLock(10,30, TimeUnit.SECONDS);
boolean isLock = lock.tryLock(10, TimeUnit.SECONDS);
//判断是否获取成功
if (isLock) {
System.out.println("执行业务...");
}
} finally {//释放锁
lock.unlock();
}
}
public void add1() {
RLock lock = redissonClient.getLock("heimalock");
boolean isLock = locktryLock();
//执行业务
add2();
//释放锁
lock.unlock();
}
public void add2() {
RLock lock = redissonClient.getLock("heimalock");
boolean isLock = lock.tryLock();
// 执行业务
// 释放锁
lock.unlock();
}
利用的hash结构记录的线程id和重入次数