Redis持久化——追加与快照

Redis的持久化包括RDB和AOF两种方式,RDB通过定期快照保存数据,适合快速恢复但可能丢失部分更新;AOF记录每次写操作,提供更高安全性但文件体积可能增大。AOF的保存模式有三种,影响数据安全性和性能。Redis通过后台线程进行AOF重写以优化文件大小。若追求性能,选择RDB;若重视数据完整性,AOF更优。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

持久化意味着写入数据到持久化储存。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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值