Redis 设计与实现(第六章) -- 整数集合(intset)

概述



1.intset概述

2.intset实现

3.intset升级

intset概述

整数集合是Redis集合键的底层实现之一,当值都为整数时,redis就会选择整数集合作为底层实现。

可以保存int16_t,int32_t,int64_t类型的整数值,并且集合中不会出现重复元素。

intset实现

先看下intset的数据结构:

typedef struct intset {
    uint32_t encoding;  //encoding方式
    uint32_t length;  //长度
    int8_t contents[]; //存储数组
} intset;

虽然contents[]声明了int8_t类型的数组,但实际上contents[]并不保存任何int8_t类型的数据,真正的数据类型取决于encoding的类型。

encoding类型有以下三种:

#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

intset升级

如果encoding类型为int_16,但是这时候需要保存个新元素,但是元素无法通过int16_t表示,这时就需要涉及到升级操作:

升级后所有元素会升级到对应升级后的类型,set中不会存在多种类型,而且升级后就无法降级;

升级步骤如下:

1.判断升级所需要的空间,分配空间大小;

2.将所有元素升级到与新元素相同的类型,并将转换类型后的元素添加到正确位置上;

3.将新元素添加到底层数组里面;

升级有什么好处?

1.提升灵活性

因为C是静态类型的,为了避免错误,通常不会将两种不同类型保存在同一个数据结构中;但是升级能够支持保存int16_t,int32_t,int64_t的数据;

2.节约空间

如果保存的数据只有int16_t,那分配一个int64_t的空间是造成空间的浪费,所以最开始值分配int16_t的空间,如果需要添加int32_t,int64_t的数据,再进行升级。

时间: 2024-08-04 00:36:12

Redis 设计与实现(第六章) -- 整数集合(intset)的相关文章

Redis 设计与实现(第九章) -- 数据库

概述 1.数据库结构 2.数据库键空间 3.键生存时间 4.持久化对过期键处理 5.数据库通知 1.数据库结构 Redis服务器将所有server状态都保存在数据结构中的db数组,服务器会根据dbnum来决定创建多个个数据库,默认为16个. struct redisServer { //数据结构里面有很多属性,这里只取了相关的两个来说明 /* General */ redisDb *db; int dbnum; }redisServer; 创建db后,如下所示: 同样的在redisClient的

使用Java实现面向对象编程——第六章 框架集合

1.集合框架包含的主要内容及彼此之间的关系: 图1:   集合框架:是为了表示和操作集合而统一规定的一种统一的标准体系结构.               包含三大块的内容:对外的接口.接口的是实现和对集合运算的算法: Java集合框架提供了一套性能优良.使用方便的接口和类,它们位于java.util包中:       ●接口:表示集合的抽象数据类型,在图1中用虚线框表示,下图绿色的:                    ●实现:集合框架中接口的具体实现,图1中一实线表示,粗实线表示常用的:上图

学习笔记-Redis设计与实现-整数集合

整数集合(intset)是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素不多时,Redis就会使用整数集合作为集合键的底层实现. 6.1 整数集合的实现 contents数组时整数集合的底层实现:整数集合的每个元素都是contents数组的一个数组项(item),各个项在数组中按值的大小从小到大有序地排列, 并且数组中不包含任何重复项. length属性记录了整数集合包含地元素数量,也即是contents数组的长度. contents数组的真正类型取决于encoding属性

《Redis设计与实现》读书笔记

花了几天时间把<Redis设计与实现>读完了,把一些心得记下来给大家分享. 第2章 简单动态字符串 redis里面的字符串对象都采用SDS结构实现.SDS有别于C风格的字符数组和java的String(定长).这种结构更像C++的String或者java的ArrayList<Character>.长度动态可变. redis的所有键值及字符串字面量都采用这种结构. 这一章节花了十几页去讲这个SDS结构,感觉全是废话,有时间建议去看ArrayList的源码. 第3章 链表 redis的

Redis设计与实现(一~五整合版)【搬运】

Redis设计与实现(一~五整合版) by @飘过的小牛 一 前言 项目中用到了redis,但用到的都是最最基本的功能,比如简单的slave机制,数据结构只使用了字符串.但是一直听说redis是一个很牛的开源项目,很多公司都在用.于是我就比较奇怪,这玩意不就和 memcache 差不多吗?仅仅是因为memcache是内存级别的,没有持久化功能.而redis支持持久化?难道这就是它的必杀技? 带着这个疑问,我在网上搜了一圈.发现有个叫做huangz的程序员针对redis写了一本书叫做<redis设

《Redis设计与实现》

<Redis设计与实现> 基本信息 作者: 黄健宏 丛书名: 数据库技术丛书 出版社:机械工业出版社 ISBN:9787111464747 上架时间:2014-6-3 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > 数据库理论 > 综合 更多关于>>> <Redis设计与实现>   内容简介 书籍 计算机书籍 <redis设计与实现>全面而完整地讲解了redis的内部机制与实现方式,

Redis设计与实现 pdf扫描版【65M】高清下载

<Redis设计与实现>全面而完整地讲解了Redis的内部机制与实现方式,对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,展示了这些功能的核心数据结构以及关键的算法思想,图示丰富,描述清晰,并给出大量参考信息.通过阅读本书,读者可以快速.有效地了解Redis的内部构造以及运作机制,更好.更高效地使用Redis. <Redis设计与实现>主要分为四大部分.第一部分“数据结构与对象”介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象的功能和性能.

Redis学习之intset整数集合源码分析

1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 3.intset可通过属性自定义编码方式(int16_t/int32_t/int64_t) 4.当往inset插入新元素时,如果新元素的类型比inset的原编码类型长,那么要先对inset进行"升级"操作 5.升级操作:(不可逆操作) 1)根据新元素的类型,扩展intset底层数组的空间

(转载)虚幻引擎3--第六章 –函数

第六章 –函数 6.1概述 指南 6.1环境生物, 第一部分:基类声明 指南 6.2 环境生物, 第二部分:类的变量声明 指南 6.3 环境生物,第三部分:渲染及光照组件 指南 6.4 环境生物, 第四部分:碰撞及物理属性 6.2 函数声明 指南 6.5 环境生物, 第五部分: SETRANDDEST() 函数 6.3函数修饰符 Static Native Final Singular NoExport Exec Latent Iterator Simulated Server Client R