如何持有redis的锁?

How to hold a lock to redis?

我有以下 NodeJS 代码,仅当列表不存在时才初始化列表。

if (redisClient.lLen('mylist') === 0) {
    let initialVal = Array(100).fill(-1)
    await redisClient.rPush('mylist', initialVal)
}

如果上面的代码运行同时被多个实例调用,那么由于竞争条件await redisClient.rPush('mylist', initialVal)可能运行多次。

我只希望上述代码通过 NodeJS 实例之一 运行 一次来初始化列表。 如何使上述代码成为原子操作?

回答

我格式化了 Stephen Jennings 给出的答案(谢谢!)

redisClient.EVAL(`
    if redis.call("LLEN", "mylist") == 0
    then
    for i = 1,100,1 do
        redis.call("RPUSH", "mylist", "-1")
    end
    end
`)

虽然我不完全理解用例,但您可能想查看 RPUSHX command 以确保您只添加到存在的列表中。

使用 Lua 脚本以原子方式进行检查和插入。

redisClient.EVAL(`
if redis.call(“LLEN”, “mylist”) == 0
  for i = 1,100,1
    redis.call(”RPUSH”, ”mylist”, ”-1”)
  end
end
`)