redis底层数据结构——整数集合

news2025/2/15 14:35:56

文章目录

  • 定义
  • 内部实现
  • 升级
  • 升级的好处
    • 提升灵活性
    • 节约内存
  • 降级
  • 总结

定义

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

内部实现

整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为 int16_t、int32_t 或者 int64_t 的整数值,并且保证集合中不会出现重复元素。

``
typedef struct intset {

//编码方式
uint32_t encoding;

//集合包含的元素数量
uint32_t length;

//保存元素的数组
int8_t contentst[] ;

} intset ;
``

  • contents数组是整数集合的底层实现:整数集合的每个元素都是contents数组的个数组项(item),各个项在数组中按值的大小从小到大有序地排列,并且数组中不包含任何重复项。
  • length属性记录了整数集合包含的元素数量,也即是contents数组的长度。
  • encoding实际编码。

升级

每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级(upgrade),然后才能将新元素添加到整数集合里面。

升级整数集合并添加新元素共分为三步进行:

  • 1)根据新元素的类型,扩展整数集合底层数组的空间大小,并为新元素分配空间。
  • 2)将底层数组现有的所有元素都转换成与新元素相同的类型,并将类型转换后的元素放置到正确的位上,而且在放置元素的过程中,需要继续维持底层数组的有序性质不变。
  • 3)将新元素添加到底层数组里面。

因为每次向整数集合添加新元素都可能会引起升级,而每次升级都需要对底层数组中已有的所有元素进行类型转换,所以向整数集合添加新元素的时间复杂度为O(M)。

升级的好处

整数集合的升级策略有两个好处,一个是提升整数集合的灵活性,另一个是尽可能地节约内存。

提升灵活性

因为C语言是静态类型语言,为了避免类型错误,我们通常不会将两种不同类型的值放在同一个数据结构里面。

但是,因为整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将 int16t、int32t或者int64t类型的整数添加到集合中,而不必担心出现类型错误这种做法非常灵活。

节约内存

当然,要让一个数组可以同时保存int16_t、int32_t、int64_t三种类型的值,最简单的做法就是直接使用int64_t类型的数组作为整数集合的底层实现。不过这样一来,即便添加到整数集合里面的都是int16_t类型或者int32.t类型的值,数组都需要使用int64t类型的空间去保存它们,从而出现浪费内存的情况。

而整数集合现在的做法既可以让集合能同时保存三种不同类型的值,又可以确保升级操作只会在有需要的时候进行,这可以尽量节省内存。

降级

整数集合不支持降级操作,一且对数组进行了升级,编码就会一直保持升级后的状态。 这点比较特别,因为大多数的场景都是有升级就有降级。不做降级的考虑是实现方便,无需考虑频繁进行升级降级的变化。

总结

  • 整数集合是集合键的底层实现之一
  • 整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数组的类型。
  • 升级操作为整数集合带来了操作上的灵活性,并且尽可能地节约了内存。整数集合只支持升级操作,不支持降级操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ECP在Successfactors中paylisp越南语乱码问题

导读 pyalisp:ECP中显示工资单有两种方式,一种是PE51,一种是hrform,PE51就是划线的那种, 海外使用的比较多,国内基本没人使用,hrform就是pdf,可以编辑pdf,这个国内相对使用的人 比…

PDF另存为图片的一个方法

说明 有时需要把PDF的每一页另存为图片。用Devexpress可以很方便的完成这个功能。 窗体上放置一个PdfViewer。 然后循环每一页 for (int i 1; i < pdfViewer1.PageCount; i) 调用 chg_pdf_to_bmp函数获得图片并保存 chg_pdf_to_bmp中调用了PdfViewer的CreateBitmap函数…

本地部署DeepSeek集成VSCode创建自己的AI助手

文章目录 安装Ollama和CodeGPT安装Ollama安装CodeGPT 下载并配置DeepSeek模型下载聊天模型&#xff08;deepseek-r1:1.5b&#xff09;下载自动补全模型&#xff08;deepseek-coder:1.3b&#xff09; 使用DeepSeek进行编程辅助配置CodeGPT使用DeepSeek模型开始使用AI助手 ✍️相…

无人机雨季应急救灾技术详解

无人机在雨季应急救灾中发挥着至关重要的作用&#xff0c;其凭借机动灵活、反应迅速、高效安全等特点&#xff0c;为救灾工作提供了强有力的技术支撑。以下是对无人机雨季应急救灾技术的详细解析&#xff1a; 一、无人机在雨季应急救灾中的应用场景 1. 灾情侦查与监测 无人机…

DeepSeek本地化部署【window下安装】【linux下安装】

一、window 本地安装指导 1.1、下载window安装包 https://ollama.com/download/OllamaSetup.exe 1.2、点击下载好的安装包进行安装 检测安装是否成功&#xff1a; C:\Users\admin>ollama -v ollama version is 0.5.7有上面的输出&#xff0c;则证明已经安装成功。 配置…

Ae:常见的光照控件和材质控件

