我一直在尝试使用扫描从 Redis 获取所有密钥,同时也避免使用 count。问题是,当有许多键(例如 1000000(时,扫描SCAN 0 MATCH *
比以下速度慢得多:
KEYS *
或
SCAN 0 MATCH * COUNT 1000000
我读过一篇文章,说使用 Lua 以获得更好的性能。有人可以帮我解决这个问题吗?我想使用Lua来处理密钥数量超过 1M 的所有密钥的扫描。我正在使用 npm 的 redis 包。
将SCAN
与COUNT 1000000
一起使用比使用KEYS
稍微差一点。
Redis 是单线程的。引入SCAN
的原因之一是允许通过一次执行几个步骤来遍历所有密钥而不会长时间阻塞服务器。
默认值为 10。这意味着该命令将带回或多或少的 10 个密钥,如果密钥在哈希槽中稀疏填充,或者被 MATCH 模式过滤掉,则可能会更少。如果某些密钥共享哈希槽,则可能会更多。无论如何,执行的工作与 COUNT 参数成正比。
这并不意味着禁止KEYS
命令(或具有大COUNT
数的SCAN
(。如果您对服务器在运行所需的时间内被阻止感到满意,请继续。
有关更多详细信息和Lua示例,请参阅REDIS 中 SCAN/HSCAN 命令的 COUNT 值是否有任何建议值?
是否可以将运行在一个 Redis 实例 (6379( 中的两个单独的数据库(例如 db0、db1(合并为一个数据库 (db0(? 和 如何在 redis 中获取所有集合?我已经发布了如何在Lua脚本中使用SCAN
来实现自定义要求的示例。
您可能会发现Redic 'SCAN':如何在可能匹配的新密钥之间保持平衡,并确保在合理的时间内最终结果? 有意思。
如何在 Redis 中使用 Lua 与 node.js:执行 redis eval 命令以在 nodeJS 中运行 Lua 脚本
找到相关的解决方案。请通过此链接。 不建议使用密钥,如果您浏览文档,您可以看到这一点。虽然这是表演,但为了理解更深层次的知识,没有别的。最好的方法是使用Lua脚本,这是可取的,而且性能也非常好。如果你看到评论,你也会了解差异,我猜。 KEY、SCAN 、Lua 脚本的性能:
- 按键:最快的方法
- 扫描速度:~1.5 倍
- 带 lua 的扫描:~慢 2.4 倍
- 带 lua 和附加检查的扫描:~4.3 倍慢
- 带 lua 的键:慢 ~18 倍
对我来说,理解Lua的语法是相当困难的。因此,这是帮助理解语法的代码。
在 Lua 脚本中扫描而不计数:
local ans, has, cursor = {}, {}, "0"; repeat local t = redis.call("SCAN", cursor, "MATCH", KEYS[1], "COUNT", 1000000000); local list = t[2]; for i = 1, #list do local s = list[i]; if has[s] == nil then has[s] = 1; ans[#ans + 1] = s; end; end; cursor = t[1]; until cursor == "0"; return #ans; --or return ans;