背景
业务中并没有遇到权重相同还需要考虑排序的场景。问题来自于某公司三面,我跟面试官说对Redis比较熟悉,结果对方问了这么一个问题,顿时有点卡住了。
解析
zset结构元素权重相同,如何排序?Redis官网给出了答案
When multiple elements have the same score, they are ordered lexicographically
当元素具有相同score时,他们按字典顺序排序。什么是字典顺序,推测应该是按照字典的索引排序,如果手上有本英文字典就好了,没有的话就回忆+验证一下吧。字典索引应该是下面的样子:
a
ab
ac
b
c
...
客户端验证一下
ZADD test 100 a
1
ZADD test 100 b
1
ZADD test 100 c
1
ZRANGE test 0 -1 withscores
a
100
b
100
c
100
初步验证,是按照a->b->c的顺序排序。如果不止一个字符呢?继续验证:
ZADD test 100 ab
1
ZADD test 100 ac
1
ZADD test 100 ad
1
ZRANGE test 0 -1 withscores
a
100
ab
100
ac
100
ad
100
b
100
c
100
由此可见,字典顺序便是从首字母开始比较,a在前,z在后,如果相同再比较第二个字母,以此类推。那么如果出现大写字母、或者数字呢。再次求证:
ZADD test 100 1
1
ZADD test 100 2
1
ZADD test 100 11
1
ZADD test 100 12
1
ZADD test 100 A
1
ZADD test 100 B
1
ZADD test 100 AB
1
ZADD test 100 AC
1
ZRANGE test 0 -1 withscores
1
100
11
100
12
100
2
100
A
100
AB
100
AC
100
B
100
a
100
ab
100
ac
100
ad
100
b
100
c
100
大写字母排在小写字母前面,数字排在大写字母前面。数字并没有按照大小排序,而是同样遵循从首位依次向后,按照0~9比较,0在前,9在后。
总结
字典排序这种比较方式让我联想起ASCII表。从小到大:依次是0-9, A-Z, a-z。哈哈。如果对字典顺序比较难以理解。可以采用更熟悉的ASCII表帮助理解。