keys 和 mget 不是原子的?
keys and mget is not atomic?
我有一个案例:
# a = r.keys("test_*") ; a
{'test_1': '1', 'test_2': '2'}
# b = r.mget(a) ; b
['1', ''2]
但是test_1
可能会在mget
时超时。那么我怎样才能使 keys
和 mget
作为原子步骤来使
dict(zip(keys, r.mget(keys))
总能得到我想要的?
为了使这两个命令运行原子化,您可以使用lua脚本。
--atomic.lua
local keys = redis.call('keys', '*')
local result = {}
for idx, key in ipairs(keys) do
table.insert(result, key) -- insert key
table.insert(result, redis.call('get', key)) -- insert value
end
return result
但是,使用 KEYS
命令几乎总是一个坏主意,因为它可能会长时间阻塞 Redis。
我有一个案例:
# a = r.keys("test_*") ; a
{'test_1': '1', 'test_2': '2'}
# b = r.mget(a) ; b
['1', ''2]
但是test_1
可能会在mget
时超时。那么我怎样才能使 keys
和 mget
作为原子步骤来使
dict(zip(keys, r.mget(keys))
总能得到我想要的?
为了使这两个命令运行原子化,您可以使用lua脚本。
--atomic.lua
local keys = redis.call('keys', '*')
local result = {}
for idx, key in ipairs(keys) do
table.insert(result, key) -- insert key
table.insert(result, redis.call('get', key)) -- insert value
end
return result
但是,使用 KEYS
命令几乎总是一个坏主意,因为它可能会长时间阻塞 Redis。