什么是长久化?
Redis 所有数据都是存储在内存中的,对于数据的更新将异步的保留在磁盘中,当 Redis 实例重启时,即可利用之前长久化的文件实现数据恢复。
支流数据库的长久化形式:
-
快照
- Mysql dump
- Redis rdb
-
日志
- Mysql binlog
- Redis aof
RDB
什么是 RDB?
Redis 通过一条命令或者某种形式创立 rdb 文件,该文件是二进制格局,存储在硬盘中。
当须要对 Redis 进行复原时,就能够去加载该文件。
数据恢复的水平,取决于 rdb 文件(快照)产生的时刻。
三种触发机制
Redis 生成 rdb 文件有三种形式,别离是:
- save
- bgsave
- 主动策略
save
save 命令有如下特点:
- 同步阻塞
- 文件策略:如果存在旧的 rdb 文件,则会替换成新的
- 复杂度:O(N)
bgsave
bgsave 命令有如下特点:
- 异步非阻塞(简直不会阻塞客户端)
- 文件策略和复杂度同上。
save 还是 bgsave?
命令 | save | bgsave |
---|---|---|
IO 类型 | 同步 | 异步 |
是否阻塞 | 是 | 否(阻塞产生在 fork() |
复杂度 | O(n) | O(n) |
长处 | 不会耗费额定内存 | 不阻塞客户端 |
毛病 | 阻塞客户端 | 须要 fork,耗费内存 |
在数据量不大的状况下,其实应用 save 还是 bgsave 并没有什么差别。
主动策略
主动生成策略是依据某个规定来决定是否生成 rdb 文件,这个过程也是一个 bgsave 的过程。
默认策略:
seconds | changes |
---|---|
900 | 1 |
300 | 10 |
60 | 10000 |
上述配置的意思是:如果在 60s 中做了 10000 次扭转或者在 300s 中做了 10 次 扭转,或者在 900s 中做了 1 次扭转,则均会触发 bgsave。
配置
#save 900 1
#save 300 10
#save 60 10000
dbfilename dump-${port}.rdb // rdb 文件名称
dir /big_disk_path // 工作目录
stop-writes-on-bgsave-error yes // 如果产生谬误,进行写入
rdbcompression yes // 采纳压缩格局
rdbchecksum yes // 对 rdb 文件进行测验
触发机制
Redis 当达到以下触发机制时,也会主动创立 rdb 文件。
- 全量复制
- debug reload
- showdown
AOF
在正式介绍什么是 AOF 之前,咱们先来理解一下 RDB 形式现存的问题。
- 耗时、耗性能
- 不可控、失落数据
什么是 AOF?
Redis 的每次操作都会产生日志,AOF 文件能够了解成记录操作内容。
AOF(append only file) 其实就是依据 Redis 的执行日志去创立 AOF 文件。
三种策略
Redis 在执行写命令时,首先写入硬盘的缓冲区,缓冲区会依据以下策略去刷新到磁盘中。
- always:每条命令 fsync 到硬盘。
- everysec:每秒把缓冲区 fsync 到硬盘。
- no:由零碎决定是否 fsync。
always 还是 everysec 还是 no?
命令 | always | everysec | no |
---|---|---|---|
长处 | 不失落数据 | 每秒一次 fsync | 不必管 |
毛病 | IO 开销较大,个别的 sata 盘只有几百 TPS | 丢一秒数据 | 不可控 |
配置
appendonly yes // 开启 AOF 策略
appendfilename "appendonly-${port}.aof" // aof 文件名
appendfsync everysec // 刷新策略
dir /big_disk_path // 工作目录
no-appendfsync-on-write yes // AOF 重写时,是否须要做 AOF 失常操作
auto-aof-rewrite-percentage 100 // 重写增长率
auto-aof-rewrite-min-size 64mb // 重写最小存储
总结
对于到底抉择 RDB 还是 AOF,并没有相对正确的答案。须要依据理论状况去作取舍。
命令 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 |
体积 | 小 | 大 |
复原速度 | 快 | 慢 |
数据安全性 | 丢数据 | 依据策略决定 |
级别 | 重 | 轻 |