栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

redis底层数据结构之IntSet

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

redis底层数据结构之IntSet

IntSet这种数据结构基于整数数组实现,并且具备长度可变,有序等特征

其中整数存储的范围并不由int8_t的类型决定,而是由encodeing决定,encoding包含三种模式,表示的存储范围不同 

为了方便查找,redis会将IntSet中所有的整数按照升序依次保存在contents数组中 

由于数组中每个数字都在int16_t的范围内,因此采用的编码方式为INTSET_ENC_INT16,此时,每部分占用的内存大小为

encoding:固定4字节

length:固定4字节 

contents:编码为INTSET_ENC_INT16即每个数字占两个字节*3个数字=6字节

当插入新数据时,首先会考虑新插入的数据当前编码方式能否存下

        如果不能则需要进行编码升级,此时contents数组每个元素所占的字节将会变大,此时会将数组中的元素拷贝到扩容后的的正确位置,然后将新数据插入到数组尾或头(新数据只有小于当前数组最小值或大于最大值时才会触发扩容操作),最后修改IntSet头信息,即编码方式和数组长度。

        如果能存下,则在数组中查找是否有重复值,如果有,则不用插入。如果没有,则将数组扩容后插入合适的位置(有序,使用二分搜索保证有序性),最后修改IntSet头信息,即编码方式和数组长度。

总结:IntSet是一种特殊的整数数组,具备下列特点

1.IntSet中的元素具有唯一性和有序性

2.具备类型升级机制,可以节省内存空间(当存储的数字在一定范围内时,会使用特定的编码方式(比如 -32768

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035193.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号