redis常用数据类型之zset

200 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

本文主要讲解redis常用命令之zset的相关知识。

数据结构

redis的zset与set很相似,前面我们介绍set的时候,知道了set是一个无序集合,而zset则是一个有序集合。同样的,都不能存在相同的元素。

比较重要的不同点在于,zset的每个元素都有一个评分score,用来对集合中的元素进行排序,且评分是可以重复的。

用户根据评分(score)或者索引(position)来获取一个范围的元素。

zset底层使用了两种数据结构

  • hash表

    用来保存元素的value和得分score,可以保证value的唯一性,又可以通过元素value快速找到相应的得分。

  • 跳跃表

    跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

简单介绍如下图所示:

image.png

常用命令

zadd 添加元素

添加一个或多个元素的值和分值,并按照分值排序,如果已经存在,则更新其得分。

其格式如下: zadd  <key><score1><value1><score2><value2>

image.png

如下所示,在fruit集合添加元素,返回添加元素个数,再次提交一个新元素,并对原来的元素得分进行修改:

127.0.0.1:0>zadd fruit 10 banana 15 orange 16 apple
"3"
127.0.0.1:0>zadd fruit 11 banana 16 orange 17 apple 18 pear
"1"

zrange 返回指定下标元素

zrange

返回集合当中,指定开始到结束下标之间的元素

其格式如下:zrange <key> <start> <stop>  [WITHSCORES]

显示元素同时也显示分数,携带WITHSCORES参数,不需要分数则不需要带WITHSCORES

127.0.0.1:0>zrange fruit 0 5 WITHSCORES
1) "banana"
2) "11"
3) "orange"
4) "16"
5) "apple"
6) "17"
7) "pear"
8) "18"

zrangebylex

返回集合当中,指定字典区间内的元素

其格式如下:zrangebylex key min max [LIMIT offset count]

属性是否必填含义
key集合的key
min字典中排序位置较小的成员,必须以 “ [ ” 开头,或使用 “ ( ” 开头,可以使用减号 “ - ”代替。
max字典中排序位置较大的成员,必须以 “ [ ” 开头,或者以 “ ( ” 开头,可使用加号 “ + ” 代替
LIMIT指定返回条数,其后的offset和count必须携带
offset返回数据的起始位置
count返回数据的数量

返回全部元素,使用 - +

127.0.0.1:0>zrangebylex fruit - +
1) "banana"
2) "orange"
3) "apple"
4) "pear"
127.0.0.1:0>zrangebylex fruit [ +
1) "banana"
2) "orange"
3) "apple"
4) "pear"

返回前三条,使用LIMIT,从 0 或者 1 开始都行:

127.0.0.1:0>zrangebylex fruit - +
1) "banana"
2) "orange"
3) "apple"
4) "pear"
127.0.0.1:0>zrangebylex fruit [ +
1) "banana"
2) "orange"
3) "apple"
4) "pear"

获取元素之间的元素,使用[指定范围:

127.0.0.1:0>zrangebylex fruit [banana [pear
1) "banana"
2) "orange"
3) "apple"
4) "pear"
127.0.0.1:0>zrangebylex fruit - [pear
1) "banana"
2) "orange"
3) "apple"
4) "pear"
127.0.0.1:0>zrangebylex fruit [banana +
1) "banana"
2) "orange"
3) "apple"
4) "pear"

获取成员间的元素,使用(,不包含(后的元素:

127.0.0.1:0>zrangebylex fruit (banana +
1) "orange"
2) "apple"
3) "pear"
127.0.0.1:0>zrangebylex fruit - (pear
1) "banana"
2) "orange"
3) "apple"
127.0.0.1:0>zrangebylex fruit (banana (pear
1) "orange"
2) "apple"

获取以指定字母开头的元素:

127.0.0.1:0>zrangebylex fruit [b (p
1) "banana"
2) "orange"
3) "apple"

注意: 在分数不相同的集合当中使用此方法,可能导致返回数据不准确,所以在使用lex结尾的命令时,需要确保当前集合分数相同。

zrangebyscore

返回集合中,分数在min到max之间的元素,并从小到大排序。

格式如下:zrangebyscore key minmax [withscores] [limit offset count]

使用方式如下:

127.0.0.1:0>zrangebyscore fruit 0 17
1) "banana"
2) "orange"
3) "apple"
127.0.0.1:0>zrangebyscore fruit 0 17 WITHSCORES
1) "banana"
2) "11"
3) "orange"
4) "16"
5) "apple"
6) "17"
127.0.0.1:0>zrangebyscore fruit 0 17 WITHSCORES LIMIT 1 2
1) "orange"
2) "16"
3) "apple"
4) "17"

zincrby 增加score

为集合中的元素得分增加指定分数。

其格式如下所示:zincrby <key><increment><value>   

如下所示,返回增加后得分:

127.0.0.1:0>zincrby fruit 3 apple
"20"

zrem 删除元素

zrem

删除集合下指定的元素。 格式如下:zrem  <key><value>

使用方式如下所示:

127.0.0.1:0>zrem fruit apple
"1"

zremrangebylex

删除元素区间内的数据。

格式如下:zremrangebylex <key> <min> <max>

使用方式如下所示,其使用方式的含义参考前面的range小节:

127.0.0.1:0>zremrangebylex fruit [banana [orange
"2"

zremrangebyscore

删除指定分数内的数据。

格式如下:zremrangebyscore <key> <min> <max>

使用方式如下:

127.0.0.1:0>zremrangebyscore fruit 0 20
"1"

zcount 获取元素个数

统计指定分数区间内的元素个数

格式:zcount <key><min><max>

使用方式如下:

127.0.0.1:0>zcount fruit 10 12
"3"

zrank 获取排名

返回指定元素在集合中的排名,从0开始。

格式:zrank <key><value>

使用方式如下:

127.0.0.1:0>zrank fruit apple
"0"
127.0.0.1:0>zrank fruit banana
"1"
127.0.0.1:0>zrank fruit pear
"2"