【问题标题】:Use WHERE clause in Redis to query value在 Redis 中使用 WHERE 子句查询值
【发布时间】:2014-10-14 13:03:03
【问题描述】:

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

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

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

如何查询所有“color=red”的值(json)?

select all values WHERE colour==red

【问题讨论】:

    标签: redis


    【解决方案1】:

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

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

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

    另请参阅 Didier Spezia 的 answer

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

    欧姆示例

    这是 Ohm 在幕后发生的事情。

    首先声明您的 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
    

    【讨论】:

    • 这意味着如果我得到另一个 key4 = {"id":"4", "colour":"red} 我还需要更新 "red" -> {key1, key3, key4} ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2021-11-16
    • 2017-01-05
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多