锁 #
setnx #
- setnx
- msetnx
- hsetnx
SET key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
那么删除锁的正确姿势之一,就是可以使用 lua 脚本,通过 redis 的 eval/evalsha 命令来运行:
-- lua删除锁:
-- KEYS和ARGV分别是以集合方式传入的参数,对应上文的Test和uuid。
-- 如果对应的value等于传入的uuid。
if redis.call('get', KEYS[1]) == ARGV[1]
then
-- 执行删除操作
return redis.call('del', KEYS[1])
else
-- 不成功,返回0
return 0
end
通过 lua 脚本能保证原子性的原因说的通俗一点:
就算你在 lua 里写出花,执行也是一个命令 (eval/evalsha) 去执行的,一条命令没执行完,其他客户端是看不到的。
那么既然这么麻烦,有没有比较好的工具呢?就要说到 redisson
了。
redLock #
并非是一个工具,而是 redis 官方提出的一种分布式锁的算法。
redisson #
Redisson 是 java 的 redis 客户端之一,提供了一些 api 方便操作 redis。
redisson 就实现了 redLock 版本的锁。也就是说除了 getLock 方法,还有 getRedLock 方法。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。