redis

本文介绍Redis作为分布式锁的实现原理,包括使用setnx命令的基本方案及其存在的问题,并提出通过设置超时时间解决服务宕机导致的锁无法释放的问题。最后介绍了使用Lua脚本保证锁释放的原子性以及RedLock官方方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis:

实际上是一个大map,数据模型为key,value,而且键值可以设置超时时间

 

redis实现分布式锁:

(1)方案1

利用命令 : setNx key value

存在key值则设置值,否则失败

释放锁 del key

获取A锁: setNx A  "xxxxx"

func GetLock(A string) bool {
    for {
        if redis.SetNx(A, "uuid") {
            return true
        }

    }
}

 

(2)上述方案存在问题,如果某个客户端获取锁后,所在的实例服务宕机了

解决方案:设置超时时间

官方demo:

set key value [EX seconds] [PX milliseconds] [NX|XX]

EX seconds:设置失效时长,单位秒

PX milliseconds:设置失效时长,单位毫秒

NX:key不存在时设置value,成功返回OK,失败返回(nil)

 

比如锁节点:/dir1/dir2

客户端获取uuid:(为啥+这个,者释放锁的时候del命名因为网络延迟等没有执行导致的超时)

获取锁命令:

set /dir1/dir2 uuid  超时时间 NX 

 

释放锁命令:(需要用rua脚本,保证原子性,确保这个键锁是由当前客户端设置的)

下面是lua脚本,KEYS[1]是/dir1/dir2, ARGV[1]是uuid

if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end

 

(3)redLock  官方推出的最终方案,对redis的部署方式有要求

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值