一. 概述
SortedSet又叫zset,它是Redis提供的特殊数据类型,是一种特殊的set类型,继承了set不可重复的特点,并在set基础上为每个值添加一个分数,用来实现值的有序排列。
二. 常用指令
明白它的特点后,接下来,操作一下此数据类型的常用的相关指令。
zadd
将一个或者多个元素及其对应的分数添加到集合中。下面用命令来演示例子:
#新增
192.168.65.15:6379> zadd db 10 oracle 5 mysql 25 redis 7 mongodb
#返回新增的个数
(integer) 4
zcard
返回元素的个数,如果key不存在,则返回0。
192.168.65.15:6379> zcard db
(integer) 4
zcount
返回 分数在 区间之间的个数。
#返回分数score 在 1-3之间的元素个数
192.168.65.15:6379> zcount db 10 20
(integer) 1
zrange
返回指定下标范围内正序排列的值,start 下标从0开始,查询所有范围是0到-1。
#查询所有元素范围用 0 -1
192.168.65.15:6379> zrange db 0 -1
- "mysql"
- "mongodb"
- "oracle"
- "redis"
#查询所有元素带分数
192.168.65.15:6379> zrange db 0 -1 withscores
- "mysql"
- "5"
- "mongodb"
- "7"
- "oracle"
- "10"
- "redis"
- "25"
#查询指定下标范围内的元素
192.168.65.15:6379> zrange db 2 3
- "oracle"
- "redis"
#查询指定下标范围内的元素,带分数
192.168.65.15:6379> zrange db 2 3 withscores
- "oracle"
- "10"
- "redis"
- "25"
zrevrange
返回指定下标范围倒序的值,start 下标从0开始,查询所有范围是0到-1。
#查询所有
192.168.65.15:6379> zrevrange db 0 -1
- "redis"
- "oracle"
- "mongodb"
- "mysql"
#查询所有元素,带分数
192.168.65.15:6379> zrevrange db 0 -1 withscores
- "redis"
- "25"
- "oracle"
- "10"
- "mongodb"
- "7"
- "mysql"
- "5"
#查询指定下标范围内的元素值
192.168.65.15:6379> zrevrange db 2 3
- "mongodb"
- "mysql"
zrangebyscore
返回指定分数区间元素的信息,可以返回分数,可以进行分页 limit offset count,offset指的是元素的下标从0开始,count指返回的元素个数,按正序返回。
#正序返回分数在0到30之间的元素信息
192.168.65.15:6379> zrangebyscore db 0 30 withscores
- "mysql"
- "5"
- "mongodb"
- "7"
- "oracle"
- "10"
- "redis"
- "25"
#正序返回分数在0到30之间的元素信息,并分页,如果是0 -1 表示所有
192.168.65.15:6379> zrangebyscore db 0 30 withscores limit 0 -1
- "mysql"
- "5"
- "mongodb"
- "7"
- "oracle"
- "10"
- "redis"
- "25"
#正序返回分数在0到30之间的元素信息,并分页,下标从0开始,元素个数是1
192.168.65.15:6379> zrangebyscore db 0 30 withscores limit 0 1
- "mysql"
- "5"
#正序返回分数在0到30之间的元素信息,并分页,下标从2开始,元素个数是2
192.168.65.15:6379> zrangebyscore db 0 30 withscores limit 2 2
- "oracle"
- "10"
- "redis"
- "25"
zrevrangebyscore
与zrangebyscore相比,不同是倒序 。
#返回倒序分数30-0的所有元素
192.168.65.15:6379> zrevrangebyscore db 30 0 withscores limit 0 -1
- "redis"
- "25"
- "oracle"
- "10"
- "mongodb"
- "7"
- "mysql"
- "5"
#返回倒序分数30-0,进行分页,下标从2开始,取2条
192.168.65.15:6379> zrevrangebyscore db 30 0 withscores limit 2 2
- "mongodb"
- "7"
- "mysql"
- "5"
zrank zrevrank
zrank可以返回元素的正序名次,名次从0开始,第1名返回0。zrevrank可以返回元素的倒序名次,名次也是从0开始,第1名返回0。
#查看正序排名
192.168.65.15:6379> zrange db 0 -1
- "mysql"
- "mongodb"
- "oracle"
- "redis"
#redis排名下标为3,那就是第4名
192.168.65.15:6379> db redis
(integer) 3
#redis排名倒序下标为0,那就是第1名
192.168.65.15:6379> zrevrank db redis
(integer) 0
zincrby zscore
zincrby增加指定元素的分数,zscore查询指定元素的分数
#查询一波数据
192.168.65.15:6379> zrange db 0 -1 withscores
- "mysql"
- "5"
- "mongodb"
- "7"
- "oracle"
- "10"
- "redis"
- "25"
#元素mysql的分数+3
192.168.65.15:6379> zincrby db 3 mysql
"8"
#重新查看排名
192.168.65.15:6379> zrange db 0 -1 withscores
- "mongodb"
- "7"
- "mysql"
- "8"
- "oracle"
- "10"
- "redis"
- "25"
#单独查询mysql的分数
192.168.65.15:6379> zscore db mysql
"8"
zrem
返回删除成功元素个数。
#删除mysql元素
192.168.65.15:6379> zrem db mysql
(integer) 1
#查询一下
192.168.65.15:6379> zrange db 0 -1
- "mongodb"
- "oracle"
- "redis"
zremrangebyrank zremrangebyscore
zremrangebyrank按排名次删除,start从0开始。
zremrangebyscore按分数区间删除。
#删除0下标的元素
192.168.65.15:6379> zremrangebyrank db 0 0
(integer) 1
#查询,已删除
192.168.65.15:6379> zrange db 0 -1 withscores
- "oracle"
- "10"
- "redis"
- "25"
#按分数区间删除
192.168.65.15:6379> zremrangebyscore db 10 20
(integer) 1
#查询,已删除
192.168.65.15:6379> zrange db 0 -1 withscores
- "redis"
- "25"
四. 应用场景
只要涉及到排名、投票等场景都可以用zset。
举一个例子,我们经常在微信上给邻居小朋友投票。
#初始:明明mm 0票, 花花0票 乔乔qq 0票 小小 0票
192.168.65.15:6379> zadd ranking 0 mm 0 hh 0 qq 0 xx
(integer) 4
#查询一下初始值
192.168.65.15:6379> zrange ranking 0 -1 withscores
- "hh"
- "0"
- "mm"
- "0"
- "qq"
- "0"
- "xx"
- "0"
#明明拉来10票
192.168.65.15:6379> zincrby ranking 10 mm
"10"
#花花拉来1000票
192.168.65.15:6379> zincrby ranking 1000 hh
"1000"
#乔乔拉来50票
192.168.65.15:6379> zincrby ranking 50 qq
"50"
#小小拉来30票
192.168.65.15:6379> zincrby ranking 30 xx
#最终排名:花花1000 乔乔50 小小 30 明明 10票
192.168.65.15:6379> zrevrange ranking 0 -1 withscores
- "hh"
- "1000"
- "qq"
- "50"
- "xx"
- "30"
- "mm"
- "10"
#经调查违规拉票,取消资格
192.168.65.15:6379> zrem ranking hh
(integer) 1
#最后只取第一名
192.168.65.15:6379> zrevrange ranking 0 0 withscores
- "qq"
- "50"