在 After Effects中&#xff0c;几种模拟效果都有类似的光照控件和材质控件&#xff0c;比如&#xff0c;焦散、卡片动画、碎片等。 光照控件和材质控件允许用户模拟不同光源、阴影和高光效果&#xff0c;控制表面反射特性&#xff0c;从而实现真实的光照和反射模拟。适用于材质…

【鸿蒙开发】第三十章 应用稳定性-检测、分析、优化、运维汇总

目录​​​​​​​ 1 概述 2 使用Asan检测内存错误 2.1 背景 2.2 原理概述 2.3 使用约束 2.4 配置参数 2.4.1 在app.json5中配置环境变量 2.4.2 在Run/Debug Configurations中配置环境变量 2.5 Asan使能 方式一 方式二 运行ASan 2.6 ASan异常检测类型 heap-buf…

Linux软件编程:IO编程

IO&#xff08;linux输入输出&#xff09; 1. IO概念&#xff1a; I&#xff1a;输入 O&#xff1a;输出 Linux 一切皆是文件 屏幕 -> /dev/tty 磁盘 -> /dev/sda 网卡 键盘 -> /dev/event 鼠标-> /dev/mice 都是一个文件 2. IO操作的对象&#xff1a; 文件 3. 文…

javaEE2

maven 搭建 前后端交互 HTML servlet 后台和数据库交互 servlet jdbc 未来 servlet-->springmvc jdbc-->mybatis-->mybatisplus/jpa javaee-->spring-->springboot SERVLET tomcat ~Apache 服务 Apache(音译为阿帕奇)是世界上使用排名第一的Web服务器…

2025最新深度学习pytorch完整配置:conda/jupyter/vscode

从今天开始&#xff0c;开始一个新的专栏&#xff0c;更新深度学习相关的内容&#xff0c;从入门到精通&#xff0c;首先的首先是关于环境的配置指南&#xff1a;工欲善其事必先利其器&#xff01; PyTorch 是由 Facebook&#xff08;现 Meta&#xff09;开发的 开源深度学习框…

华为小艺助手接入DeepSeek,升级鸿蒙HarmonyOS NEXT即可体验

小艺助手接入DeepSeek的背景与意义 随着人工智能技术的不断发展&#xff0c;大模型成为推动智能交互升级的关键力量。DeepSeek在自然语言处理等领域具有出色的表现&#xff0c;其模型在语言理解、生成等方面展现出强大的能力。华为小艺助手接入DeepSeek&#xff0c;旨在借助其先…

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…

【STM32】增量型旋钮编码器

1.增量型旋钮编码器原理 该编码器有A&#xff0c;B两相&#xff0c;当顺时针旋转时 B相会提前A相90度&#xff08;匀速转的时候&#xff09;&#xff0c;也就是A相上升沿时&#xff0c;B相对应高电平&#xff0c;计数器会1&#xff0c;A相下降沿时&#xff0c;B相为低电平时&…

电动汽车电池监测平台系统设计(论文+源码+图纸)

1总体设计 本次基于单片机的电池监测平台系统设计&#xff0c;其整个系统架构如图2.1所示&#xff0c;其采用STC89C52单片机作为控制器&#xff0c;结合ACS712电流传感器、TLC1543模数转换器、LCD液晶、DS18B20温度传感器构成整个系统&#xff0c;在功能上可以实现电压、电流、…

DeepSeek助力:打造属于你的GPTs智能AI助手

文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…

C语言基础系列【12】运算符

博主介绍&#xff1a;程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章&#xff0c;首发gzh&#xff0c;见文末&#x1f447;&#x1f…

服务器之连接简介(Detailed Explanation of Server Connection)

一台服务器最大能支持多少连接&#xff1f;一台客户端机器最多能发起多少条连接&#xff1f;&#xff1f; 我们知道TCP连接&#xff0c;从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】&#xff08;这里也对应着TCP四元组&#xff1a;源IP、源端口、…

华为2288H V5服务器无法启动问题处理

问题&#xff1a;通电后服务器前面显示888&#xff0c;点击电源键没有反应 一.通过管理口管理服务器硬件设备 华为2288H V5它默认的IP是192.168.2.100 网关是255.255.255.0 2.将网线一头连接服务器的Mgmt口&#xff0c;另一头来连接笔记本的网口&#xff0c;将笔记本的的本地…

华宇TAS应用中间件与因朵科技多款产品完成兼容互认证

在数字化浪潮澎湃向前的当下&#xff0c;信息技术的深度融合与协同发展成为推动各行业创新变革的关键力量。近日&#xff0c;华宇TAS应用中间件携手河北因朵科技有限公司&#xff0c;完成了多项核心产品的兼容互认证。 此次兼容性测试的良好表现&#xff0c;为双方的进一步深入…

第36天:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入

时间轴&#xff1a; 演示案例&#xff1a; Java-三方组件-Log4J&JNDI Java-三方组件-FastJson&反射 Maven的下载及配置&#xff1a; IDEA配置Maven的超详细步骤_java_脚本之家 Java-三方组件-Log4J&JNDI JNDI 注入&#xff1a; ( 见图 ) Java Naming and Dire…