一、redis原理之set底层数据结构?
其底层有两种实现方式:
1.当value是整数值时,且数据量不大时使用inset来存储,
2.其他情况都是用字典dict来存储
inset的结构:
typedf struct inset{
uint32_t encoding;//编码方式 有三种 默认 INSET_ENC_INT16
uint32_t length;//集合元素个数
int8_t contents[];//实际存储元素的数组
//元素类型并不一定是ini8_t类型,柔性数组不占intset结构体大小,并且数组中的元
//素从小到大排列
}inset;
编码格式encoding:共有三种,INTSET_ENC_INT16、INSET_ENC_INT32和INSET_ENC_INT64三种,分别对应不同的范围。Redis为了尽可能地节省内存,会根据插入数据的大小选择不一样的类型来进行存储。
元素数量length:记录了保存数据的数组contents中共有多少个元素,这样获取个数的时间复杂度就是O(1)。
数组contents:真正存储数据的地方,数组是按照从小到大有序排列的,并且不包含任何重复项。
优点:根据存入的数据大小选择合适的编码方式,且只在必要的时候进行升级操作,节省内存
缺点:升级过程耗费系统资源,还有就是不支持降级,一旦升级就不可以降级