持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
本文主要讲解redis常用命令之zset的相关知识。
数据结构
redis的zset与set很相似,前面我们介绍set的时候,知道了set是一个无序集合,而zset则是一个有序集合。同样的,都不能存在相同的元素。
比较重要的不同点在于,zset的每个元素都有一个评分score,用来对集合中的元素进行排序,且评分是可以重复的。
用户根据评分(score)或者索引(position)来获取一个范围的元素。
zset底层使用了两种数据结构
-
hash表
用来保存元素的value和得分score,可以保证value的唯一性,又可以通过元素value快速找到相应的得分。
-
跳跃表
跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
简单介绍如下图所示:
常用命令
zadd 添加元素
添加一个或多个元素的值和分值,并按照分值排序,如果已经存在,则更新其得分。
其格式如下: zadd <key><score1><value1><score2><value2>
如下所示,在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"