Redis的持久化机制是怎样的?


一、Redis提供了哪些持久化机制?

Redis提供了两种持久化的机制,分别是RDB和AOF(在Redis 4.0之后采用混合方式)。

二、RDB和AOF有什么区别?

1、RDB

RDB是将Redis内存中的数据定期保存到磁盘中,防止数据在Redis宕机等异常情况下丢失

优点:快照文件比较小,采用了压缩的方式,在数据恢复性能比较好,适合做备份和灾难恢复
缺点:实时性低,容易丢数据

2、AOF

AOF是将Redis的所有写操作追加到AOF缓冲区文件(Append Only File)的末尾,然后再将缓冲区文件的数据写入到磁盘的AOF文件中(什么时候写入是根据刷盘的策略来决定的)

优点:实时性高,从而保证了更高的数据可靠性,也支持了更细粒度的数据恢复,适合做数据存档和数据备份
缺点:文件比较大,需要经常操作磁盘导致负载较高

3、RDB和AOF比较

RDB AOF
数据可靠性 可能会丢失最后一次快照之后的数据 保证最后一次写操作之前的数据不会丢失
读写性能 读写性能较高,适合做数据恢复 写性能较高,适合做数据存档
恢复性能 从快照文件中恢复数据较快 从AOF文件中恢复数据较慢
存储空间占用 快照文件较小,占用空间较少 AOF文件较大,占用空间较多

三、Q&A

1、Redis能完全保证数据不丢失吗?

不能,因为Redis是基于内存存储的,当Redis进程异常退出或服务器断电等情况发生时,内存中的数据可能会丢失。

虽然Redis提供了RDB和AOF两种持久化机制来防止数据丢失,但是在极端情况下也不是完全可靠的,比如通过淘汰策略把某些key移除掉

所以总结来说Redis只是个缓存,我们还是要有自己的持久化方式,比如双写数据到MySQL。


RDB下数据丢失的情况

# 100s内,执行5条命令,就触发一次持久化磁盘
save 100 5

但如果100s内我们只执行了3条命令,然后Redis挂了,那么这时候这3条命令对应的数据也是会丢失的,所以具体是否会出现数据丢失还是得看我们具体的持久化策略

AOF下数据丢失的情况
默认everysec指的是每秒追加写入,说明最多也可能会丢失1s内的数据

2、AOF有哪些写回策略?

AOF有三种数据写回策略,分别是:

  • Always:即同步写回,每个写命令执行完,则立马同步地将日志写回磁盘
  • Everysec:即每秒写回,每个写命令执行完,会先缓存到AOF文件的内存缓冲区,每秒执行一次将日志写回磁盘
  • No:即不做控制,每个写命令执行完,会先缓存到AOF文件的内存缓冲区,由操作系统决定什么时候将日志写回磁盘

Redis默认的写回策略是Everysec,因为Always虽然数据可靠性最高,但是每次都需要操作磁盘,性能较差,而No是不可控的,对于数据来说是不安全的,万一还没持久化就宕机了就会出现数据丢失


文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !
  目录