【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();
    }
}
相关推荐
想用offer打牌25 分钟前
面试官问Redis主从延迟导致脏数据读怎么解决?
redis·后端·面试
Alluxio36 分钟前
Alluxio正式登陆Oracle云市场,为AI工作负载提供TB级吞吐量与亚毫秒级延迟
人工智能·分布式·机器学习·缓存·ai·oracle
武子康1 小时前
Java-204 RabbitMQ Connection/Channel 工作流程:AMQP 发布消费、抓包帧结构与常见坑
java·分布式·消息队列·rabbitmq·ruby·java-activemq
zhz52141 小时前
代码之恋(第十五篇:分布式心跳与网络延迟)
网络·分布式·ai·重构·vue·结对编程
墨白曦煜2 小时前
深入剖析 Redis 客户端:Sentinel 模式下的“寻址”与“感知”艺术
数据库·redis·sentinel
遇见火星2 小时前
Redis高可用-哨兵模式(Sentinel)
redis·sentinel
Lethehong2 小时前
【探索实战】Kurator分布式云原生平台快速上手与实战指南
分布式·云原生
画江湖Test2 小时前
分布式缓存穿透解决方案
分布式·缓存·电商系统·缓存解决方案
Lethehong3 小时前
【探索实战】Kurator分布式云原生平台全栈实践指南:从入门到企业级落地
分布式·云原生
Wnq100723 小时前
在去中心化的边缘计算机集群中部署分布式 CORBA 及其AGENT
分布式·去中心化·区块链