《Redis设计与实现》

《Redis设计与实现》简读

杀马特。学长 韩版系。学妹 提交于 2020-03-26 14:49:22
3 月,跳不动了?>>> 一、数据结构与对象 简单动态字符串(SDS) 相比C字符串增加记录字符串长度的,获取字符串长度复杂度为O(1) 相比C字符串增加记录已分配内存空间,可以避免缓冲区溢出 空间预分配和空间惰性释放 二进制安全,不是以空字符(\0)来判断字符串是否结束 遵循C字符串以空字符结尾的惯例,可以兼容部分C字符串函数 关于空间预分配和空间惰性释放 字符串增长操作时,如果修改后长度小于1M则分配该字符串长度2倍的内存空间,如果修改后长度大于等于1M则分配该字符串长度+1M的内存空间。(预分配,避免每次增长操作都需要进行内存重分配执行系统调用) 字符串缩短操作时,程序不会立即释放缩短后多出来的字节,而是在需要时再释放。(惰性释放,避免以后需要增长操作时重分配内存,会在较短的时间内造成内存浪费,文中未提及何时是“需要时”) 最佳实践:因为对字符串的增长或缩短操作都有可能需要执行内存重分配,所以修改相同键使用SDS类型保存的值时保持修改前后长度一致。 链表 双端,获取某节点前后置节点对复杂度为O(1) 无环,表头prev指针和表尾next指针都指向NULL 记录表头尾节点,获取表头尾节点的复杂度为O(1) 记录链表长度,获取链表长度复杂度为O(1) 空指针保存值,可以保存各种不同类型的值 字典 使用链地址法解决冲突,当多个键被分配到相同哈希索引时将新键添加到节点链表表头