持久化选项

  • RDB (Redis Database): The RDB persistence performs point-in-time snapshots of your dataset at specified intervals. 某一个时间点的内存快照,这个是Redis的默认持久化选项
  • AOF (Append Only File): The AOF persistence logs every write operation received by the server, that will be played again at server startup, reconstructing the original dataset. Commands are logged using the same format as the Redis protocol itself, in an append-only fashion. Redis is able to rewrite the log in the background when it gets too big. 以Redis协议的方式追加命令到文本中,文件太大会被重写
  • No persistence: If you wish, you can disable persistence completely, if you want your data to just exist as long as the server is running.不持久化
  • RDB + AOF: It is possible to combine both AOF and RDB in the same instance. Notice that, in this case, when Redis restarts the AOF file will be used to reconstruct the original dataset since it is guaranteed to be the most complete. (开启AOF后的默认选项,默认配置aof-use-rdb-preamble yes)

    RDB

    这里说的阻塞是因为Redis是单线程的,save命令会让线程一直处理文件IO,所以线程不能处理其他socket io请求,断电/kill -9都会导致部分数据丢失

RDB的优点

  • 数据备份
  • 故障恢复
  • 最大化性能,持久化的操作在子进程中进行,父进程不执行磁盘IO等类似的操作
  • 数据量大的情况下,相比AOF更快重启
  • 主从同步

    RDB的缺点

  • 数据丢失

  • 频繁fork引起服务器阻塞以及CPU不友好

    AOF

    AOF的优点

  • 持久化,根据配置持久化的选项不一

  • 日志追加
  • 自动重写
  • 文件格式容易理解和解析

    AOF的缺点

  • 相比RDB,文件更大

  • 相比RDB,性能要差一点
  • 使用更多的内存(rewrite期间其他的write命令会追加到AOF缓冲期,一个list链表,每个节点都是10M)

    • write期间需要写两次磁盘,一次是主文件,一次是temp文件

      如何选择哪一种持久化方式

  • 如果想要和RDBMS一样更高的数据安全性,应该两个都要安排上

  • 如果允许少量数据丢失,可以选择RDB

    如何生成快照

    Whenever Redis needs to dump the dataset to disk, this is what happens:

    • Redis forks. We now have a child and a parent process.
    • The child starts to write the dataset to a temporary RDB file.
    • When the child is done writing the new RDB file, it replaces the old one.

This method allows Redis to benefit from copy-on-write semantics.

AOF

RDB提供的持久化能力并不友好,在机器断电,kill -9的情况下会导致数据丢失,相比可以使用AOF作为替代的持久化选项

开启AOF持久化后,每一次Redis收到write操作的命令都会追加到AOF缓冲区,根据AOF缓冲区刷新策略定期调用fsync,将数据从pagecache写入到磁盘. 重启的时候可以重放AOF文件来重写构建数据

持久化策略

  • appendfsync always
  • appendfsync everysec (后台线程来刷新)
  • appendfsync no (完全依赖操作系统刷新的时间,linux默认30s)

可以和MySQL的双1策略相联,及时使用来always,redis也会使用group commit来提升性能(MySQL也有group commit/RocketMQ也是有的)

重写

AOF是将每一条写操作相关的命令都以REDIS协议的格式写入到AOF文件,随着Redis的运行,文件会越来越大。
在AOF重写期间,Redis会持续将命令写入到老的AOF文件,在子进程中,Redis会将数据写入到临时的AOF文件,子进程重写结束时,使用rename系统调用将新的AOF文件切换过去。

参考链接

这篇一定要读读