Redis入门到通关之数据结构解析-IntSet

文章目录

  • 概述
  • IntSet升级
  • 简易源码
  • 总结


在这里插入图片描述

欢迎来到 请回答1024 的博客

🍎🍎🍎欢迎来到 请回答1024的博客

关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。

博客特色: 在我的博客中,开设了如下专栏(点击可以进入专栏奥~): Java、MySQL、Redis、Spring、SpringBoot、SpringCloud、RabbitMQ、微服务、分布式 等相关技术专栏。期待与您一起,探索编程世界中的发现和创新之旅。

🌈我的主页 : https://reply1024.blog.csdn.net

敬请期待定期更新、见解和教程!让我们一起踏上这段编码冒险之旅!

数学与计算的边界 时间与空间的平衡 0与1的延伸

概述

IntSetRedis中set集合的一种实现方式,基于 整数数组 来实现,并且具备长度可变、有序等特征。
结构如下:

在这里插入图片描述

// intset 结构体定义
typedef struct intset {uint32_t encoding;   // 编码方式,用于表示存储的整数类型uint32_t length;     // intset 中包含的元素个数int8_t contents[];   // 存储整数的数组
} intset;

其中的 encoding 包含三种模式,表示存储的整数大小不同:

在这里插入图片描述

为了方便查找,Redis 会将 intset 中所有的整数按照 升序 依次保存在contents数组中,结构如图:

在这里插入图片描述


IntSet升级

假如现在,数组中每个数字都在 int16_t 的范围内,因此采用的编码方式是 INTSET_ENC_INT16,每部分占用的字节大小为:
encoding:4字节
length:4字节
contents:2字节 * 3 = 6字节

在这里插入图片描述
我们向该其中添加一个数字:50000,这个数字超出了 int16_t 的范围,intset 会自动 升级 编码方式到合适的大小。
以当前案例来说流程如下:

  • 升级编码为 INTSET_ENC_INT32, 每个整数占4字节,并按照新的编码方式及元素个数扩容数组
  • 倒序 依次将数组中的元素拷贝到扩容后的正确位置
  • 将待添加的元素放入数组末尾
  • 最后,将 inset 的 encoding 属性改为 INTSET_ENC_INT32 ,将 length 属性改为4
    在这里插入图片描述

简易源码

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>// intset 结构体定义
typedef struct intset {uint32_t encoding;   // 编码方式,用于表示存储的整数类型uint32_t length;     // intset 中包含的元素个数int8_t contents[];   // 存储整数的数组
} intset;// 创建一个新的 intset
intset *intset_new() {intset *is = malloc(sizeof(intset));if (!is) return NULL;is->encoding = 0;   // 初始编码方式为 0is->length = 0;return is;
}// 添加整数到 intset
intset *intset_add(intset *is, int64_t value) {// 添加元素的逻辑实现省略return is;
}// 检查整数是否存在于 intset
int intset_contains(const intset *is, int64_t value) {// 检查元素是否存在的逻辑实现省略return 0;
}// 删除整数从 intset
intset *intset_remove(intset *is, int64_t value) {// 删除元素的逻辑实现省略return is;
}// 打印 intset 中的元素
void intset_print(const intset *is) {printf("Intset Length: %d\n", is->length);printf("Intset Elements: ");for (int i = 0; i < is->length; ++i) {printf("%lld ", (long long)is->contents[i]);}printf("\n");
}int main() {intset *is = intset_new();if (!is) {printf("Error: Unable to create intset.\n");return 1;}is = intset_add(is, 5);is = intset_add(is, 10);is = intset_add(is, 15);intset_print(is);// 检查元素是否存在if (intset_contains(is, 10)) {printf("Element 10 exists in the intset.\n");} else {printf("Element 10 does not exist in the intset.\n");}is = intset_remove(is, 10);intset_print(is);free(is);return 0;
}

总结

Intset可以看做是特殊的整数数组,具备一些特点:

  • Redis会确保Intset中的元素唯一、有序
  • 具备类型升级机制,可以节省内存空间
  • 底层采用二分查找方式来查询

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

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

相关文章

负载均衡的原理及其算法详解

负载均衡的原理及其算法详解 一、负载均衡的原理 负载均衡是一种在计算机网络中分配资源和请求的技术&#xff0c;旨在将网络负载均匀地分布到多个服务器上&#xff0c;以提高系统的性能、可靠性和可扩展性。其基本原理可以归纳为以下几点&#xff1a; 会话保持&#xff1a;…

基于微信小程序的图书馆座位预约系统的设计与实现

基于微信小程序的图书馆座位预约系统的设计与实现 Design and Implementation of Seat Reservation System for Library Based on WeChat Mini Program 完整下载链接:基于微信小程序的图书馆座位预约系统的设计与实现 文章目录 基于微信小程序的图书馆座位预约系统的设计与实…

【SAP HANA 15】SQL锁表 (查询,解锁)

锁表查看 --锁表检查语句 SELECT C.CONNECTION_ID,PS.STATEMENT_STRINGFROM M_CONNECTIONS C JOIN M_PREPARED_STATEMENTS PSON C.CONNECTION_ID PS.CONNECTION_ID AND C.CURRENT_STATEMENT_ID PS.STATEMENT_IDWHERE C.CONNECTION_STATUS RUNNINGAND C.CONNECTION_TYPE Re…

HCIP-Datacom-ARST必选题库_36_加密算法【1道题】

