一、什么是zSet
zSet是一种特殊的set集合,它的值不能重复,但会对值进行排序。它有个score值,按照Score值从小到大进行排序。score称为分值,它的值是任意正浮点数。数值越小的排序越靠前。如果score相同,则按值的编码升序。
默认情况下zSet使用listpack做为存储结构,当集合中的元素大于等于512个或是单个值的字节数大于等于64,存储结构会修改为skiplist。
二、zSet的使用场景
1、实时排行榜
比如双11商品销售排行榜,可以使用分值记录数量,而值为商品id,分值越大的会越排在后面,然后使用方法把集合反转就可以获得销量最多的商品
2、实时竞拍
可以用竞拍的金额做为分值,而值为竞拍人。同样反转后可以得到竞价最高的人
三、添加值
1、一次添加一个或多个值
一次添加 一个或多个值,如果某个值已存在,则忽略此值,如果score已存在,则替换此score对应的值,最终返回实际添加和替换的值的数量。如果所有值都被忽略,则返回 0
语法
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
其中
NX为仅当值不存在时才添加
XX为仅当值存在时才替换
CH为返回当前语句中在添加前的集合中不存在的score值的数量,如集合中又有score值1和2 ,当添加的score值为 1、2、3、4时,因为3和4不存在,所以返回2
INCR:当值不存在,则按score添加,如果值已存在,则原来的值score加上当前指定的值,添加成功后返回score的值。当使用incr参数时,一次只能添加一个值
score:分值,用于排序的编码
mumber:要添加的值
示例
//按顺序添加三个值,分别为a、b、c ,返回3
zadd key 0 a 1 b 2 c
//d不存,替换0,b存在,忽略,返回 1
zadd key nx 0 d 4 b
//两个score值都不存在,返回2
zadd key ch 4 e 5 b
//c存在,score值在原来的基础上加6,返回8
zadd key incr 6 c
2、增加分值的值
此方法相当于zadd的incr参数,当值不存在,值的分值为指定的值,如果存在,则值的分值为原分值加上指定的值
语法
ZINCRBY key increment member
示例
//x不存在,它的score为2
zincrby key 2 x//a存在,它的score原值为0,加上3后返回3
zincrby key 3 a
四、删除值
1、删除一个或多个指定的值,返回实际删除的值的数量
语法
ZREM key member [member ...]
示例
//删除 x 和 b
ZREM key x b
2、删除同一分值中指定值区间内的所有值
删除同一分值中指定值区间内的所有值,以值的编码为排序,编码小的为小值,编码大的为大值。与值在集合中的位置无关。返回删除的值的数量。
当值以“[”开头,表示结果中包含此值,当值以“(”开头,表示结果中不包含此值
语法
ZREMRANGEBYLEX key minvalue maxvalue
示例
//添加值,其中 a、d、e的分值相同
zadd key 0 a 1 b 2 c 0 e 0 d//删除a d两个值,
ZREMRANGEBYLEX key [a [d
3、删除指定分值区间内的所有值
删除指定分值区间内的所有值,返回删除的值的数量
语法
ZREMRANGEBYSCORE key minscore maxscore
示例
//添加值
zadd key 0 a 1 b 2 c 0 d 0 e//删除分值1到3之间的值
zremrangebyscore key 1 3
4、删除指定范围内的值
删除指定范围内的值,返回删除的数量,位置从0开始 , -1为最后一个值
语法
ZREMRANGEBYRANK key start stop
示例
//添加值,排序后的顺序是 a d e b c
zadd key 0 a 1 b 2 c 0 d 0 e//删除位置1到3之间的值,即删除 d e b
zremrangebyscore key 1 3
五、查询
1、查询集合中值的数量
语法
ZCARD key
示例
zcard key
2、查询集合中指定分值范围内的值的数量
语法
ZCOUNT key minscore maxscore
示例
zcount key 0 10
3、查询指定范围内的值
查询集合中指定范围内的值,0表示第一个值,-1表示最后一个值
语法
ZRANGE key start stop [WITHSCORES]
其中
withscores:返回值的分值
示例
//查询所有值
zrange key 0 -1
//查询所有值,并返回值和分值
zrange key 0 -1 withscores
4、查询同一分值中指定值范围的值
查询同一分值中指定值范围的值,当值以“[”开头,表示结果中包含此值,当值以“(”开头,表示结果中不包含此值。
如果指定的值范围包含了多个分值,则查询的结果不一定准确
语法
ZRANGEBYLEX key min max [LIMIT offset count]
其中
min为最小值,min为“-”时,表示查询所有比max小的值
max为最大值,max为“+”时,表示查询所有比min大的值
limit为分页
offset为返回结果的起始位置,从0开始
count为返回结果的数量
示例
//添加5个相同分值的值
zadd key 0 d 0 a 0 c 0 b 0 e
//mix的值必须小于max,查询结果为空
zrangebylex key [d [b
//查询a到c之间的值,包括a但不包括c
zrangebylex key [a (c
//查询所有小于等于c的值
zrangebylex key - [c
//查询所有大于等于b的值
zrangebylex key [b +
//查询a到d之间的值,并返回结果中从第二个值开始的两个值
zrangebylex key [a [d limit 1 2
5、查询指定分值之间的值
语法
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
其中
min为最小分值
max为最大分值
withscores为结果是显示分值
limit为分页
offset为开始的位置,从0开始
count为返回的数量
示例
//添加5个值
zadd key 0 b 1 c 2 a 3 d 4 e
//查询分值在0 到2之间的值
zrangebyscore key 0 2
//查询分值在0到2之间的值和分值
zrangebyscore key 0 2 withscores//查询分值在0到2之间的值和分值,返回从第3个值开始的一个值
zrangebyscore key 0 10 withscores limit 2 1
6、查询指定范围内的值
此方法的查询结果的顺序正好与zrange的相反。相当于zrange的反转操作
语法
ZREVRANGE key start stop [WITHSCORES]
示例
//添加6个值
zadd key 0 b 1 e 2 a 3 d 4 c 5 f
//查询结果为:b、0、e、1、a、2、d、3、c、4、f、5
zrange key 0 -1 withscores
//查询结果为:f、5、c、4、d、3、a、2、e、1、b、0
zrevrange key 0 -1 withscores
7、查询同一分值中指定值范围内的值
此方法结果结果的顺序与zrangebylex相反,相当于zrangebylex的反转操作
语法
ZREVRANGEBYLEX key max min [LIMIT offset count]
示例
8、查询指定分值范围之内的值
此方法结果结果的顺序与zrangebyscore相反,相当于zrangebyscore的反转操作
语法
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
示例
//添加6个值
zadd key 0 b 1 e 2 a 3 d 4 c 5 f
//查询结果为:b、e、a、d
zrangebyscore key 0 3
//查询结果为:d、a、e、b
zrevrangebyscore key 3 0
9、查询值在集合中从前向后计算的位置
位置从0开始
语法
ZRANK key member
示例
//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f//查询z的值,结果为4
zrank key a
10、查询值在集合中从后向前计算的位置
位置从0开始
语法
ZREVRANK key member
示例
//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f//查询a距最后一个元素的位置,结果为1
zrevrank key a
11、查询指定值的分值
语法
ZSCORE key member
示例
//添加6个值
zadd key 0 b 3 e 9 a 6 d 10 c 7 f
//查询a的分值,结果为9
zscore key a
六、交、并集
1、查询指定数量集合的交集
语法
zinter numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
numkeys为要计算交集的集合数量
key为集合名
aggregate:结果中分值的计算方式,sum为各集合中分值之和,min为取最小的分值,max为取最大的分值
weights为分值的权重,即原来的分值乘以此值为新的分值,比如某值在a集合中的分值为2,在b集合中的分值为3,而权重分别为2和1,则交集的分值为2*2 + 3*1 = 7,如果aggregate为min,则结果的分值为3*1 = 3
withscores为查询结果中显示分值
示例
zadd key1 0 a 1 b 2 c
zadd key2 0 b 1 c 2 d
//结果为b、1、c、3
zinter 2 key1 key2 withscores
//结果为b、2、c、7
zinter 2 key1 key2 weights 2 3 withscores
//结果为:b、0、c、3
zinter 2 key1 key2 weights 2 3 aggregate min withscores
//结果为:b、2、c、4
zinter 2 key1 key2 weights 2 3 aggregate max withscores
2、查询多个集合中交集值的数量
语法
zintercard numkeys key [key ...] [LIMIT limit]
其中
limit为最多查询多少个结果
示例
zintercard 2 key1 key2 limit 2
3、查询指定数量集合的交集并保存到指定集合中
查询指定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
语法
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
其中
destiontion为查询结果保存的集合名,如果不存在则创建
numkeys为要计算交集的集合数量
key为集合名
aggregate:结果中分值的计算方式,sum为各集合中分值之和,min为取最小的分值,max为取最大的分值
weights为分值的权重,即原来的分值乘以此值为新的分值,比如某值在a集合中的分值为2,在b集合中的分值为3,而权重分别为2和1,则交集的分值为2*2 + 3*1 = 7,如果aggregate为min,则结果的分值为3*1 = 3
示例
zadd key1 0 a 1 b 2 c
zadd key2 0 b 1 c 2 d
//结果为b、1、c、3
zinterstore key3 2 key1 key2
//结果为b、2、c、7
zinterstore key3 2 key1 key2 weights 2 3
//结果为:b、0、c、3
zinterstore key3 2 key1 key2 weights 2 3 aggregate min
//结果为:b、2、c、4
zinterstore key3 2 key1 key2 weights 2 3 aggregate max
4、查询多个集合的并集
语法
zunion numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]
示例
zadd key1 0 a 1 b 2 c
zadd key2 0 b 1 c 2 d
//查询结果为:a、0、b、1、d、1、c、4
zunion 2 key1 key2
5、查询多个集合的并集,并把结果保存到新的集合中
语法
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
示例
zadd key1 0 a 1 b 2 c
zadd key2 0 b 1 c 2 d
//查询结果为:a、0、b、1、d、1、c、4
zunionstore key3 2 key1 key2
文章来源于哔站《Redis中zSet类型的操作》
更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频
更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ :开源吧