#

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 方法。


本文访问量

本站总访问量

本站总访客数