【Redis】Redis实现分布式锁

1. 基于Redis

1.1 加锁

java 复制代码
 setnx lockKey uniqueValue

1.2 解锁

基于Lua脚本保证解锁的原子性。Redis在执行Lua脚本时,可以以原子性的方式执行,确保原子性。

java 复制代码
if redis.call("get", keys[1]) == argv[1] then 
	return redis.call("del", keys[1])
else
	return 0
end

1.3 避免锁无法被释放

给key设置过期时间

set lockKey uniqueValue EX 3 NX

1.4 优雅续期

Redisson的分布式锁自带自动续期机制,提供专门用来监控和续期的Watch Dog看门狗,如果操作的共享资源的线程还未执行完的话,Watch Dog会不断延长锁的过期时间,进而保证锁不会因为超时而释放。

默认每过10秒,看门狗会将锁的超时时间设置为30秒。

2. Redisson

java 复制代码
RLock lock = redisson.getLock("myLock");
try {
	// 超时等待,锁自动释放
    // 尝试获取锁,最多等待100秒,锁自动释放时间为10秒
    if (lock.tryLock(100, 10, TimeUnit.SECONDS)) {
        // 临界区代码
        System.out.println("Got the lock!");
    }
} catch (Exception e) {
    e.printStackTrace();
} finally {
	// 锁被当前线程持有,才会进行释放锁
    if (lock.isHeldByCurrentThread()) {
        lock.unlock();
    }
}
相关推荐
ffqws_2 小时前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
六bring个六8 小时前
open Harmony中分布式软总线的学习任务清单
分布式·学习·c/c++·open harmony
wuqingshun3141598 小时前
说一下 Kafka 中关于事务消息的实现?
分布式·kafka
Leighteen10 小时前
Redis与MySQL双写一致性:从问题根源到工程落地
数据库·redis·mysql
手握风云-12 小时前
Redis:不只是缓存那么简单(十五)
数据库·redis·缓存
名字还没想好☜13 小时前
用 Redis + Redisson 实现分布式锁:从踩坑到生产可用
java·redis·分布式·junit·分布式锁·redisson
qiu_lovejun99813 小时前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq
董可伦14 小时前
Spark 源码 | SparkSubmitArguments 参数解析(三)
大数据·分布式·spark
ipad协议源码14 小时前
为何网站会出现的挂马?
junit·软件开发·开源源码
AI人工智能+电脑小能手15 小时前
【大白话说Java面试题 第172题】【07_Redis篇】第8题:`setnx` 做分布式锁存在的问题
java·redis·分布式锁·死锁·setnx