如何从redis获取所有键/值以将它们插入SQL db?

时间:2018-05-05 15:42:39

标签: redis

我有很多分析数据,我正在添加到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"

是否有推荐的方法轻松获取这些值?我可以拿到钥匙,但我怎么能得到所有的价值呢?我可以遍历键来获取值,但是有一些单步方法可以做到这一点吗?

我也知道我不应该使用密钥,但这只是一个例子。感谢

由于

1 个答案:

答案 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返回服务器密钥空间中的密钥(无论是单实例还是集群)。