redis底层数据结构之整数集合(intset)
整数集合(intset)
当一个集合只包含整数值元素,并且这个集合的元素数量不多时,redis会使用整数集合(intset)作为集合键的底层实现
整数集合用于保存整数值的集合抽象数据类型,它可以保存类型为int16_t、int32_t 或者int64_t 的整数值,并且保证集合中不会出现重复元素
它是一个有序不重复的连续空间
1 intset结构
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
其中:
encoding:编码类型,包含:int16_t,int32_t,int64_t
length:存放的元素数量
contents:存放元素的数组,从小到大排序
2 intset示意图
encoding=int16_t, 存有6个元素的intset示意图如下:

3 升级
编码由小到大:int16_t ----> int32_t ----> int64_t
当新增的元素类型比原集合元素类型的长度要大时,需要对整数集合进行升级,才能将新元素放入整数集合中,具体步骤:
1) 根据新元素类型,扩展整数集合底层数组的大小,并为新元素分配空间
2) 将底层数组现有的所有元素都转成与新元素相同类型的元素,并将转换后的元素放到正确的位置,放置过程中,维持整个元素顺序都是有序的
3) 将新元素添加到整数集合中,保证有序
4 降级
整数集合不支持降级操作,一旦对数组进行了升级,编码就会一直保持升级后的状态
redis底层数据结构之整数集合(intset)的更多相关文章
- Redis 底层数据结构之整数集合
文章参考:<Redis 设计与实现>黄建宏 整数集合 整数集合时集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合数量不多时,就会使用整数集合 typedef struct i ...
- Redis 的底层数据结构(整数集合)
当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现结构相对复杂并且会分配较多的内存空间. ...
- Redis数据结构之整数集合-intset
当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis会使用整数集合(intset)来存储集合元素. intset是紧凑的数组结构,同时支持16位.32位和64位整数. 结构 struc ...
- redis 底层数据结构 整数集合intset
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...
- Redis原理再学习05:数据结构-整数集合intset
intset介绍 intset 整数集合,当一个集合只有整数元素,且元素数量不多时,Redis 就会用整数集合作为集合键的底层实现. redis> SADD numbers 1 3 5 7 9 ...
- redis 系列8 数据结构之整数集合
一.概述 整数集合(intset)是集合键的底层实现之一, 当一个集合只包含整数值元素,并且这个集合元素数量不多时, Redis就会使用整数集合作为集合键的底层实现.下面创建一个只包含5个元素的集合键 ...
- 多图解释Redis的整数集合intset升级过程
redis源码分析系列文章 [Redis源码系列]在Liunx安装和常见API 为什么要从Redis源码分析 String底层实现——动态字符串SDS 双向链表都不懂,还说懂Redis? 面试官:说说 ...
- Redis数据结构之整数集合
整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t .int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素. 一.整数集合数据结构定义 参数说明: ...
- redis 5.0.7 源码阅读——整数集合intset
redis中整数集合intset相关的文件为:intset.h与intset.c intset的所有操作与操作一个排序整形数组 int a[N]类似,只是根据类型做了内存上的优化. 一.数据结构 ty ...
- 图解Redis之数据结构篇——整数集合
前言 整数集合(intset)并不是一个基础的数据结构,而是Redis自己设计的一种存储结构,是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时, Redis i ...
随机推荐
- P5683 [CSP-J2019 江西] 道路拆除
简要题意 给你一个 \(m\) 条边 \(n\) 个点的无向图.你需要去掉一些边,使得 \(1 \to s_1,1 \to s_2\) 连通,且 \(1 \to s_1\) 的最短路径长度小于 \(t ...
- 在Ubuntu上安装OpenShift并使用
服务器信息 在阿里云买了个抢占式的服务器,地区为华南广州,系统为Ubuntu 20.04,8核16GB. 安装Docker 命令如下: $ apt-get update -y $ apt-get up ...
- angular配置多个系统 配置动态路由,缩短模块初次加载时间,快速打开界面,优化用户访问体验
1.配置一个文件,返回系统名称 2.配置routes-routing.module.ts 引入文件 const system = 服务.getsystem() const allROUTES: {UR ...
- three.js一步一步来--如何画出构造辅助线
可以参考下面代码,粘贴上去就有了~ <template> <div class="container"> <h1>初步构造出辅助线</h1 ...
- 对象的反序列化流_ObjectInputStream类
对象的反序列化流_ObjectInputStream类 ObjectInputStream反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象. 构造方法 public ...
- DVWA靶场实战(十二)——XSS(Stored)
DVWA靶场实战(十二) 五.XSS(Stored): 1.漏洞原理: XSS的Stored被称作存储型XSS漏洞,漏洞的原理为语句被保存到服务器上,显示到HTML页面中,经常出现在用户评论的页面,攻 ...
- OpenMP For Construct dynamic 调度方式实现原理和源码分析
OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...
- 《Terraform 101 从入门到实践》 第四章 States状态管理
<Terraform 101 从入门到实践>这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看. 军书十二卷,卷卷有爷名. 为 ...
- Vue13 样式动态绑定
1 class样式的动态绑定 1.1 说明 通过命令v-bind:class设置一个对象,动态切换class.可以简写为:class. class=""可以和:class=&quo ...
- Vue 01 简介
1 官网 1)英文官网: https://vuejs.org/ 2)中文官网: https://cn.vuejs.org/ 2 介绍与描述 1) 动态构建用户界面的渐进式 JavaScript ...