【问题标题】:How to get the collection based upon the wildchar redis key using redis-rb gem?如何使用 redis-rb gem 根据 wildchar redis 键获取集合?
【发布时间】:2012-02-01 07:35:21
【问题描述】:

使用redis-rb gem 创建的redis 对象。

$redis = Redis.new
$redis.sadd("work:the-first-task", 1)
$redis.sadd("work:another-task", 2)
$redis.sadd("work:yet-another-task", 3)

有什么方法可以获取具有“work:*”键的集合吗?

【问题讨论】:

    标签: ruby rubygems redis


    【解决方案1】:

    其实,如果你只是想在 Redis 上构建一个集合,你只需要一个键。

    您提供的示例构建了 3 个不同的集合,每个集合都有一个项目。这可能不是你想做的。示例可以改写为:

    $redis = Redis.new
    $redis.sadd("work","the-first-task|1")
    $redis.sadd("work", "another-task|2")
    $redis.sadd("work", "yet-another-task|3")
    

    要检索此集合的所有项目,请使用以下代码:

    x = $redis.smembers("work")
    

    如果您需要跟踪集合中项目的顺序,最好使用列表而不是集合。

    在任何情况下,KEYS 命令的使用都应仅限于工具/调试代码。由于其线性复杂性,它不适合在实际应用中使用。

    如果您确实需要构建多个集合,并从所有这些集合中检索项目,最好的方法可能是引入一个新的“目录”集合来跟踪与这些集合对应的键。

    例如:

    $redis = Redis.new
    $redis.sadd("catalog:work", "work:the-first-task" )
    $redis.sadd("catalog:work", "work:another-task" )
    $redis.sadd("work:the-first-task", 1)
    $redis.sadd("work:the-first-task", 2)
    $redis.sadd("work:another-task", 3)
    $redis.sadd("work:another-task", 4)
    

    高效检索所有项目:

    keys = $redis.smembers("catalog:work")
    res = $redis.pipelined do
        keys.each do |x|
           $redis.smembers(x)
        end
    end
    res.flatten!(1)
    

    这个想法是执行第一个查询以获取 catalog:work 的内容,然后使用流水线迭代结果以获取所有数据。我不是 Ruby 用户,所以可能有更惯用的方式来实现它。

    如果您要检索的集合数量有限,并且您不关心项目的所有权(每个项目存储在哪个集合中),则可以使用另一个更简单的选项

    keys = $redis.smembers("catalog:work")
    res = $redis.sunion(*keys)
    

    这里 SUNION 命令用于构建您感兴趣的所有集合的并集结果。它还过滤掉结果中的重复项(在前面的示例中没有这样做)。

    【讨论】:

    • 谢谢,实际上我只是增加了每个收藏的价值以使问题变得简单。但正如你所说,是的,它将创建 3 个集合集。稍后我将在每个集合中添加更多值。我不能只用键 work 创建一个集合,因为应用程序逻辑需要在每个集合中都有一些唯一性,所以这个例子就是这样放置的。我想我必须重新考虑一下。
    • 我已经更新了我的答案以添加一个示例来检索 n 个集合的内容。希望对您有所帮助...
    【解决方案2】:

    嗯,我可以通过$redis.keys("work:*") 得到它。

    【讨论】:

    • 注意:这是一个线性运算。如果您有数百万个键,它将冻结整个 Redis 实例几秒钟。
    • @DidierSpezia,那么实现这一目标的正确方法是什么?
    • 要处理集合,请参阅我的一般答案。现在,如果您真的想获取密钥的子集(例如 KEYS work:*),那么您不应该直接这样做。您必须维护一个包含您感兴趣的键的单独集合(例如一个集合),然后阅读此集合。
    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2021-11-08
    • 2011-11-19
    • 2011-08-29
    相关资源
    最近更新 更多