首页 > 解决方案 > 为什么我不能在 redis 中的这个排序集上使用 ZRANGEBYLEX?

问题描述

在redis文档中,有这个例子ZRANGEBYLEX

ZADD myindex 0 0056:0028.44:90
ZADD myindex 0 0034:0011.00:832
ZRANGEBYLEX myindex [0056:0010.00 [0056:0030.00
1) "0056:0028.44:90"

这非常简单。

但是,如果我想将相同的技术应用于以下示例,

127.0.0.1:6379> zadd feedbacks 1 feedback1 2 feedback2 3 feedback3 1 feedback4
(integer) 4
127.0.0.1:6379> ZRANGEBYLEX feedbacks [feed [feed
(empty list or set)

我得到一个空集。

我希望看到四个值(feedback1to feedback4

为什么ZRANGEBYLEX我的测试样本失败了?

标签: redis

解决方案


它失败了,因为他们有不同的分数。ZRANGEBYLEX 仅适用于相同分数的子集。

https://redis.io/commands/ZRANGEBYLEX

当一个有序集合中的所有元素都以相同的 分数插入时,为了强制字典顺序,该命令返回有序集合中的所有元素在 key 处,其值介于 min 和 max 之间。

如果排序集中的元素有不同的分数,则返回的 元素是 unspecified

排序集具有在相同分数子集中按字典顺序排序的属性。这为他们提供了第二个用例,一个按字典顺序排序的集合,但在这种情况下,您添加了具有相同分数的所有元素。

所以,你必须选择如何使用你的排序集:

  • 按分数排序(使用相同分数排序的 lex,用于可预测的顺序)
  • 按字典顺序排序,所有元素给出相同的分数

你不能两者兼得。那么你需要两个排序集。


推荐阅读