【问题标题】:Redis ZRANGEBYLEX matching secondary indexesRedis ZRANGEBYLEX 匹配二级索引
【发布时间】:2020-01-20 11:19:37
【问题描述】:

我有一个代表每个用户当前分数的索引。 我想找到所有得分相同的用户。

假设输入如下,如何只检索用户1和2?

ZADD users 0 1:10
ZADD users 0 2:10
ZADD users 0 3:5

我希望做类似docs 中提到的事情,但我不能使用该键作为我的索引,因为它太大(对于我更改为 1、2、3 的帖子,所以这不是问题),这就是我将其设置为 0 的原因。

我认为该命令可能类似于 ZRANGEBYLEX users [0:10 (:10 但它返回所有 3。

1) "1:10"
2) "2:10"
3) "3:5"

【问题讨论】:

  • ZADD 命令语法为ZADD key score member

标签: redis


【解决方案1】:

要查询二级索引,您必须在成员名称中将二级索引放在首位(作为前缀)。

ZADD users 0 10:1
ZADD users 0 10:2
ZADD users 0 5:3

现在,查询 ZRANGEBYLEX users [10: (10; 返回:

1) "10:1"
2) "10:2"

【讨论】:

  • 我希望您可以在不反转的情况下做到这一点,因此我可以选择单个用户或分数列表。我想我将不得不为用户详细信息创建一个 HMSET 以及为分数比较创建排序集。
【解决方案2】:

我能够为这个问题想出一个解决方案,可以进一步细化为:

检索具有给定分数的所有用户或检索单个用户的单个分数。

我确定的是,使用命名空间 users 不足以描述分数和用户 ID。当使用 2 个不同的键时,显然可以获得一个范围或单个值。缺点是我希望的写入次数的两倍,但这对我来说总体上不是很多开销,也是我发现正确检索分数和用户的唯一方法。

ZADD score:users 0 10:1
ZADD score:users 0 10:2
ZADD score:users 0 5:3

ZADD users:score 0 1:10
ZADD users:score 0 2:10
ZADD users:score 0 3:5

ZRANGEBYLEX users:score [1: [1:\xff # "1:10" 
ZRANGEBYLEX score:users [10: [10:\xff # "10:1" "10:2"

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多