高级程序员必须精通的Redis,第五篇之——zset(有序集合)
Posted 李子捌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级程序员必须精通的Redis,第五篇之——zset(有序集合)相关的知识,希望对你有一定的参考价值。
1、简介
Redis中所有的的数据结构都是通过一个唯一的字符串key来获取相应的value数据。
Redis有5种基础数据结构,分别是:
- string(字符串)
- list(列表)
- hash(字典)
- set(集合)
- zset(有序集合)
其中list、set、hash、zset这四种数据结构是容器型数据结构,它们共享下面两条通用规则:
- create if not exists:容器不存在则创建
- drop if no elements:如果容器中没有元素,则立即删除容器,释放内存
本文讲述的是Redis的5种基础数据结构中的zset(有序集合)
2、zset(有序集合)相关介绍
2.1 zset(有序集合)的内部结构
zset(有序集合)是Redis中最常问的数据结构。它类似于Java语言中的SortedSet和HashMap的结合体,它一方面通过set来保证内部value值的唯一性,另一方面通过value的score(权重)来进行排序。这个排序的功能是通过Skip List(跳跃列表)来实现的。
zset(有序集合)的最后一个元素value被移除后,数据结构被自动删除,内存被回收。
2.2 zset(有序集合)的相关使用场景
利用zset的去重和有序的效果可以由很多使用场景,举两个例子:
- 存储粉丝列表,value是粉丝的ID,score是关注时间戳,这样可以对粉丝关注进行排序
- 存储学生成绩,value使学生的ID,score是学生的成绩,这样可以对学生的成绩排名
3、zset(有序集合)相关指令
1、zadd -> 向集合中添加元素,集合不存在则新建,key代表zset集合名称,score代表元素的权重,member代表元素
zadd key [NX|XX] [CH] [INCR] score member [score member …]
1127.0.0.1:6379> zadd name 10 zhangsan
2(integer) 1
3127.0.0.1:6379> zadd name 10.1 lisi
4(integer) 1
5127.0.0.1:6379> zadd name 9.9 wangwu
6(integer) 1
2、zrange -> 按照score权重从小到大排序输出集合中的元素,权重相同则按照value的字典顺序排序([lexicographical order])
超出范围的下标并不会引起错误。 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, zrange 命令只是简单地返回一个空列表。 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
zrange key start stop [WITHSCORES]
1127.0.0.1:6379> zrange name 0 -1 # 获取所有元素,按照score的升序输出
21) "wangwu"
32) "zhangsan"
43) "lisi"
5127.0.0.1:6379> zrange name 0 1 # 获取第一个和第二个slot的元素
61) "wangwu"
72) "zhangsan"
8127.0.0.1:6379> zadd name 10 tianqi # 在上面的基础上添加score为10的元素
9(integer) 1
10127.0.0.1:6379> zrange name 0 2 # key相等则按照value字典排序输出
111) "wangwu"
122) "tianqi"
133) "zhangsan"
14127.0.0.1:6379> zrange name 0 -1 WITHSCORES # WITHSCORES 输出权重
151) "wangwu"
162) "9.9000000000000004"
173) "tianqi"
184) "10"
195) "zhangsan"
206) "10"
217) "lisi"
228) "10.1"
3、zrevrange -> 按照score权重从大到小输出集合中的元素,权重相同则按照value的字典逆序排序
其中成员的位置按 score 值递减(从大到小)来排列。 具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。 除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE key start stop [WITHSCORES] 命令一样。
zrevrange key start stop [WITHSCORES]
1127.0.0.1:6379> zrevrange name 0 -1 WITHSCORES
21) "lisi"
32) "10.1"
43) "zhangsan"
54) "10"
65) "tianqi"
76) "10"
87) "wangwu"
98) "9.9000000000000004"
4、zcard -> 当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0
zcard key
1127.0.0.1:6379> zcard name
2(integer) 4
5、zscore -> 返回有序集 key 中,成员 member 的 score 值,如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil
zscore key member
1127.0.0.1:6379> zscore name zhangsan
2"10"
3127.0.0.1:6379> zscore name liziba
4(nil)
6、zrank -> 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0
zrank key member
1127.0.0.1:6379> zrange name 0 -1
21) "wangwu"
32) "tianqi"
43) "zhangsan"
54) "lisi"
6127.0.0.1:6379> zrank name wangwu
7(integer) 0
7、zrangebyscore -> 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用[ZRANGEBYSCORE]这类命令
默认情况下,区间的取值使用闭区间](小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间
zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
1127.0.0.1:6379> zrange name 0 -1 WITHSCORES # 输出全部元素
21) "wangwu"
32) "9.9000000000000004"
43) "tianqi"
54) "10"
65) "zhangsan"
76) "10"
87) "lisi"
98) "10.1"
10127.0.0.1:6379> zrangebyscore name 9 10
111) "wangwu"
122) "tianqi"
133) "zhangsan"
14127.0.0.1:6379> zrangebyscore name 9 10 WITHSCORES # 输出分数
151) "wangwu"
162) "9.9000000000000004"
173) "tianqi"
184) "10"
195) "zhangsan"
206) "10"
21127.0.0.1:6379> zrangebyscore name -inf 10 # -inf 从负无穷开始
221) "wangwu"
232) "tianqi"
243) "zhangsan"
25127.0.0.1:6379> zrangebyscore name -inf +inf # +inf 直到正无穷
261) "wangwu"
272) "tianqi"
283) "zhangsan"
294) "lisi"
30127.0.0.1:6379> zrangebyscore name (10 11 # 10 < score <=11
311) "lisi"
32127.0.0.1:6379> zrangebyscore name (10 (10.1 # 10 < socre < -11
33(empty list or set)
34127.0.0.1:6379> zrangebyscore name (10 (11
351) "lisi"
8、zrem -> 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略
zrem key member [member …]
1127.0.0.1:6379> zrange name 0 -1
21) "wangwu"
32) "tianqi"
43) "zhangsan"
54) "lisi"
6127.0.0.1:6379> zrem name zhangsan # 移除元素
7(integer) 1
8127.0.0.1:6379> zrange name 0 -1
91) "wangwu"
102) "tianqi"
113) "lisi"
以上是关于高级程序员必须精通的Redis,第五篇之——zset(有序集合)的主要内容,如果未能解决你的问题,请参考以下文章