【发布时间】: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:*”键的集合吗?
【问题讨论】:
使用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:*”键的集合吗?
【问题讨论】:
其实,如果你只是想在 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 命令用于构建您感兴趣的所有集合的并集结果。它还过滤掉结果中的重复项(在前面的示例中没有这样做)。
【讨论】:
work 创建一个集合,因为应用程序逻辑需要在每个集合中都有一些唯一性,所以这个例子就是这样放置的。我想我必须重新考虑一下。
嗯,我可以通过$redis.keys("work:*") 得到它。
【讨论】: