分布式锁常见的手段有:基于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