【问题标题】:Redis - Sort and filter hash store using string attributeRedis - 使用字符串属性对哈希存储进行排序和过滤
【发布时间】:2020-06-15 16:32:14
【问题描述】:

我有一个类似于Item:<id> 的redis 哈希存储,属性为name。我想通过 name 属性的前缀过滤哈希存储。 我想要做的是将名称(小写)存储在一个名为Item:::name 的单独 Z 集中,同时将分数设置为 0。通过这样做,我可以使用 ZRANGEBYLEX 成功获得所需的结果。我无法将结果映射回原始Items。我应该如何实施这样的事情?

我见过多个 Redis 的自动完成示例,它们需要相同的功能,但没有将单词链接回实际的项目(在这种情况下是哈希)

【问题讨论】:

    标签: redis


    【解决方案1】:

    sorted sets 中,member 不能重复,它必须是唯一的。因此具有相同名称的不同用户会导致问题。

    我的建议需要应用层编码来解析响应数组并执行hash命令(它会像二级索引);

    127.0.0.1:6379> HSET user:1 name jack
    (integer) 1
    127.0.0.1:6379> HSET user:2 name john
    (integer) 1
    127.0.0.1:6379> HSET user:3 name keanu
    (integer) 1
    127.0.0.1:6379> HSET user:4 name jack
    (integer) 1
    127.0.0.1:6379> ZADD item:names 0 jack::user:1 0 john::user:2 0 keanu::user:3 0 jack::user:4
    (integer) 4
    127.0.0.1:6379> ZRANGE item:names 0 -1 WITHSCORES
    1) "jack::user:1"
    2) "0"
    3) "jack::user:4"
    4) "0"
    5) "john::user:2"
    6) "0"
    7) "keanu::user:3"
    8) "0"
    127.0.0.1:6379> ZRANGEBYLEX item:names [jack [jo
    1) "jack::user:1"
    2) "jack::user:4"
    

    最后你会得到name::hash-key 格式化的数组元素。在应用层,如果您使用::(任何其他字符串,例如!!!|| 等)将每个元素分成两个子字符串,您将拥有user:1user:4

    127.0.0.1:6379> HGETALL user:1
    1) "name"
    2) "jack"
    127.0.0.1:6379> HGETALL user:4
    1) "name"
    2) "jack"
    127.0.0.1:6379>
    

    【讨论】:

    • 谢谢,这是有道理的。虽然我试图找到一种无需应用程序层处理的方法,但似乎这是唯一的方法。
    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多