基于redis单节点实现分布式锁

本文介绍了如何利用Redis单节点实现分布式锁,探讨了其存在的弊端,如不能容忍节点宕机。在三节点Sentinel集群环境下,通过jedisSentinelPool确保连接始终指向master。提供了Lua脚本用于解锁,并展示了获取和释放锁的核心代码。文中还提到,由于使用了'NX'参数,避免了线程间锁的误释放问题。
摘要由CSDN通过智能技术生成

分布式锁常见的手段有:基于redis 实现和基于zookeeper实现,小编这里简单的介绍一下采用单节点的redis来实现分布式锁。

基于redis 单节点实现分布式锁
这里需要声明一下,redis单节点实现的锁存在的弊端有,节点的机器不允许宕机,应该能够想的通。如果各位程序员采用的是集群模式下的redis, 那么用此分布式锁,是会发生 多个客户端都会拥有锁,如果你的业务不强制限制这点,可以继续使用。

楼主环境:
三个节点的sentinel集群 , redis一主一从,java 使用的是 jedisSentinelPool 作为redis 的数据库连接池。

基础铺垫
因为公司业务的发展时间较短,并发量以及缓存的数据量不是很大,一核一G的虚拟机单节点redis 的qps 读写大约在1-3万,公司系统是四核四G,一主一从完全够用,考虑使用sentinel 来实现99.99%高可用。因为jedisSentinelPool就是通过哨兵来获取主节点的HostAndPost , 所以该模式下 我们能够保证 java中获取的连接一直是:master的连接,即使master宕机了,slave升级到master,我们的分布式锁还是可继续使用,我们的业务不强制要求,锁只能有一个线程持有。

准备:
lua 脚本 unlock.lua 放到你项目的资源目录下,一般为:src/main/resource . 脚本内容如下:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

本地线程 和 redis 固定key :

private static final String LOCK_NODE ="LOCK";
private static ThreadLocal<String> local = new ThreadLocal<>();

获取锁的核心代码:

   /**
     * agui 获取分布式锁
     * 弊端:只能是redis 单节点好用  所以要保证 该节点不能挂掉
     * @return
     */
    public static boolean 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值