Redis中的有序集合类型

马谦马谦马谦 2017年11月26日19:45:19 发表评论
文章最后编辑于:2020-2-17 18:18:24

一、基本操作

有序集合也是集合的一种,顾名思义,它和集合的不同之处在于它是有序的 ,而集合无序。它通过给集合中每一个元素都关联一个分数来是的元素有序,同时提供了多个方式获取排序之后的元素。

1.1 增加和删除元素

增加元素:

当key不存在时自动创建,分数支持整数和双精度浮点数,同时还可以使用+inf-inf分别表示正无穷大和负无穷大。执行成功返回添加的元素个数。

删除元素:

移除元素,返回成功移除的个数。

示例:

1.2 获取元素

获取元素有以下几个操作:

注意事项:所有的排名都是从0开始的。

除了上面的几个操作以外,有序集合还提供了一些其他的api:

默认情况下,redis只返回元素的key,不会返回分数。WITHSCORES的作用就是在返回key的同时还返回分数。

1.3 增加分数

member成员增加分数increment,返回值是更改后的分数:

示例:

1.4 根据条件删除元素

删除指定范围的元素:

二、编码和原理

有序集合内部使用ziplistskiplist来编码,当集合满足下面两个条件时,对象使用ziplist,否则使用skiplist

  1. 集合的元素个数小于128
  2. 所有元素的长度小于64

当条件不足时,redis会自动转换编码。一个转换示例:

除了用链表以外,有序集合还是用了哈希表作为底层实现之一。哈希表保存了所有节点和分数的对应关系,它的作用主要是方便定位元素位置,在O(1)的时间内找到元素。否则,根据跳跃表的特性,需要(logN)的时间才能找到数据,对于集合而言效率太低了。

字典里面保存了所有节点和分数的对应关系,但是所有的对象节点并不是额外再创建的,它是直接用的跳跃表中元素的节点,这样避免了占用额外空间,二来还可以直接定位到对应节点地址,方便修改。

有序集合内部结构图如图所示:

Redis中的有序集合类型

本文共执行65次查询,耗时0.518秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: