Redis持久化——追加与快照
持久化意味着写入数据到持久化储存。redis有两个持久化手段
-
RDB(Redis Database): 以指定的时间间隔执行数据的时间点快照。 AOF(Append Only File): 持久化每个server收到的写入操作到log。
AOF执行过程
- 命令传播: Redis将执行完的命令等信息发送给AOF程序中
- 缓存追加: AOF程序转化接收到的命令数据为网络通讯协议格式,然后追加到AOF缓存
- 文件写入与保存: 将AOF缓存追加到AOF文件末尾,在满足保存条件的情况下,保存到磁盘中
保存模式:
-
AOF_FSYNC_NO: 不保存。不保存并不是真的不保存,而是不主动保存。在redis关闭、AOF功能关闭或者系统刷新。比如Linux一般会每30s刷新 通常由主线程执行写入和保存,会堵塞进程 AOF_FSYNC_EVERYSEC: 每一秒保存 主线程写入,堵塞主线程。子线程保存 AOF_FSYNC_ALWAYS: 每次新命令追加都保存 主线程写入,堵塞主线程。子线程保存
值得注意的是每一秒保存模式并不是真的每一秒保存。
-
若子线程正在执行SAVE 执行未超过2s,那么程序直接返回 执行超过2s,程序执行写入,但不执行保存 若子线程没有执行SAVE 距上次保存不超过1s,写入 距上次保存超过1s,写入并执行
也就是说在子线程正在执行保存且超过2s的情况下,是存在损失2s以上数据可能性的
数据还原
aof还原数据是创建一个不带网络连接的伪客户端,随后读取aof文件,还原命令并执行
重写
为了防止aof文件越来越大,redis会对aof文件进行重写。
比如对于以下先设置k为hello,随后设置为world,那么重写就会合并这两条命令为设置k为world
set k hello set k world
进一步,为了不影响主线程,redis将重写交给了后台线程处理。并提供了重写缓存缓存在重写期间执行的操作
RDB执行过程
rdb就是将在内存中的数据快照保存到磁盘。
总结
如果希望更快地恢复数据,希望最大化Redis性能,那么RDB更佳。
如果希望更高的安全性,那么AOF更适合
当然也可以全都要
Ref
- https://redis.io/docs/management/persistence/
- https://redisbook.readthedocs.io/en/latest/internal/aof.html
- https://redisbook.readthedocs.io/en/latest/internal/rdb.html
下一篇:
【Mysql】什么是死锁?如何避免死锁