zset 与命令

转自:https://www.runoob.com/redis/redis-sorted-sets.html

1.zset数据结构/zadd命令

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复,相同分数按照key的字典序排列。

操作时间复杂度:

在redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化。所以如上可知: 

  • 添加和删除都需要修改skiplist,所以复杂度为O(log(n))。 但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1)
  • 其他的range操作复杂度一般为O(log(n))
  • 当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)

zadd 用于将一个或多个 member 元素及其 score 值加入到有序集 key 当中。

> ZADD runoobkey 1 redis
(integer) 1
> ZADD runoobkey 2 mongodb
(integer) 1
> ZADD runoobkey 3 mysql
(integer) 1
> ZADD runoobkey 3 mysql
(integer) 0
> ZADD runoobkey 4 mysql
(integer) 0
  • XX: 仅更新存在的成员,不添加新成员。
  • NX: 不更新存在的成员。只添加新成员。
  • LT: 更新新的分值比当前分值小的成员,不存在则新增。
  • GT: 更新新的分值比当前分值大的成员,不存在则新增。
  • CH: 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内。 注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。
  • INCR: ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对。

2.zrange/命令

返回有序集中,指定区间内的成员,其中成员的按分数值递增(从小到大)来排序。具有相同分数值的成员按字典序(lexicographical order )来排列。

> ZRANGE key start stop [WITHSCORES]
  • 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
  • start 和 stop 都是包含在内的区间,因此例如 ZRANGE myzset 0 1 将会返回有序集合的第一个和第二个元素。
  • 超出范围的索引不会产生错误。 如果 start 参数的值大于有序集合中的最大索引,或者 start > stop ,将会返回一个空列表。 如果 stop 的值大于有序集合的末尾,Redis 会将其视为有序集合的最后一个元素。
  • 可以传递 WITHSCORES 选项,以便将元素的分数与元素一起返回。这样返回的列表将包含 value1,score1,...,valueN,scoreN ,而不是 value1,...,valueN 。
> ZRANGE runoobkey 0 10  //只打印有续集成员[0,10]
1) "redis"
2) "mongodb"
3) "mysql"

> ZRANGE runoobkey 0 10 WITHSCORES //打印有序集成员及成员的分数值
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

 时间复杂度:O(log(N)+M),其中N是有序集合中的元素数量,M是返回的元素数量。

2.Zrangebyscore /ZREVRANGEBYSCORE

Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。具有相同分数值的成员按字典序来排列。默认情况下,区间的取值使用闭区间,可以通过给参数前增加 ( 符号来使用可选的开区间。

Zrevrangebyscore 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。具有相同分数值的成员按字典逆序来排列。
redis 127.0.0.1:6379> ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

用法:

> ZRANGEBYSCORE runoobkey 1 3  //打印值在[1,3]之间的元素
1) "redis"
2) "mongodb"
> ZRANGEBYSCORE runoobkey 1 3 WITHSCORES //打印分数
1) "redis"
2) "1"
3) "mongodb"
4) "2"
> ZRANGEBYSCORE runoobkey 1 3 WITHSCORES limit 1 10 //偏移量为1,偏移1个取10个
1) "mongodb"
2) "2"
> ZREVRANGEBYSCORE runoobkey 3 1 WITHSCORES //逆序,从大大小,那么max值在前, min在后
1) "mongodb"
2) "2"
3) "redis"
4) "1"
> ZREVRANGEBYSCORE runoobkey 3 1 WITHSCORES limit 1 10 //偏移一个
1) "redis"
2) "1"

offset就是偏移量,比如从第几个开始,而count表示取几条数据。

时间复杂度:O(log(N)+M),其中N是有序集合中的元素数量,M是返回的元素数量。如果M是常数(例如,总是要求具有LIMIT的前10个元素),则可以认为它是O(log(N))。

3.其他常用命令

#ZADD命令
redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2

#ZRANGE命令,查看value值
# 显示整个有序集成员,start和end表示下标,下标从0开始,-1表示最后一个成员
# 成员的位置按分数值递增(从小到大)来排序。
redis 127.0.0.1:6379> ZRANGE key start stop [WITHSCORES]
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES             
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

