版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议
前言
从这一篇笔记开始我们学习有序集合的命令,有序集合 sorted sets,在 redis 中使用前缀 z 来作为命令前缀,比如今天学习的 ZADD 命令就是向有序集合中添加元素。
说到有序集合,在接触 redis 之前还真的没听说过,之前学习的命令操作的类型,比如字符串、哈希表、列表、集合这些类型在其他的语言中或多或少的都接触过,但是这个有序集合还真是第一次听说,占用完整的一篇笔记来说道说道。
这个有序集合本质上是一个集合,但是其内部是有序的,更像是集合与哈希表的杂合体,首先在有序集合中与普通集合中一样,所有的元素都不相同,但是在有序集合中,每一个元素还有一个分数,整个集合默认按照分数排序,当分数相同时按照元素的字典序排序。
这篇笔记中的仅有一个命令 ZADD ,可以参考:
- 《Redis每日一练(28):SADD、SMEMBERS和SCARD命令》 中的 SADD 命令
- 《Redis每日一练(01):GET和SET命令》 中的 SET 命令
ZADD
- 最早出现版本:1.2.0
- 时间复杂度:O(log(N))
- 命令参数:ZADD key [NX|XX] [CH] [INCR] score member [score member …]
- 操作类型:sorted sets
- 官方文档
作用
向有序集合中添加一个带有分数的元素,当版本大于等于2.4时,可以一次性添加多个带分数的元素。
默认返回成功添加的元素个数,当选项 INCR 被指定的时候,会返回一个成员新的分数,当操作被终止的时候返回nil。
分数应该指定为字符串表示的一个浮点数,+inf 和 -inf 分表表示最大分数和最小分数,查看有序集合可以使用 ZRANGE 命令。
练习
XX
只有在指定的元素存在时才会更新分数,加上这个选项不会增加新的元素:
127.0.0.1:6379> DEL zset
(integer) 0
127.0.0.1:6379> ZADD zset 100 albert
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1
1) "albert"
127.0.0.1:6379> ZADD zset XX 101 tom
(integer) 0
127.0.0.1:6379> ZADD zset XX 102 albert
(integer) 0
127.0.0.1:6379> ZRANGE zset 0 -1
1) "albert"
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "102"
127.0.0.1:6379>
NX
只有在指定的元素不存在时才会插入元素,否则不做任何操作,加了NX选项无法修改已存在元素的分数:
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "102"
127.0.0.1:6379> ZADD zset NX 98 bella
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "bella"
2) "98"
3) "albert"
4) "102"
127.0.0.1:6379> ZADD zset NX 101 albert
(integer) 0
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "bella"
2) "98"
3) "albert"
4) "102"
127.0.0.1:6379>
CH
这个选项会修改返回值的规则,原来的返回值是新增的元素个数,如果只是元素改变返回的是0,但是加上这个选项后,返回值含义变成了当前命令修改了几个元素的值,包含新添加的和分数发生改变的。
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "100"
127.0.0.1:6379> ZADD zset 99 albert
(integer) 0
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "99"
127.0.0.1:6379> ZADD zset CH 98 albert
(integer) 1
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "98"
127.0.0.1:6379> ZADD zset CH 98 albert
(integer) 0
127.0.0.1:6379>
INCR
这个选项后面只能加一个元素和分数,用来修改分数使用,如果指定的元素不存在会增加一个元素:
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "98"
127.0.0.1:6379> ZADD zset INCR 99 bella
"99"
127.0.0.1:6379> ZADD zset INCR 1 albert
"99"
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
1) "albert"
2) "99"
3) "bella"
4) "99"
127.0.0.1:6379>
总结
- ZADD 命令在有序集合中增加一个带有分数的元素,返回成功添加的元素个数。
- ZADD 命令具有多个选项:XX 有元素时进行修改,NX 没有元素时进行添加,CH 返回修改的元素个数
- ZADD 命令还有一个 INCR 选项,个人觉得用处不大,还是要一切从简,添加命令就不要专门修改分数了,不知道这个 INCR 还有没有其他的妙用,知道的小伙伴可以指点我一下。
2020-1-5 11:25:42