【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();
    }
}
相关推荐
长安城没有风10 分钟前
从入门到精通【Redis】Redis 典型应⽤ --- 分布式锁
数据库·redis·分布式
爬山算法4 小时前
Redis(69)Redis分布式锁的优点和缺点是什么?
数据库·redis·分布式
2401_837088505 小时前
Redis通用命令
数据库·redis·缓存
zl9798995 小时前
Redis-缓存问题(穿透、击穿、雪崩)
redis
virtuousOne9 小时前
Kafka基础
分布式·kafka
虫小宝9 小时前
Java分布式架构下的电商返利APP技术选型与架构设计实践
java·分布式·架构
007php0079 小时前
百度面试题解析:Zookeeper、ArrayList、生产者消费者模型及多线程(二)
java·分布式·zookeeper·云原生·职场和发展·eureka·java-zookeeper
waving-black10 小时前
windows系统下安装测试kafka
windows·分布式·kafka
摇滚侠10 小时前
Spring Boot 3零基础教程,yml文件中配置和类的属性绑定,笔记15
spring boot·redis·笔记
深思慎考10 小时前
RabbitMQ 入门:基于 AMQP-CPP 的 C++ 实践指南与二次封装
开发语言·c++·分布式·rabbitmq·api