Redis:获取队列中具有等于某些条件值的所有密钥

时间:2017-01-04 09:38:50

标签: ruby redis

我在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,但它似乎相当简单,你把东西放进去拿出东西。我可能忽略了任何可能的矢量化操作吗?

非常感谢。

2 个答案:

答案 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

但是,如果您可以控制键所使用的值,则可以使用一些值来提取一些值来帮助您进行此搜索,例如:

  • 让我们用这个表格制作每个键" foo#{your_number}:#{success_bool}"
  • 当搜索使用此模式" foo *:1"

答案 1 :(得分:1)

要仅使用Redis有效地执行此操作,您必须保留更新的," Redis可查询的",SET或LIST成功/已完成的密钥。

从根本上讲,这听起来像你真正拥有的是一个工作队列(以及成功的第一份工作的第二个工作队列)。除非您特别希望自己实现这一点,否则您是否考虑过作业队列实现?