Redis中的有序集合类型

马谦马谦马谦 Redis评论1,136字数 1055阅读3分31秒阅读模式

一、基本操作

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

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中的有序集合类型

 最后更新:2020-2-17
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2017年11月26日19:45:19
  • 转载请务必保留本文链接:https://www.dyxmq.cn/databases/redis/redis-sorted-set.html
redis中的AOF持久化和RDB持久化 Redis

redis中的AOF持久化和RDB持久化

一、AOF持久化 1.1 实现机制 AOF(Append Only File)是redis持久化方式的一种,它通过把所有redis执行过的命令都写入到文件来维持持久化。一旦服务崩溃,则可以重放这些命令...
redis中的键值淘汰策略 Redis

redis中的键值淘汰策略

当使用的内存到达上限后,redis提供了6种策略来淘汰键值: 策略 描述 volatile-lru 在所有设置了过期时间的键值中根据LRU算法淘汰最近最少使用的 allkeys-lru 对数据库中所有...
redis源码分析:链表实现 Redis

redis源码分析:链表实现

一、链表定义 链表在redis中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。redis中链表在adlist.h和adlist.c中实现,只用了300+行代码...
redis中的发布和订阅 Redis

redis中的发布和订阅

一、发布和订阅 除了任务队列以外,redis还有一种基于“发布/订阅”模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证