如何持有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
`)
我有以下 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
`)