- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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; /
您可能关注的文档
- Python网络程序设计教学要点与案例分享.docx
- python网络通信器设计.docx
- Python计算生态概览.docx
- Python设计模式面向对象编程.docx
- Python语言程序设计-学习笔记和练习.docx
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- 中国行业标准 GM/T 0126-2023HTML密码应用置标语法.pdf
- 《JJF 2121-2024恒转速源校准规范》.pdf
- 餐饮服务中20条处理要点.docx
- 《GM/T 0011-2023可信计算 可信密码支撑平台功能与接口规范》.pdf
- 《JJF 2134-2024旋转流变仪校准规范》.pdf
- JJF 2121-2024恒转速源校准规范.pdf
- 计量规程规范 JJF 2121-2024恒转速源校准规范.pdf
- 《JJF 2118-2024压力式六氟化硫气体密度控制器校验仪校准规范》.pdf
- JJF 2134-2024旋转流变仪校准规范.pdf
- 计量规程规范 JJF 2134-2024旋转流变仪校准规范.pdf
文档评论(0)