Redis 中的有序集合类型

一、基本操作

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

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) 的时间才能找到数据,对于集合而言效率太低了。

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

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

发表评论