我在redis上存储了一堆作业,每个作业都由一个特殊的键标识,并且哈希值作为包含一些信息的值。这些作业被拾取,计算,一旦完成,它们就会有success
字段,如果计算成功完成,则该字段设置为true
。我想填充其值哈希设置为success
的{{1}}键的所有键的列表。
e.g。 redis存储:
true
通过上面的示例,我想要一种简单有效的方法来扫描redis中的所有键及其成功字段,最后得到foo_key_1 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: true}
foo_key_2 => {bar_hash_key: bar_value, baz_hash_key: baz_value, success: false}
。
目前我的方法如下(在ruby伪代码中):
[foo_key_1]
问题,正如你可能猜到的那样,我在redis上有很多的密钥,虽然性能上的O(N)在性能方面相当缓慢,但由于它的迭代性质。我已经仔细研究了redis docs / commands,但是没有什么能成为我解决这个问题的潜在候选人更有效率,我不是redis guru,但它似乎相当简单,你把东西放进去拿出东西。我可能忽略了任何可能的矢量化操作吗?
非常感谢。
答案 0 :(得分:2)
如果不迭代所有键,则无法执行此操作,因为redis仅支持键提取。如果您碰巧知道必须查看的键的模式,则可以降低这种复杂性,即使在这种情况下,redis将在后台获取所有键(通过一些优化,因为它将批量获取它们http://www.rubydoc.info/github/redis/redis-rb/Redis:scan )。类似的东西:
$redis.scan_each(match: "foo*").to_a
您可以在此处找到如何编写自己的模式https://redis.io/commands/KEYS
但是,如果您可以控制键所使用的值,则可以使用一些值来提取一些值来帮助您进行此搜索,例如:
答案 1 :(得分:1)
要仅使用Redis有效地执行此操作,您必须保留更新的," Redis可查询的",SET或LIST成功/已完成的密钥。
从根本上讲,这听起来像你真正拥有的是一个工作队列(以及成功的第一份工作的第二个工作队列)。除非您特别希望自己实现这一点,否则您是否考虑过作业队列实现?