前言
话不多说直奔主题…
RDB
主要触发机制
save
cli命令: save
文件策略: 如果存在老的RDB文件,新的将其替换掉
时间复杂度: O(n)
我们把客户端和服务端用一个图来表示,save时会帮我们生成一个RDB文件
由于它是同步命令,并且在单线程中执行,在数据量非常多的时候,此时执行save命令,他会将数据进行完整拷贝,可能会造成redis阻塞。
bgsave

通过在后台fork一个子进程完成复制
自动
根据REDIS配置定时同步数据到RDB文件
| 配置 | Seconds | Changes | 
|---|---|---|
| save | 900 | 1 | 
| save | 300 | 10 | 
| save | 60 | 10000 | 
eg:60秒中改变了10000次会发生备份RDB
触发机制-不容忽略的方式
- 全量复制
- Debug Reload
- shutdown
save or bgsave ?
| 命令 | save | bgsave | 
|---|---|---|
| IO类型 | 同步 | 异步 | 
| 阻塞 | 是 | 发生在fork时 | 
| 复杂度 | O(N) | O(N) | 
| 优点 | 不会消耗内存 | 不阻塞客户端命令 | 
| 缺点 | 阻塞客户端命令 | 消耗内存 | 
| 1 | save 900 1 | 
| 1 | dbfilename dump-${port}.rdb | 
小结
- RDB是Redis内存到硬盘的快照,用于持久化
- save通常会阻塞Redis
- bgsave不会阻塞Redis,但是会fork子进程
- save自动配置满足其一就会被执行
- 有些触发机制不容忽视
RDB问题
耗时耗性能
O(N)数据耗时
fork耗内存
Disk I/O:IO性能
不可控丢失数据
| 时间戳 | save | 
|---|---|
| T1 | 执行多个命令 | 
| T2 | 满足RDB自动创建条件 | 
| T3 | 再次执行多条命令 | 
| T4 | 宕机 | 
宕机会发生数据丢失
AOF
三种策略
everysec

always
同everysec流程,只不过always会把每条命令都写入到AOF文件中
no
由操作系统来决定是否刷新
比较
| 命令 | always | everysec | no | 
|---|---|---|---|
| 优点 | 不丢失数据 | 每秒一次fsync丢1秒数据 | 不用管理 | 
| 缺点 | IO开销比较大 | 丢1秒数据 | 不可控 | 
作用
- 减少硬盘占用量
- 加快回复速度
重写两种方式
bgrewriteaof
命令:bgrewriteaof

重写配置
| 配置名 | 含义 | 
|---|---|
| auto-aof-rewirte-min-size | auto-aof-rewirte-percentage | 
| AOF文件重写尺寸 | AOF文件增长率 | 
| 统计名 | 含义 | 
|---|---|
| auto-current-size | auto-base-size | 
| AOF当前尺寸 | AOF上次启动和重写的尺寸 | 
- auto-current-size > auto-aof-rewirte-min-size
- (auto-current-size - auto-base-size) / auto-base-size > auto-aof-rewirte-percentage
AOF重写流程

配置
- appendonly yes
- appendfilename “appendonly-${port}.aof”
- appendfsync everysec
- dir /bigdisk
- no-appendfsync-on-rewrite no //aof重写失败是否允许丢失数据
- auto-aof-rewrite-percentage 100 //增长率
- auto-aof-rewrite-min-size 64mb //最小尺寸
RDB 和 AOF 抉择
| 命令 | RDB | AOF | 
|---|---|---|
| 启动优先级 | 低 | 高 | 
| 体积 | 小 | 大 | 
| 恢复速度 | 快 | 慢 | 
| 数据安全性 | 丢数据 | 根据策略决定 | 
| 轻重 | 重 | 轻 |