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 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

JDK5中Lock锁的使用

(1)JDK5中Lock锁的使用   虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的...

731
来自专栏牛肉圆粉不加葱

(2) - apply, update 语法糖

语法糖,又称为糖衣语法,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说可以增加程序的可读性,从而减少程度代码出错的...

802
来自专栏Hongten

java_自由块(静态块和非静态块)

1572
来自专栏C语言及其他语言

[蓝桥杯]字符逆序

题目描述 将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。 输入 输入包括一行。 第一行输入的字符串。 输出 输出转换好的逆序字符串。...

3435
来自专栏HTML5学堂

PHP入门-常量基本规则

PHP入门-常量基本规则 HTML5学堂:本文是PHP的入门用文章,主要介绍PHP的常量的基本规则以及定义和获取方法。 前几天把PHP的基本语法以及变量的基本规...

37015
来自专栏从零开始学 Web 前端

*(int*)&p

分析: void(p)(); 这行代码定义了一个指针变量p,p指向一个函数。这个函数的参数和返回值都为void。 &p是求指针变量p本身的地址。 ...

3112
来自专栏风中追风

try,finally中都有return时程序的执行顺序

 在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家各有各的说法,刚好今天有个朋友问了...

36315
来自专栏程序员互动联盟

【专业技术第十二讲】void的妙用

存在问题: 遇到微信好友询问关于void *的用法,这里做一个总结性的回复。 解决方案: void的字面意思是空类型,void *的意思是空类型指针,void ...

35910
来自专栏C/C++基础

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

模板的实例化指函数模板(类模板)生成模板函数(模板类)的过程。对于函数模板而言,模板实例化之后,会生成一个真正的函数。而类模板经过实例化之后,只是完成了类的定义...

1382
来自专栏Hongten

python开发_copy(浅拷贝|深拷贝)_博主推荐

==================================================

933

扫码关注云+社区