1.zset数据结构

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

有序集合的成员是唯一的,但分数(score)却可以重复。

操作时间复杂度:

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

  • 添加和删除都需要修改skiplist,所以复杂度为O(log(n))。 但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1)
  • 其他的range操作复杂度一般为O(log(n))
  • 当然如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n)
> 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
> ZRANGE runoobkey 0 10 WITHSCORES //打印有序集成员及成员的分数值
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
> ZRANGE runoobkey 0 10  //只打印有续集成员
1) "redis"
2) "mongodb"
3) "mysql"

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表示取几条数据。

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

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

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

4.ZSCAN命令 

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