#ZREM命令,用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
redis 127.0.0.1:6379> ZREM key member [member ...]
redis 127.0.0.1:6379> ZREM salary jack tom
(integer) 2

#ZCARD命令
# 用于计算集合中元素的数量。
redis 127.0.0.1:6379> ZCARD KEY_NAME

#ZCOUNT命令
# 用于计算有序集合中指定分数区间的成员数量,分数值在 min 和 max 之间的成员的数量。
redis 127.0.0.1:6379> ZCOUNT key min max
redis 127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
redis 127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
redis 127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar"
(integer) 2
redis 127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 4

4.zrank/ZREVRANK命令

宝藏网站:https://redis.com.cn/commands/zrank.html

#ZRANK命令
# 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。也是以0开始计数的,score值最低的成员排名为0。
redis 127.0.0.1:6379> ZRANK key member 

 命令返回值:

  • 如果member是有序集key的成员,整数: member 的排名。
  • 如果member不是有序集key的成员, 或 key 不存在,多行字符串: nil。
redis> ZADD myzset 1 "one" #score是1
(integer) 1
redis> ZADD myzset 2 "two" #score是1
(integer) 1
redis> ZADD myzset 3 "three" #score是1
(integer) 1
redis> ZRANK myzset "three" #score是1
(integer) 2
redis> ZRANK myzset "four" #查不到结果返回nil
(nil)
redis> zrank myzset three  # 查询three的排名是2,从0开始计数,是第3大
(integer) 2
redis> zrank myzset one   #one和two分数一样,按key的字典序排序,one更靠前,所以排名是0
(integer) 0
redis> zrank myzset two
(integer) 1

redis> zadd myzset 1 aone
(integer) 1
redis> ZRANGEBYSCORE myzset 0 10  # 可以发现是按key的字典序排列的
1) "aone"
2) "one"
3) "two"
4) "three"
redis> zrank myzset aone
(integer) 0
redis> zrank myzset one
(integer) 1  

时间复杂度:O(对数(N))

ZREVRANK按score值从高到低排列,排名从0开始,也就是说,score值最大的成员排名为0。zrank是从低到高的排名值。

4.ZSCAN命令

https://blog.csdn.net/qq_40399646/article/details/109034331

redis 127.0.0.1:6379> ZSCAN key cursor [MATCH pattern] [COUNT count]
  • cursor - 游标。每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程当SCAN命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。只有两种游标是合法的:  1.在开始一个新的迭代时, 游标必须为 0 。2.增量式迭代命令在执行之后返回的, 用于延续迭代过程的游标
  • pattern - 匹配的模式。
  • count - 指定从数据集里返回多少元素,默认值为 10 。

5.ZREMRANGEBYRANK命令

https://www.runoob.com/redis/sorted-sets-zremrangebyrank.html

ZREMRANGEBYRANK key start stop #删除指定排名(rank)区间内的所有成员,[start, stop],都是闭区间

下标参数 start 和 stop 都以 0 为底,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

6.ZSCORE命令

#ZSCORE命令
# 返回有序集中,成员的分数值。成员的分数值,以字符串形式表示。
redis 127.0.0.1:6379> ZSCORE key member

每次只能查询一个成员的值。例子:

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"
redis> ZSCORE myzset two
(nil)
redis> zadd myzset 2 "two"
(integer) 1
redis> zscore myzset one two #每次只能查一个参数
ERR ERR wrong number of arguments for 'zscore' command
redis> zscore myzset two
"2"

 时间复杂度: O(1)

 7.ZINCRBY命令

命令格式:

> ZINCRBY key increment member 

为有序集 key 的成员 member 的 score 值加上增量 increment 。当key不存在时,相当于zadd。传递复制可以实现减操作。

redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"  #为3
4) "3"

时间复杂度:  O(log(N)),其中N是有序集合中的元素数量。(需要再重新排序)

8.ZINTERSTORE

计算 numkeys 个有序集合的交集,并且把结果放到 destination 中。默认情况下,结果集中元素的分数是各有序集合中该元素分数之和。

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

numkeys是指key的数量,需要先指定。

 

posted @ 2022-12-07 08:26  lypbendlf  阅读(137)  评论(0编辑  收藏  举报