Redis常见容器
简单动态字符串
优势:
- 尝试复杂度获取字符串长度
- 杜绝缓冲区溢出
- 减少修改字符串时带来的内存重分配次数
- 空间预分配
- 惰性空间释放
- 二进制安全(保存二进制文件)
- 兼容部分C字符串函数
链表
链表节点:
链表头:
字典
哈希表
哈希表节点:
字典
哈希算法与冲突解决
哈希计算:
# 使用字典设置的哈希函数,计算键key的哈希值
hash = dirct->type->hashFunction(key);
# 使用哈希表的sizemaks属性和哈希值,计算出索引值 根据情况不同,hx[x]可以时hx[0]或hx[1]
index = hash & dict->hx[x].sizemask;
冲突解决:
链地址法解决冲突
Rehash
条件:
过程:
方式:
渐进式rehash
跳跃表
整数集合
升级:
每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级( upgrade),然后才能将新元素添加到整数集合里面。
升级的优势:
- 提升灵活性
- 节约内存
压缩列表
节点:
previous_entry_length:
节点的 previous_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度。 previous_entry_length属性的长度可以是1字节或者5字节:
- 属性长度
- 当前一节点长度小于254字节时,采用1字节空间存储前一节点的长度
- 当前一节点长度大于等于255字节时,采用5字节空间存储前一节点的长度
encoding:
节点的encoding属性记录了节点的content属性所保存数据的类型以及长度。
- 属性长度
- 一字节、两字节或者五字节长,值的最高位为00、01或者10的是字节数组编码:这种编码表示节点的 content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录
- 一字节长,值的最高位以11开头的是整数编码:这种编码表示节点的 content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录;
content:
节点的 content属性负责保存节点的值,节点值可以是一个字节数组或者整数,值的类型和长度由节点的 encoding属性决定。
连锁更新问题:
插入时的连锁更新:
删除时的连锁更新:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传