redis数据结构

Posted xiaoovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis数据结构相关的知识,希望对你有一定的参考价值。

ZipList

ziplist是一种特殊的“双向链表”,由一系列特殊编码的连续内存组成,可以在任意一端进行压入和弹出。

ZipList的结构


ZipListEntry的结构


entry并不像普通双向链表节点用两个指针指向前后节点,为了节省空间。

  • previous_entry_length:前一个节点的长度,占1个或5个字节
    • 如果前一节点的长度小于254字节,则采用1个字节来保存这个长度值
    • 如果前一节点的长度大于254字节,则采用5个字节来保存这个长度值,第一个字节为0xfe,后面四个字节才是真实长度数据
  • encoding:编码属性,记录content的数据类型(字符串还是整数)以及长度,占用1个、2个或5个字节
  • contents:负责保存节点的数据,可以是字符串或者整数

ZipList连锁更新问题


因为在第一个节点插入了一个254大小的entry,导致后面一个节点的previous_entry_lenghth从1字节变成5字节,导致这个节点也变成254字节大小,所以后面的节点都跟着变大。

QuickList

QuickList是一个双向链表,但是其中的每个节点是ZipList。

为了避免QuickList中的每个ZipList中的entry过多,redis提供了一个配置项:list-max-ziplist-size来限制。

  • 如果为正,则代表ZipList的允许的entry个数的最大值。
  • 如果为负,则代表ZipList的最大内存大小,分5种情况:
    1. -1:每个ZipList的内存占用不能超过4kb
    2. -2:每个ZipList的内存占用不能超过8kb
    3. -3:每个ZipList的内存占用不能超过16kb
    4. -4:每个ZipList的内存占用不能超过32kb
      其默认值为-2。

除了控制ZipList的大小,QuickList还可以对节点的ZipList做压缩。通过配置项list-compress-depth来控制。因为链表一般都是从首尾访问比较多,所以首尾是不压缩的。这个参数是控制首尾不压缩的节点个数:

  1. 0:特殊值,代表不压缩
  2. 1:标识QuickList的首尾各有1个节点不压缩,中间节点压缩
  3. 2:标识QuickList的首尾各有2个节点不压缩,中间节点压缩
  4. 依此类推

QuickList的特点

  • 是一个节点为ZipList的双端链表
  • 节点采用ZipList,解决了传统链表的内存占用问题
  • 控制了ZipList大小,解决连续内存空间申请效率问题
  • 中间节点可以压缩,进一步节省内存

redis 命令执行过程

参考技术A

redis数据淘汰原理
redis过期数据删除策略
redis server事件模型
redis cluster mget 引发的讨论
redis 3.x windows 集群搭建
redis 命令执行过程
redis string底层数据结构
redis list底层数据结构
redis hash底层数据结构
redis set底层数据结构
redis zset底层数据结构
redis 客户端管理
redis 主从同步-slave端
redis 主从同步-master端
redis 主从超时检测
redis aof持久化
redis rdb持久化
redis 数据恢复过程
redis TTL实现原理
redis cluster集群建立
redis cluster集群选主

 这篇文章的目的是为了描述redis server在处理client命令的执行过程,大概包括流程图、源码、以及redis的命令格式说明,redis的通信协议参考自redis的 官网


 整个redis的server端命令执行过程就如下面这个流程图:



 nread = read(fd, c->querybuf+qblen, readlen);负责读取命令数,通过processInputBuffer进行下一步处理。


 核心在于processInlineBuffer处理内联命令,processMultibulkBuffer处理批量命令包括get/set等,核心的processCommand用于执行命令。


 执行命令的过程其实主要是寻找命令对应的执行函数,通过lookupCommand查找对应的执行命令,通过call执行命令。


 负责执行命令 c->cmd->proc 并更新统计信息,执行完成后负责同步数据 propagate


 主要是负责同步数据到AOF文件和slave节点,feedAppendOnlyFile负责同步到AOF文件,replicationFeedSlaves负责同步


 AOF涉及的缓存有多份,包括


 包含了命令和对应执行函数的映射关系,应该看上去很清晰命令。



协议的一般格式如下,注意前面的*或者$等字符,结尾的\\r\\n是分隔符。

其中, 回复中的第二个元素为空。


以上是关于redis数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Redis详解入门篇

redis入门

redis超详细入门教程

redis 命令执行过程

Redis入门教程

redis 一个数据库能存多少数据