分布式锁的主要实现、Redis 获取分布式锁、Redis释放分布式锁、超时问题

参考

https://blog.csdn.net/sdmxdzb/article/details/78410494

分布式锁的主要实现

  • 数据库
  • Memcached(add 命令)
  • Redis(setnx 命令)
  • Zookeeper(临时顺序节点)

Redis 获取分布式锁

jedis.set (String key, String value, String nxxx, String expx, int time)

  • key:使用 key 来代表锁,因为 key 是唯一的

  • value:可以传 requestId,使用 requestId 来标识 是哪一个redis客户端,在释放锁时能作为依据。可以使用 UUID.randomUUID().toString() 方法生成 requestId。

  • nxxx:这个参数可以传 NX,意思是 SET IF NOT EXIST

  • expx:这个参数可以传 PX,表示给这个key加一个过期时间,具体时间由第五个参数(time 参数)给出。

  • time:与第四个参数相呼应,代表key的过期时间。

也可像下文一样 使用 lua脚本 实现

Redis 释放分布式锁

String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

第一行代码为一个简单的 Lua脚本 代码,Lua脚本可以保证 原子性。
第二行代码,eval() 方法将 Lua 代码交给Redis执行。将参数KEYS[1] 赋值为 lockKey,ARGV[1] 赋值为 requestId。

首先获取锁对应的 value 值,检查是否与 requestId 相等,如果相等则释放锁。

超时问题

如果 redis 加了锁后,在加锁和释放锁之间的逻辑处理太长,以至于超出了锁的超时时间,将会导致出错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值