一、单选 1.下加密算法中,哪一个需要公钥和私钥两种不同的秘钥配合使用? AES RSA DES 3DES

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

什么是健康管理——运动干预实训室

健康管理——运动干预实训室是一种专注于运动与健康科学相结合的教育实践平台&#xff0c;旨在通过模拟真实的健康管理环境&#xff0c;教授学生如何运用运动干预手段进行个体或群体的健康管理&#xff0c;培养具备运动处方设计、运动指导、健康评估和干预实施能力的专业人才。…

反射理解【精细】

目录 什么是反射 从编程的角度来说 : 从生活的角度来说 : Class类 记住一句话&#xff1a; 获取Class对象的三种方法 : 通过Class.forName&#xff08;"包名.类名"&#xff09;获取class对象 (方法一) 通过类名.class获取Class对象(方法二) 通过 对象.class …

什么是健康管理营养膳食实训室

健康管理营养膳食实训室是专为培养健康管理和营养学相关专业人才而设立的实践教学场所&#xff0c;它集成了现代化的教学设施与技术支持&#xff0c;致力于理论与实践相结合&#xff0c;着重于营养膳食的规划、设计、制作、评估以及健康管理全过程的模拟训练。此类实训室的核心…

Kafka重点笔记

Kafka重点笔记 默认端口号 9092 一、kafka将数据保存在哪里&#xff1f; kafka是将数据保存在磁盘。 二、离线计算、实时计算 离线计算&#xff1a;T1模式。处理的数据是静态数据&#xff0c;有界限&#xff0c;知道什么时候开始也知道什么时候结束。 实时计算&#xff1…

入门视觉(RM)

Opencv&#xff1a; 【youcans的OpenCV例程300篇】总目录-CSDN博客 ROS&#xff1a; Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 C&#xff1a; C 类 & 对象详解 - 知乎 (zhihu.com) Linux&#xff1a; 快速入门Linux操作系统学习笔记-CS…

MATLAB中Simulink.defaultModelTemplate用法

目录 语法 说明 示例 设置默认模型模板 获取默认模型模板 清除并恢复默认模型模板 Simulink.defaultModelTemplate的功能是设置或获取默认模型模板。 语法 Simulink.defaultModelTemplate(templatename) templatepath Simulink.defaultModelTemplate 说明 Simulink.d…

Elasticsearch与IK分词器:深度解析与实战应用

在当今大数据和云计算的时代&#xff0c;搜索引擎的重要性不言而喻。Elasticsearch作为一款强大的分布式搜索和分析引擎&#xff0c;被广泛应用于各种业务场景中。而IK分词器则是Elasticsearch中一款优秀的中文分词插件&#xff0c;对于中文文本的处理有着出色的表现。本文将详…

使用Jest测试框架测试JS项目

前言 JavaScript的测试框架有很多&#xff0c;这里主要记录一些自己在初次使用jest时遇到的一些问题。详细使用文档可以参照官方说明文档。 简介 Jest 是一款优雅、简洁的 JavaScript 测试框架。 Jest 支持 Babel、TypeScript、Node、React、Angular、Vue 等诸多框架&#…

蓝桥杯 BASIC-22 基础练习 FJ的字符串

蓝桥杯 BASIC-22 基础练习 FJ的字符串 问题描述 FJ在沙盘上写了这样一些字符串&#xff1a; A1 “A” A2 “ABA” A3 “ABACABA” A4 “ABACABADABACABA” … … 你能找出其中的规律并写所有的数列AN吗&#xff1f; 输入格式 仅有一个数&#xff1a;N ≤ 26。 输出格式 请输…

深度学习之基础模型——循环神经网络RNN

相关资料 &#xff08;1&#xff09;What are Recurrent Neural Networks? | IBM &#xff08;2&#xff09;浅析循环神经网络(RNN)的反向求导过程 - 知乎 (zhihu.com) 总共有四篇 &#xff08;3&#xff09;循环神经网络&#xff08;RNN&#xff09;浅析 - 简书 (jianshu.co…

【React】Day6

项目搭建 基于CRA创建项目 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start调整项目目录结构 -src-apis 项目接口函数-assets 项目资源文件&…

springboot3 集成knife4j

knife4j介绍 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。 springdoc地址&#xff1a;OpenAPI 3 Library for spring-boot Knife4j官网地址&#xff1a;Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 环境介绍 java&#xff1a;17 Spring…

java 溯本求源之基础(十八)之Monitoring--jmc

1.JMC概述 JMC全称Java Mission Control&#xff0c;集成了多个功能强大的组件&#xff0c;其中最核心的两部分是管理控制台和Java Flight Recorder。管理控制台允许开发者实时监控应用的运行状态&#xff0c;捕捉各种性能指标&#xff1b;而Java Flight Recorder则提供了一种高…

ELK日志系统的搭建

文章目录 简介软件准备安装JDK下载Elasticsearch软件修改配置信息创建ElasticSearch运行用户、启动服务添加防火墙策略ElasticSearch-Head插件安装 安装Kibana下载软件包修改配置启动服务 安装Logstash安装包下载安装服务配置修改配置pipeline流水线服务配置文件 启动服务 全流…

腾讯云轻量应用服务器和CVM S5服务器有什么区别?

腾讯云轻量应用服务器和CVM云服务器S5有什么不同&#xff1f;性能哪个更好一些&#xff1f;CVM S5云服务器CPU采用2.5GHz主频的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;轻量不支持指定CPU&#xff0c;从功能、内网连通性、集群及公网带宽等方面对…