《redis设计与实现》读书笔记一

2019-02-16  本文已影响10人  真实的追梦者

Redis构建了一种简单动态字符串(SDS),并将SDS用作redis的默认字符串表示

通过使用SDS,将获取字符串长度所需的复杂度从o(n)降到了o(1)

SDS杜绝了缓冲区溢出,因为它在修改之前会判断空间是否满足需求

当对一个SDS进行修改时,程序不仅会分配修改所必要的空间,还会分配额外未使用的空间,从而减少内存分配的次数

惰性释放空间,当缩短字符串时,程序并不立即回收释放的字节,而是使用 free 属性记录,等待将来使用

二进制安全,通过len属性的值来判断字符串是否结束

redis链表特性:

双端,链表节点带有prev和next指针,

无环,对链表的访问以null为终点

带表头指针和表尾指针

带链表长度计数器

多态,链表可以保存不同类型的值

Redis哈希表使用链地址法来解决冲突,每个哈希表节点都有一个next指针,被分到同一个索引上的多个节点可以使用next指针链接

Rehash:为ht[1]分配空间;将ht[0]的所有键值对rehash到ht[1];释放ht[0],将ht[1]设置为ht[0],并创建新的空哈希表,渐进式rehash会维持rehashidx变量,用来表示工作进度

跳表的跨度用来计算排位,在跳跃表中,可以包含相同的分值,但节点的成员对象必须是唯一的

整数集合:以有序,无重复的方式保存集合元素,支持升级操作

压缩列表可以包含多个节点,添加或删除节点有可能引发连锁更新操作

 Redis根据不同的使用场景来为一个对象设置不同的编码,从而优化使用效率

有序集合的一种底层实现方式是包含一个字典和跳跃表

执行命令之前会先检查类型,并且根据实现的具体方式执行不同的函数

通过使用引用计数的方式来实现内存回收

为了节约内存,redis对只包含整数值得字符串对象进行共享

空转时长,指当前时间减去对象的lru时间

上一篇下一篇

猜你喜欢

热点阅读