redis-原理-数据结构-整数集合(五)

什么是整数集合

集合键的底层(intset)实现之一,当一个集合只包含数值,并且数值的元素并不多时,就会选择使用整数集合作为底层实现,

本地:0>sadd number 1 2 5 6
4
本地:0>object encoding number
intset

整数集合结构定义

注:虽然contens类型为int_8但是真正保存的保存的类型取决于encoding的值

如果length是4 encoding长度是int64 则整个数组占用4*64=256(size)

几种编码格式的范围

int_16  范围:-32786~32767

Int_32 范围:-2147483648~2147483647

int_64 范围:-9223372036854775808~9223372036854775807

升级

注:因为添加元素都有可能产生升级所以复杂度是0(N)

如果将一个新元素加入到集合,并且这个元素类型的长度比集合所有类型都要长时就会触发升级

比如集合包含int16的元素1,2,3,因为没有元素占16位,所以三个元素占3*16=48位空间

现在将int32位65535添加到集合,触发升级

1.首先根据新的元素类型占用长度对底层数组进行重新分配加上新的元素一共是4个元素,所需空间是4*32=128

2.因为新的元素占用的还是前48位所以要将这3个元素放到正确的位上

 

 

 3.然后将新的元素放到新分配的空间上(注意整数集合是有序的,如果插入的是2 则会将原有的3后移动)

 

 4.最后将encoding的类型改为int32

升级的好处

1.节约内存,不需要直接使用int64,而是按需升级

2.提高灵活性,因为我们一般通过声明不同类型的数组类型 比如int32 存储32位 int64存储64,通过升级无须关系多少位自动升级适配

降级

不支持降级

api

 

posted @ 2021-03-13 14:18  意犹未尽  阅读(59)  评论(0编辑  收藏  举报