Redis——》实现分布式锁

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

Redis——》实现分布式锁

  • 一、最简单的实现
    • 1、实现:SETNX加锁+DEL释放锁
    • 2、优点
    • 3、缺点
  • 二、最严谨的实现
    • 1、实现:SET加锁 + 唯一标识 + 过期时间 + Lua脚本释放锁
      • (1)加锁 + 唯一标识 + 过期时间
      • (2)操作共享资源
      • (3)Lua脚本释放锁
    • 2、优点
  • 三、Java实现分布式锁
  • 四、分布式锁可能遇到的问题

一、最简单的实现

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——》锁被别人释放

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

你可能感兴趣的:(redis,锁,分布式,过期,lua)