- 1、本文档共44页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
Redis知识点总结及常见问题
?
?
Redis设计与实现阅读笔记
简单动态字符串
链表
字典
跳跃表
整数集合
压缩列表
对象
数据库
RDB持久化
AOF持久化
复制
Sentinel
集群
LUA脚本
缓存穿透
缓存雪崩
缓存击穿
数据一致性
简单动态字符串
Redis没有使用传的c语言字符串表示,而是构造了一种简单动态字符串(simple dynamic string,SDS)的抽象类型,作为Redis的默认字符串表示。
struct sdshdr {
//记录buf数组中已使用的字节的数量
//等于SDS所保存字符串的长度
int len;
//记录buf数组中未使用字节的数量
int free;
//字节数组,用于保存字符串
char buf[];
};
通过使用SDS带来的优势
c语言字符串(获取长度需要遍历),SDS获取字符串长度所需的复杂度O(N)降低带了O(1),确保获取字符串长度不会成为Redis的性能瓶颈。
杜绝了缓存区溢出
减少了修改字符串时带来的内存重分配次数(内存预分配、惰性空间释放)
二进制安全
兼容部分C字符串函数
C字符串
SDS
获取字符串长度的复杂度为O(N)
获取字符串长度的复杂度为O(1)
API是不安全的,可能会造成缓冲区溢出
API是安全的,不会造成缓冲区溢出
修改字符串长度N次必然需要执行N次内存重分配
修改字符串长度N次最多需要执行N次内存重分配
只能保存文本数据
可以保存文本或者二进制数据
可以使用所有string.h库中的函数
可以使用一部分string.h库中的函数
链表
链表和链表节点的实现
typedef struct listNode{
//前置节点
struct listNode *prev
//后置接点
struct listNode *next
//节点的值
void *value
} listNode;
多个listNode可以通过prev和next指针组成双端链表listNode结构就可以组成链表,但用list来持有链表的话,操作会更方便
typedef struct list{
//表头节点
listNode*head;
//表尾节点
listNode*tail;
//链表锁包含的节点数量
unsigned long len;
//节点值赋值函数,dup函数用于复制链表节点所保存的值
void *(*dup)(void *ptr);
//节点值释放函数,free函数用于释放链表节点所保存的值
void (*free)(void *ptr);
//节点值对比函数,match函数用于对比链表节点所保存的值和另一个输入值是否相等
int (*match)(void *ptr,void *key);
} list;
list结构和三个listNode结构组成的链表
Redis的链表实现的特性可以总结如下:
双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)
无环:表头节点prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点
带表头指针和表尾指针:通过list结构的head指针来对list持有的链表节点进行计数,程序获取链表的表头节点和表尾节点的复杂度为O(1)
带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)
多态:链表节点使用void*指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。
字典
Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表结点就保存了字典中的一个键值对。哈希表
typedef struct dictht {
// 哈希表数组
dictEntry **table;
// 哈希表大小
unsigned long size;
//哈希表大小掩码,用于计算索引值
//总是等于size-1
unsigned long sizemask;
//
}
一个大小为4的空哈希表(没有包含任何键值对)哈希表节点
typedef struct dictEntry{
//键
void *key
//值
union{
void *val;
uint64_t u64;
int64_t s64;
} v;
//指向下个哈希表节点,形成链表
struct dictEnt
您可能关注的文档
- Python网络程序设计教学要点与案例分享.docx
- python网络通信器设计.docx
- Python计算生态概览.docx
- Python设计模式面向对象编程.docx
- Python语言程序设计-学习笔记和练习.docx
- Python语言程序设计-学习笔记和课后练习.docx
- Python语言程序设计-文件和数据格式化.docx
- Python语言程序设计基础.docx
- Python课程设计爬虫篇.docx
- QT学习1:设计可视化窗口的框架-Ui-Class.docx
- 功能设计_MM_MM015_报废单_20080109_v2.0.doc
- 功能设计_MM_MM021_采购订单批导入程序_20080108_v1.0.doc
- 功能设计_MM_MM020_出库单_20071205_v2.1.doc
- 功能设计_MM_MM019_入库单_20071205_v2.1.doc
- 功能设计_MM_MM018_领料单_20080114_v2.0.doc
- 功能设计_MM_MM016_ERP与招投标系统接口_20080327_v1.2.doc
- 功能设计_MM_MM014_退库单_20080109_v1.0.doc
- 功能设计_MM_MM013_物料盘点清单_20080114_v2.0.doc
- 中考数学知识点10 一元一次不等式(组)(2).pdf
- 七年级数学优质课公开课教案教学设计期中综合检测.pdf
文档评论(0)