Redis——》实现分布式锁

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】
    总结——》【Linux】
    总结——》【MongoDB】
    总结——》【Elasticsearch】

一、最简单的实现

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实现分布式锁

参考链接:
Java——》实现分布式锁
Java——》使用Redisson实现分布式锁

四、分布式锁可能遇到的问题

参考链接:
Redis——》死锁
Redis——》如何评估锁过期时间
Redis——》锁被别人释放

可能遇到的问题解决方案
死锁设置过期时间
过期时间评估不好,锁提前过期守护线程,自动续期
锁被别人释放锁写入唯一标识,释放锁时先检查标识,再释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值