redis数据结构实现--整数集合(intset)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis数据结构实现(五) 4.1 整数集合的实现 整数集合是集合键的底层实现之一,当一个集合键只包含整数元素,且元素不多时,Redis会采用整数集合作为集合键的底层实现。 可以保存int16_t,int32_t, int64_t类型的整数值。

redis数据结构实现--整数集合(intset)

整数集合是集合键的底层实现之一,当一个集合键只包含整数元素,且元素不多时,Redis会采用整数集合作为集合键的底层实现。

可以保存int16_t,int32_t, int64_t类型的整数值。集合中不会出现重复元素


5.1 整数集合的实现

inset结构:

    typedef struct inset{
        //编码方式
        uint32_t encoding;
        
        //集合包含的元素数量
        uint32_t length;
        
        //保存元素的数组
        int8_t contents[];
    }intset;

contents数组就是整数数组的底层实现,各个元素在数组中按数组大小排序,且不可重复

虽然contents数组类型是int8_t,但是数组不存储任何int8_t类型的元素,contents数组真正的类型取决于encoding的值


5.2 升级(upgrade)

当我们添加一个新元素到整数集合中,并且新元素的类型比整数集合中的所有元素类型都要长,那么整数集合需要先进行升级,才能添加此新元素。

添加新元素并升级步骤:

1. 根据新元素类型,拓展整数集合底层数组空间大小,并为新元素分配空间
2. 将底层数组已有元素全部转化成新元素相同类型,并放置到正确的位上,此过程要保持有序性不变
3. 添加新元素
4. 修改encoding

引发升级的新元素长度肯定大于数组内已存的所有元素,所以这个新元素的值要么大于所有现有元素,要么小于所有现有元素。
大于所有元素则插入在数组尾,小于所有元素则插入在数组头

升级的好处

  • 升级带来更好的灵活性:整数集合自适应各种不同类型;
  • 升级能够节省内存:确保扩展内存只在有需要的时候进行

5.3 降级

整数集合不支持降级操作,一旦数组类型升级,编码一直保持升级后的状态。

目录
相关文章
|
3月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
193 3
|
11月前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
119 5
|
6月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
8月前
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
221 7
|
9月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
140 5
|
11月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
98 3
|
11月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
114 2
|
11月前
|
算法 安全 Java
【用Java学习数据结构系列】探索Java集合框架的无尽秘密pro
【用Java学习数据结构系列】探索Java集合框架的无尽秘密pro
73 1
|
12月前
|
存储 NoSQL Redis
6)深度解密 Redis 的集合(Set)
6)深度解密 Redis 的集合(Set)
145 1
|
4月前
|
存储 NoSQL 算法
Redis设计与实现——数据结构与对象
Redis 是一个高性能的键值存储系统,其数据结构设计精妙且高效。主要包括以下几种核心数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表。此外,Redis 对象通过类型和编码方式动态转换,优化内存使用,并支持引用计数、共享对象和淘汰策略(如 LRU/LFU)。这些特性共同确保 Redis 在性能与灵活性之间的平衡。