Redis分布式锁

加锁

//Redis 2.6.12 之后
SET lock_1 val EX 30 NX

解锁

lua 脚本

// 判断锁是自己的,才释放
if redis.call("GET",KEYS[1]) == ARGV[1]
then
    return redis.call("DEL",KEYS[1])
else
    return 0
end

流程

加锁:SET lock_key $unique_id EX $expire_time NX
操作共享资源
释放锁:Lua 脚本,先 GET 判断锁是否归属自己,再 DEL 释放锁

常见问题

基于 Redis 的实现分布式锁,前面遇到的问题,以及对应的解决方案:

死锁:设置过期时间
过期时间评估不好,锁提前过期:守护线程,自动续期
锁被别人释放:锁写入唯一标识,释放锁先检查标识,再释放

posted on 2021-06-11 15:13  aworkstory  阅读(29)  评论(0编辑  收藏  举报

导航