1.Redis6.0之后,压缩列表不再是ziplist而是listpack,如下:
RPUSH testlist 1 2 3 "test"
> 4
OBJECT ENCODING testlist
> listpack
这是因为 ziplist 具有性能瓶颈,ziplist 的结构体保存了上一个数据所占的大小,而在新的 listpack 中,结构体不再保存上一个数据所占的大小,而是保存自身大小。
2.Redis 在保存整数集合时,使用的底层结构是 intset,顾名思义,保存的是无重复的整形数据。intset 包含当前值的集合,当前值的长度,以及当前值的编码类型,一共有16、32、64三种编码类型。这可以保证在存储时,根据存储数据的大小,来选用合适的编码类型,最大化的减少空间浪费。
同时 intset 有升级(upgrade)机制,如果目前存的编码类型是16位大小,这时候存入一个比如说42767,那么编码类型就会升级为32位,同时为了保证 intset 的大小顺序性,存的数据也会进行位置移动,这个时间复杂度为 O(n)。注意的是,只有升级,没有降级,也就是说,如果存入的是1,2,3,4,42767。突然42767被移除了,也不会降级为16位,这应该是防止频繁升级带来的位置移动造成的性能损耗。技术没有银弹,个人觉得Redis的这个设计已经很棒了。