09 redis分布式锁有用过吗?

vvEcho 2024-01-20 14:08:37
Categories: Tags:

redis分布式锁我们用的是Redisson,它的实现原理是:

我们要对某个key加锁,redisson在集群环境下会分配一个节点,先判断这个key是否会存在

如果不存在则新增key并设置过期时间默认30s

然后内置的看门狗机制会每隔10秒查看这个锁是否存在,如果10秒后加的锁还存在就续期;

直到不存在后证明锁已被释放;如果锁被释放则删除key;底层是lua脚本执行的,所以能保证执行过程的原子性;

redisson加锁时有两种方式,阻塞式和非阻塞式,代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
try {
lock.lock();
try {
// 执行业务逻辑
} finally {
lock.unlock();
}
} catch (InterruptedException e) {
// 处理中断(如恢复中断状态、记录日志)
Thread.currentThread().interrupt();
}

RLock lock = redisson.getLock("myLock");
if (lock.tryLock()) { // 非阻塞,立即返回是否成功
try {
// 执行业务逻辑(仅在获取锁时执行)
} finally {
lock.unlock();
}
} else {
// 处理未获取锁的情况(如记录日志、返回降级结果)
}

RLock lock = redisson.getLock("myLock");
// 尝试获取锁,最多抢锁10秒,这期间线程会阻塞在这里;10秒内抢到锁,锁持有5秒后自动释放
// 这里即使会自动释放,也应该在finally中手动释放锁 例如5秒自动释放 但是业务逻辑实际只用了1秒
boolean isLocked = lock.tryLock(10, 5, TimeUnit.SECONDS);
if (isLocked) {
try {
// 执行业务逻辑(需在 5 秒内完成)
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}