redis(Remote Dictionary Service) 底层数据结构

redis 底层数据结构

动态字符串SDS

redis(Remote Dictionary Service) 底层数据结构_第1张图片

优点
  • 获取字符串长度的时间复杂度O(1)
支持动态扩容,减少内存分配次数

新字符串小于1M – 新空间为扩展后字符串长度的两倍 + 1
新字符串大于1M – 新空间为扩展后字符串长度 + 1M + 1. 内存预分配

  • 二进制安全(记录了字符串长度)

IntSet

redis(Remote Dictionary Service) 底层数据结构_第2张图片

IntSet升级流程

redis(Remote Dictionary Service) 底层数据结构_第3张图片

Dict

redis(Remote Dictionary Service) 底层数据结构_第4张图片

扩容

条件:

  • 哈希表的LoadFactor(负载因子) >= 1 且服务器没有执行bgsave 或者bgrewriteaof等后台进程
  • 负载因子 > 5
收缩

条件 负载因子小于0.1

rehash

redis(Remote Dictionary Service) 底层数据结构_第5张图片

ZipList 特殊的“双端链表(具备双端链表的许多特性)” [为了节省内存设计]

由一系列特殊编码的连续内存块组成,可以在任意一端以O(1)时间复杂度进行压入/弹出操作。

redis(Remote Dictionary Service) 底层数据结构_第6张图片
redis(Remote Dictionary Service) 底层数据结构_第7张图片

ZipList的连锁更新问题

ZipList的每个Entry都包含previous_entry_length来记录上一个节点的大小:

  • 前一节点的长度小于254字节,previous_entry_length 1个字节
  • 前一节点的长度大于254字节,previous_entry_length 5个字节

QuickList

每个节点是一个ZipList的双端链表,可以对节点的ZipList做压缩。
list-max-ziplist-size:
redis(Remote Dictionary Service) 底层数据结构_第8张图片

list-compress-depth [控制首尾不压缩的节点个数]

redis(Remote Dictionary Service) 底层数据结构_第9张图片
redis(Remote Dictionary Service) 底层数据结构_第10张图片
redis(Remote Dictionary Service) 底层数据结构_第11张图片

SkipList

redis(Remote Dictionary Service) 底层数据结构_第12张图片

RedisObject

redis(Remote Dictionary Service) 底层数据结构_第13张图片

redis(Remote Dictionary Service) 底层数据结构_第14张图片

你可能感兴趣的:(java学习笔记,redis,数据结构,数据库)