Redis 设计与实现
🐠 数据结构与对象
1. 简单动态字符串
结构
int len
- 记录字符串长度
int free
- 记录buf未使用的长度
char buf[]
- 保存字符串
O(1) 复杂性获取字符串长度
- 杜绝缓冲区溢出
- 减少修改字符串长度时所需的内存重分配次数
- 二进制安全
- 兼容部分C字符串函数
2. 链表
结构
listNode *head
- 头指针
listNode * tail
- 尾指针
long len
- 链表节点数量
*dup
- 当前节点复制
*free
- 当前节点释放
*match
- 当前节点对比
用途
列表键
- list
发布与订阅
- 慢查询
- 监视器
3. 字典
结构
dictEntry table
key
- 键值
val
- 映射值
next
- 指向下一个hash节点,形成一个字典链表
long size
- 哈希表大小
long sizemask
- 计算索引值
long used
- 哈希表已使用的节点数量
hash 算法
- MurmurHash2
hash 冲突
- 拉链法
4. 跳表
结构
zskiplistNode *forward
zskiplistNode *backward
- 后退指针
double score
- 分值
robj *obj
- 成员对象
int span
- 跨度
用途
- 有序集合
5. 整数集合
结构
encoding
- 编码格式
length
- 集合包含的元素数量
contents[]
- 保存元素的数组
用途
- 集合
升级操作带来了操作上的灵活,并且尽可能的节约内存
- 只支持升级,不支持降级
6. 压缩列表
结构
zlbyte
- 记录压缩列表占用内存字节数
zltail
- 记录压缩列表尾节点距离头节点有多少字节
zllen
- 记录包含节点数量
entryX
- 各个节点
zlend
- 特殊值,记录压缩列表的末端
用途
字典
- set
- zset
列表键
- list
7. 对象
类型
- string
- list
- hash
- set
- zset
🍮 单机 redis
1. 持久化
aof
- 保存执行的命令
rdb
- 压缩二进制文件
2. 事件
文件事件
- I/O多路复用进行套接字操作
- 单线程
时间事件
- 定时
- 周期
- 达到某刻
😀 分布式 redis
1. 主从复制 模式
步骤
- 1 设置主服务器的地址以及端口
- 2 建立套接字连接
- 3 发送 ping
- 4 身份验证
- 5 发送端口信息
- 6 同步
同步
- 命令传播
2. sentinel 模式
步骤
- 1 选举主 sentinel
- 2 服务之间比较本地版本
- 3 指定 master
- 4 主从复制
3. cluster 模式
- key 通过 分片区值取模到不同主机上