dede 网站目录,百度权重4网站值多少钱,电商网站后台报价,能力天空的网站建设优劣势Redis系列之底层数据结构整数集IntSet
什么是IntSet
IntSet#xff0c;整数集合#xff0c;是Redis集合类型的一种底层数据结构#xff0c;当一个集合只包含整数值元素#xff0c;并且这个集合的元素数量不多时#xff0c;redis就会选用intset作为底层实现。
IntSet的数…Redis系列之底层数据结构整数集IntSet
什么是IntSet
IntSet整数集合是Redis集合类型的一种底层数据结构当一个集合只包含整数值元素并且这个集合的元素数量不多时redis就会选用intset作为底层实现。
IntSet的数据结构
查看redis6.0源码https://github.com/redis/redis/blob/6.0/src/intset.hinset的数据结构如图
typedef struct intset {uint32_t encoding;uint32_t length;int8_t contents[];
} intset;encoding表示编码方式取值有INTSET_ENC_INT16INTSET_ENC_INT32INTSET_ENC_INT64length代表存储的整数的个数contents实际存储数值的连续内存区域本质是一个数组。各个项在数组中按值的大小从小到大有序排序且数值中不包含重复项。总而言之就是一个有序不重复的数组。
intset数据结构图
set集合什么时候使用inset存储
Redis中使用intset或者hashtable存储set。什么情况使用intset存储
当集合对象可以同时满足以下两个条件时使用intset
集合对象保存的所有元素都是整数值如果不是整数值使用dictht hash表数组链表集合对象保存的元素数量不超过512个如果超过512个元素使用hashtable
跟一个Redis配置有关系 set-max-intset-entries 512intset数据结构和dictht hash对比这个dictht hash就是Redis中另外一种重要的数据结构dict
拓展知识点
整数集合的升级过程 例如在一个int16类型的整数集合中插入一个int32类型的值整个集合的所有元素都会转换成32类型。整个过程有3步
根据新元素的类型扩展整数集合底层数组的空间大小并为新元素的分配空间。将底层数组现有的所有元素都转换成与新元素相同的类型并将类型转换后的元素放置到正确的位上放置过程需要维持有序性。最后改变encoding的值length1。 ps那么如果删除刚加入的int32类型时会不会做一个降级操作呢不会。主要还是减少开销的权衡。