Redis持久化——追加与快照

持久化意味着写入数据到持久化储存。redis有两个持久化手段

  • RDB(Redis Database): 以指定的时间间隔执行数据的时间点快照。
  • AOF(Append Only File): 持久化每个server收到的写入操作到log。

AOF执行过程

  1. 命令传播: Redis将执行完的命令等信息发送给AOF程序中

  2. 缓存追加: AOF程序转化接收到的命令数据为网络通讯协议格式,然后追加到AOF缓存

  3. 文件写入与保存: 将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

  1. https://redis.io/docs/management/persistence/
  2. https://redisbook.readthedocs.io/en/latest/internal/aof.html
  3. https://redisbook.readthedocs.io/en/latest/internal/rdb.html

你可能感兴趣的:(db,redis,数据库,缓存)