Redis源码分析(四)——Redis数据结构-整数集合

1. 整数集合特点

  1. 有序:集合中所有值按照从小到大顺序排列。
  2. 不重复
  3. 可以存储int16_t、int32_t、int64_t三种类型的整数

1. 数据结构

typedef struct intset{
  unit32_t encoding;
  unit32_t length;
  int8_t contents[];
} intset;
  • encoding:content数组中存储的整数类型(int16_t、int32_t、int64_t三者之一)
  • length:contents数组中元素的个数
  • contents:整数数组

2. 升级

整数集合中可以存储int16_t、int32_t、int64_t这三种类型的整数,但在任一时刻,集合中所有元素的类型都是统一的。 如果当前集合存储的元素是int16_t类型,当需要存入一个int32_t类型的整数时,Redis会分配一片新的内存空间,将每个元素的类型提升为int32_t,再将所有元素迁移至新数组中。 这就是升级的过程。

3. 降级

一旦升级了之后,即使最大的那个元素已经删除,集合元素也是不会降级的。

4. 整数集合优点

4.1 灵活

整数集合可以通过自动升级底层数组来适应新元素,所以我们可以随意地将int16_t、int32_t、int64_t类型的整数添加到集合中,而不必担心类型错误。

4.2 节约内存

如果要用一个数组同时能够保存int16_t、int32_t、int64_t这三种类型的整数,那么只能创建一个int64_t类型的数组,而Redis整数集合可以保存三种类型的整数,只有当有需要的时候才进行升级操作,因此节约了内存。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青枫的专栏

Java培训实战教程之Java基础知识精华部分(四)(五)

763
来自专栏java一日一条

教你在Java接口中定义方法

接下来,SimpleTimeClient类实现了TimeClient接口,具体代码如下:

512
来自专栏上善若水

006android初级篇之jni数据类型映射

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)

883
来自专栏LuckQI

学习Java基础知识,打通面试关~十二接口与抽象类

924
来自专栏小樱的经验随笔

浅析ASCII、Unicode和UTF-8三种常见字符编码

什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),...

3356
来自专栏Golang语言社区

转--从面向对象的角度看Go语言与Java语言的区别

Go语言风格 GO语言是支持并发编程和内存垃圾回收的编译型静态类型语言,运行效率高,具有较强的可伸缩性(scalable)。它是为软件工程服务而进行的语言设计,...

2946
来自专栏Linux驱动

R0~R16寄存器作用

R0-R3     用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。 被调用函数在返回之前不必恢复 r0-r3。如果调用函...

2169
来自专栏java学习

ArrayList集合常用的方法详细讲解

在前面我们学习了数组,数组可以保存多个元素,但在某些情况下无法确定到底要保存多少个元素,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个...

924
来自专栏PHP技术

字符串和编码

字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才...

2687
来自专栏码云1024

c++ Struct和Class的区别

2043

扫码关注云+社区