Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:Redis
📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。
前言
Zset有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。它保留了set集合不能有重复成员的特点,但与set集合不同的是,Zset有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,着使得Zset有序集合中的元素是可以维护有序性的,但这个有序不是用下标,作为排序依据而是用这个分数。如图所示,该有序集合显示了三国中的武将的武力。(这里的有序指升序/降序)(排序规则按照一定的分数)
-
有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能,合理地利用有序集合,可
以帮助我们在实际开发中解决很多问题。 -
有序集合中的元素是不能重复的(唯一的),但分数允许重复。类比于一次考试之后,每个人一定有一个唯一的分数,但分数允许相同。
列表、集合、有序集合三者的异同点:
一、普通命令
1.ZADD
-
添加或者更新指定的元素以及关联的分数到 zset 中,分数应该符合 double 类型,+inf/-inf 作为正负极限也是合法的。
-
ZADD 的相关选项:
-
XX:仅仅用于更新已经存在的元素,不会添加新元素。(仅在member成员已存在时才更新分数。)
-
NX:仅用于添加新元素,不会更新已经存在的元素。(仅在member成员不存在时才添加)
-
LT:表示只有当member成员 当前的分数 小于 新分数时,才会更新分数。
换句话说,只有在新的分数大于现有分数时,才会进行更新,否则不会对该成员进行任何修改。 -
GT:表示只有当member成员 当前的分数 大于 新分数时,才会更新分数。
换句话说,只由在新的分数小于现有分数时,才会进行更新,否则不会对该成员进行任何修改。 -
CH:默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
-
INCR:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。
-
语法:
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
- 添加元素的时候,既要添加 score 也要添加 member ,score和member称为是一个“pair”
- 不要把 score 和 member 理解成“键值对”(key-value pair)
- 对于有序集合来说,既可以通过 score 找到对应的 member ,也能通过 member 找到对应的 score
- 命令有效版本:1.2.0 之后
- 时间复杂度:O(log(N)) n是有序集合中已经有的元素个数,要求新增的元素,要放到合适的位置上(之所以log(N) 不是 N ,也是充分利用了有序这样的特点,当然zset 内部的数据结构,主要是调表)
- 返回值:本次添加成功的元素个数。
- 示例:
#分数如果相同的话,按照元素自身字符串的字典来排序
#zset有序集合内部 元素是按照升序来排列的
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> ZADD key 99 吕布 98 赵云 96 典韦 95 关羽
(integer) 4
#zrange 查看有序集合中元素的详情
#类似于 lrange 可以指定一对下标构成的区间
#有序集合,本身元素就有先后顺序的,因此就可以给这个有序集合赋予下标这样的概念
127.0.0.1:6379> ZRANGE key 0 -1
1) "\xe5\x85\xb3\xe7\xbe\xbd"
2) "\xe5\x85\xb8\xe9\x9f\xa6"
3) "\xe8\xb5\xb5\xe4\xba\x91"
4) "\xe5\x90\x95\xe5\xb8\x83"
# redis内部在存储数据的时候,是按照二进制方式进行存储的,这就意味着redis服务器不负责“字符编码”的
#要把二进制数据转化为 汉字,还需要客户端来进行支持~~
#redis-cli --raw 这样的命令进行处理
#ctrl + c 退出redis客户端
root@iZ2ze1wowvpkkp7wnart6oZ:~# redis-cli --raw
127.0.0.1:6379> zrange key 0 -1
关羽
典韦
赵云
吕布
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
98
吕布
99
127.0.0.1:6379> zadd key 97 赵云
0
127.0.0.1:6379> zrange key 0 -1
关羽
典韦
赵云
吕布
127.0.0.1:6379> zrange key 0 -1 withscores
关羽
95
典韦
96
赵云
97
吕布
99
127.0.0.1:6379> zadd key 10 吕布
0
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
关羽
95
典韦
96
赵云
97
- nx xx 的使用
127.0.0.1:6379> zadd key nx 94 张飞
1
127.0.0.1:6379> zrange key 0 -1 withscores
吕布
10
张飞
94
关羽
95
典韦
96
赵云
97
127.0.0.1: