Redis -- zset有序集合

聪明在于勤奋,天才在于积累。


目录

zset 有序集合

zset相关命令

zadd

zcard

zcount

zrange

zrevrange

zrangebyscore

zpopmax

bzpopmax

zpopmin

bzpopmin

zrank

zscore

zrem

zRemRangeByRank

zRemRangeByScore        

 zincrby

集合间操作

zinterstore

zunionstore

小结


zset 有序集合

        有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是用下标作为排序依据而是用这个分数。

        下图是一个很典型的示例:

         分数设置好之后,就可以根据分数来进行排序。

        但是任然需要要求zset中的元素是唯一的,因为zset依然是一个集合类型。但是分数是可以重复的。zset主要还是用来存member,分数只是用来辅助的作用。 

zset相关命令

zadd

        往一个有序集合中添加member(元素)和分数。

        member是唯一的,但是分数是可以相同的,相同的分数会有什么效果?相同的分数之间排序是根据member的字典顺序进行排序的。上面有一张图很好的说明了 这点。

语法

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]
  • key 是一个最基本的键值对,是zadd的作用对象。
  • 添加的时候,既要添加元素,又要添加分数。这里的member和score称为一个pair。不要把pair理解为一个键值对。
  • XX:(exists)仅仅用于更新已经存在的元素,不会添加新元素
  • NX:(not exists)仅仅添加新元素,不会更新已经存在的元素
  • GT:greater than。仅仅当更新分数的时候,新的分数小于原来的分数才生效。
  • LT:less than。仅仅当更新分数的时候,新的分数大于原来的分数才生效。
  • CH:(changed)默认情况下,ZADD 返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • incr:此时命令类似 ZINCRBY 的效果,将元素的分数加上指定的分数。此时只能指定一个元素和分数。
  • 时间复杂度:O(\log_{2}N)。
  • 返回值:本次添加成功的元素个数

示例

        查看里面的有序集合中的元素详细:

        但是没有分数。携带参数withscores继续查询(查询结果是升序的):

        尝试将zhangsan的分数99改为97

        修改的分数会自动进行移动元素位置,保持原有的升序顺序。


zcard

         获取一个 zset 的基数(cardinality),即 zset 中的元素个数

语法:zcard key

  • 时间复杂度:O(1)
  • 返回值:zset 内的元素个数。 

示例


zcount

        返回分数在 min 和 max 之间的元素个数,默认情况下,min 和 max 都是包含的,可以通过 ( 排除。

语法:zcount  key  min  max

  •  时间复杂度:O(log(N))
  • 返回值:满足条件的元素列表个数。
  • min和max本身是可以写成浮点数的。
  • min和max默认是闭区间,如果想排除边界值,可以在数值的前面加上括号
  • 支持使用 'inf' 和 '-inf' 来表示min和max。

示例

        排除边界值1:

        排除边界值3:

浮点数中存在两个特殊的数值:

  • Inf:无穷大
  • -inf:负无穷大

        可以使用inf和-inf来找到zset中的所有元素:


zrange

        返回指定区间里的元素,分数按照升序。带上 WITHSCORES (withsocresÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值