Redis设计与实现-数据结构与对象.docx

Redis设计与实现-数据结构与对象.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
? ? Redis设计与实现 数据结构与对象 ? ? 前言 Redis是一个KV数据库,常用于实现缓存,因为基于内存实现,所以速度极快。最近阅读《Redis设计与实现》一书,整理几篇文章,本文介绍Redis数据结构相关内容。 I. 数据结构 我们通常说的Redis支持的数据类型有五种,包括字符串、哈希、列表、集合、有序集合,其实这只是存储的数据类型,底层用于存储数据的数据结构并不是这些,而是动态字符串(SDS)、链表、字典(哈希表)、跳跃表、整数集合、压缩列表。 Redis的每一种数据类型其底层所用的数据结构并不只有一种,往往会在合适的情况下采用合适的数据结构,也是基于性能考虑。对照下面导图,我们可以简单的了解每种数据类型有哪些数据结构实现方式。 下面具体介绍Redis中定义的几种数据结构。 动态字符串 SDS Redis中自定义了一个动态字符串取代了C语言中的字符串作为默认字符串数据结构,凡是可能会变化的字符串Redis都会用SDS作为实现。 用途: KV中键和值都会用 缓冲区:AOF缓冲区,客户端状态中的输入缓冲区 定义——ArrayList的感觉: struct sdshdr { int len; // 实际buf使用长度 int free; // 剩余长度 char buf[]; // 存储字节数据数组 } 优势: 记录了长度信息,获取长度 O ( 1 ) O(1) O(1)复杂度 自动扩容机制——缓冲区不会溢出(莫名其妙更改了别的内存空间数据) 空间预分配和惰性空间释放——减少增减字符串时带来的内存重分配次数 以 len 来判断数据结束——不仅仅可以存储字符,其实可以是二进制数据 双端链表 LinkedList Redis定义的双端链表其实也很正常,就是一个能够双向遍历,含有头尾指针的链表数据结构,当然也就具有链表的优势与劣势——增删快,查询慢。 用途: 列表底层实现之一(数量比较多或者元素都是比较长的字符串) 发布订阅、慢查询、监视器等功能 Redis保存多个客户端的状态信息 客户端输出缓冲区 节点定义——双向链表节点: typedef struct listNode{ struct listNode *prev; struct listNode *next; void *value; } 链表定义——双端双向链表: typedef struct list{ listNode *head; listNode *tail; unsigned long len; void *(*dup) (void *ptr); // 节点值复制函数 void (*free) (void *ptr); // 节点释放函数 int (*match) (void *ptr, void *key); // 节点值对比函数 } 优势: 双端双向——前后节点查询复杂度 O ( 1 ) O(1) O(1) 无环——首尾指针的指向都是 NULL 长度计数器 len——获取列表元素数量复杂度 O ( 1 ) O(1) O(1) 多态——节点使用 void* 指针保存节点值,可以是多态的 字典 HashTable 字典的实现也是一个Key-Value的映射,也就是Map数据结构,实现方法熟知的就是Java里的 HashMap 和 TreeMap。Redis实现的方式是 HashMap ,也就是利用hash表的方式。 用途: Redis数据库的实现,对于数据的增删改查都是基于字典的操作 哈希类型的底层实现之一 哈希节点定义——哈希表中的每个元素: typedef struct dicEntry { void *key; // 键 union { void *val; // 指针 uint64_t u64; // uint64_t整数 int64_t s64; // int64_t整数 } v; // 值有三种形式 struct dicEntry *next; // 指向下一个哈希节点,拉链法解决哈希碰撞 } dicEntry; 哈希表定义——存储数据元素: typedef struct dictht { dicEntry **table; // 哈希数组 unsigned long size; // 数组长度,会扩容的 unsigned long sizemask; /

文档评论(0)

科技之佳文库 + 关注
官方认证
内容提供者

科技赋能未来,创新改变生活!

版权声明书
用户编号:8131073104000017
认证主体重庆有云时代科技有限公司
IP属地上海
统一社会信用代码/组织机构代码
9150010832176858X3

1亿VIP精品文档

相关文档