11

我正在学习redis,我有一个初学者问题。我知道 redis 就是关于键的!有什么方法可以查询/解析特定内容的键值吗?

假设我有键和一些 json 作为值。例如

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

如何查询所有具有颜色=红色的“值(jsons)?

select all values WHERE colour==red
4

1 回答 1

17

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

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

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

另请参阅 Didier Spezia 的这个答案

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

欧姆示例

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

首先声明您的 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
于 2013-10-10T07:49:49.340 回答