暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis每日一练(33):ZADD命令

原创 AlbertS 2020-01-05
2464

版权声明: 转载请注明出处!本文采用 知识共享 署名-非商业性使用-禁止演绎 4.0 国际许可协议

前言

从这一篇笔记开始我们学习有序集合的命令,有序集合 sorted sets,在 redis 中使用前缀 z 来作为命令前缀,比如今天学习的 ZADD 命令就是向有序集合中添加元素。

说到有序集合,在接触 redis 之前还真的没听说过,之前学习的命令操作的类型,比如字符串、哈希表、列表、集合这些类型在其他的语言中或多或少的都接触过,但是这个有序集合还真是第一次听说,占用完整的一篇笔记来说道说道。

这个有序集合本质上是一个集合,但是其内部是有序的,更像是集合与哈希表的杂合体,首先在有序集合中与普通集合中一样,所有的元素都不相同,但是在有序集合中,每一个元素还有一个分数,整个集合默认按照分数排序,当分数相同时按照元素的字典序排序。

这篇笔记中的仅有一个命令 ZADD ,可以参考:

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>

总结

  1. ZADD 命令在有序集合中增加一个带有分数的元素,返回成功添加的元素个数。
  2. ZADD 命令具有多个选项:XX 有元素时进行修改,NX 没有元素时进行添加,CH 返回修改的元素个数
  3. ZADD 命令还有一个 INCR 选项,个人觉得用处不大,还是要一切从简,添加命令就不要专门修改分数了,不知道这个 INCR 还有没有其他的妙用,知道的小伙伴可以指点我一下。

2020-1-5 11:25:42

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论