推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Redis】
总结——》【Kafka】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
总结——》【Linux】
总结——》【MongoDB】
总结——》【Elasticsearch】
Redis——》实现分布式锁
一、最简单的实现
1、实现:SETNX加锁+DEL释放锁
// 加锁:如果 key 不存在,才会设置它的值,否则什么也不做
SETNX lock_key 1
// 业务逻辑
DO THINGS
// 释放锁,删除key
DEL lock_key
2、优点
实现了加锁和释放锁
3、缺点
参考链接:
Redis——》死锁
Redis——》锁被别人释放
容易造成死锁
二、最严谨的实现
1、实现:SET加锁 + 唯一标识 + 过期时间 + Lua脚本释放锁
(1)加锁 + 唯一标识 + 过期时间
SET lock_key unique_value EX expire_time NX
(2)操作共享资源
(3)Lua脚本释放锁
GET判断锁是否归属自己,再DEL释放锁
//Lua脚本语言
//释放锁,先判断这把锁是否归自己持有,比较unique_value是否相等,避免误释放
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
2、优点
实现了加锁和释放锁,不会出现死锁和释放别人的锁。
三、Java实现分布式锁
四、分布式锁可能遇到的问题
可能遇到的问题 | 解决方案 |
---|---|
死锁 | 设置过期时间 |
过期时间评估不好,锁提前过期 | 守护线程,自动续期 |
锁被别人释放 | 锁写入唯一标识,释放锁时先检查标识,再释放 |