我有很多分析数据,我正在添加到redis。我计划逐步将数据从redis移到我的数据库中。
我知道我可以使用KEYS [the_key]:*
来获取匹配的所有密钥。例如,我可以这样做以获得以下内容:
127.0.0.1:6379> KEYS c_Track:*
1) "c_Track:6c93a5c1-77e9-4c4a-9232-bf182713a02e"
2) "c_Track:2c9d99c2-af37-4de9-ac64-b48f339e97a9"
3) "c_Track:9e7fd190-86d9-4b4a-9a70-7bf4c7768eef"
4) "c_Track:7f2d2e98-7440-4fd7-a80a-2af309ab15a4"
是否有推荐的方法轻松获取这些值?我可以拿到钥匙,但我怎么能得到所有的价值呢?我可以遍历键来获取值,但是有一些单步方法可以做到这一点吗?
我也知道我不应该使用密钥,但这只是一个例子。感谢
由于
答案 0 :(得分:4)
我也知道我不应该使用密钥
所以不要。请改用SCAN
。
是否有一些一步到位的方法?
不,不是作为核心Redis命令,但考虑到需要使用服务器端Lua脚本实现这一点非常简单。例如,假设您的值是字符串,您可以执行以下操作:
--remote-name-all
假设此脚本保存在“scan.lua”下,您可以按如下方式运行它:
local cursor = tonumber(ARGV[1])
local pattern = ARGV[2]
local scan = redis.call('SCAN', cursor, 'MATCH', pattern)
for i, v in ipairs(scan[2]) do
local val = redis.call('GET', v)
scan[2][i] = { v, val }
end
return scan
要扫描整个键空间,请使用返回的光标调用脚本,直到它返回0.
注意:
1)如果您的密钥类型不同,则应相应更改脚本(例如https://github.com/itamarhaber/redis-lua-scripts/blob/master/scanfetch.lua)。
2)虽然这个脚本违反了在脚本中生成密钥名称的常见建议,但仍然可以安全运行,因为SCAN返回服务器密钥空间中的密钥(无论是单实例还是集群)。