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时间
网友评论