当前位置: 首页 > news >正文

原理Redis-IntSet

IntSet


IntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特征。

结构如下:

typedef struct intset {uint32_t encoding; /* 编码方式,支持存放16位、32位、64位整数*/uint32_t length; /* 元素个数 */int8_t contents[]; /* 整数数组,保存集合数据*/
} intset;

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

/* Note that these encodings are ordered, so:* INTSET_ENC_INT16 < INTSET_ENC_INT32 < INTSET_ENC_INT64. */
#define INTSET_ENC_INT16 (sizeof(int16_t)) /* 2字节整数,范围类似java的short*/
#define INTSET_ENC_INT32 (sizeof(int32_t)) /* 4字节整数,范围类似java的int */
#define INTSET_ENC_INT64 (sizeof(int64_t)) /* 8字节整数,范围类似java的long */

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

在这里插入图片描述

现在,数组中每个数字都在int16_t的范围内,因此采用的编码方式是INTSET_ENC_INT16,每部分占用的字节大小为:

  • encoding:4字节
  • length:4字节
  • contents:2字节 * 3 = 6字节

IntSet升级

现在,假设有一个intset,元素为{5,10,20},采用的编码是INTSET_ENC_INT16,则每个整数占2字节:

在这里插入图片描述

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

  • 1.升级编码为INTSET_ENC_INT32, 每个整数占4字节,并按照新的编码方式及元素个数扩容数组

  • 2.倒序依次将数组中的元素拷贝到扩容后的正确位置

  • 3.将待添加的元素放入数组末尾

  • 4.最后,将inset的encoding属性改为INTSET_ENC_INT32,将length属性改为4

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

  • 1.Redis会确保Intset中的元素唯一、有序
  • 2.具备类型升级机制,可以节省内存空间
  • 3.底层采用二分查找方式来查询
http://www.lryc.cn/news/239991.html

相关文章:

  • 逸学java【初级菜鸟篇】9.3 Stream流
  • html页面直接使用elementui Plus时间线 + vue3
  • 信息压缩模型在自然语言处理中的应用和探讨
  • 新版mmdetection3d将3D bbox绘制到图像
  • 合伙人注册即得/创业平台扶持!
  • 02_使用API_String
  • Spring IOC/DI和MVC及若依对应介绍
  • python的多层嵌套循环时,break可以退出多层循环吗?
  • 链表OJ--上
  • 内衣洗衣机哪些品牌质量好实惠?小型洗衣机全自动
  • 推荐一款适合做智慧旅游的前端模板
  • VL06O报表添加增强字段
  • SpringBoot Admin
  • Java基础-----正则表达式
  • 基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】
  • 如何用CHAT解释文章含义?
  • 创作4周年
  • 《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage
  • Apahce虚拟主机配置演示
  • 加班做报表被嘲低效!快用大数据分析工具
  • 详解——菱形继承及菱形虚拟继承
  • 路由的控制与转发原理
  • ios qt开发要点
  • 免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
  • ChatGPT最强?文心一言与ChatGPT对比
  • 算法通关村第十二关|青铜|字符串转换整数
  • CSS实现空心的“尖角”
  • 算法 全排列的应用
  • 环境配置|GitHub——如何在github上搭建自己写的网站
  • Windows系统中curl和wget命令下载说明