在Redis中使用WHERE子句来查询值

时间:2013-10-10 01:56:16

标签: redis

我正在学习redis,我有一个初学者的问题。我知道redis就是钥匙!有没有办法查询/解析特定值的键的值?

假设我有键和一些json作为值。 e.g。

key1 = {"id":"1", "colour":"red}
key2 = {"id":"2", "colour":"green}
key3 = {"id":"3", "colour":"red}

如何查询具有color = red?

的所有“值(jsons)”
select all values WHERE colour==red

1 个答案:

答案 0 :(得分:12)

您需要的是colour字段上的反向索引,即地图colour -> {keyA, ..., keyB},例如"red" -> {key1, key2}

您可以使用Redis set维护此索引,如Ohm所述:

  

Redis中的一个集合是一个无序列表[...]它由Ohm内部使用,用于跟踪每个模型的实例以及生成和维护索引。

请参阅Didier Spezia的这篇answer

总结:以您查询的方式存储数据

欧姆示例

以下是欧姆在幕后发生的事情。

首先声明您的Ohm模型,并将colour属性编入索引,因为您要查询它:

require "ohm"

class Doc < Ohm::Model
  attribute :colour
  index :colour
end

然后创建一些文档:

ruby> Doc.create(:colour => "red")
ruby> Doc.create(:colour => "green")
ruby> Doc.create(:colour => "red")

在此步骤中检查存储在相关索引中的Ohm:

redis> SMEMBERS "Doc:indices:colour:red"
1) "1"
2) "3"

再创建一个红色文档:

ruby> Doc.create(:colour => "red")

重新检查索引:

redis> SMEMBERS "Doc:indices:colour:red"
1) "1"
2) "3"
3) "4"

索引已更新以反映最后一条记录。

现在您可以有效地查询文档:

ruby> Doc.find(:colour => "red").each {|d| puts d.id}
1
3
4