Redis中zSet类型的操作

一、什么是zSet
    zSet是一种特殊的set集合,它的值不能重复,但会对值进行排序。它有个score值,按照Score值从小到大进行排序。score称为分值,它的值是任意正浮点数。数值越小的排序越靠前。如果score相同,则按值的编码升序。

  默认情况下zSet使用listpack做为存储结构,当集合中的元素大于等于512个或是单个值的字节数大于等于64,存储结构会修改为skiplist。

Redis中zSet类型的操作_第1张图片
二、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类型的操作》

更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频

更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ ​ :开源吧

你可能感兴趣的:(数据库,redis,redis,数据库,nosql)