你说你精通Redis,你看过持久化的配置吗?(二)

152 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

上文中我们已经了解了 RDB 持久化的相关配置,本文我们来聊一下 RDB 的工作方式及常见问题分析。

工作方式

  • Redis 需要保存dump.rdb文件时,它会调用系统函数fork(),创建一个子进程(与主进程完全一致);
  • 子进程将数据集写入临时文件RDB中;
  • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

如何触发RDB快照

  1. 配置文件中默认的快照配置;
  2. 命令save(阻塞, 只管保存快照,其他的等待)或者是bgsave(异步)命令,快照同时还可以响应客户端命令;
  3. 执行flushall 命令,清空数据库所有数据,意义不大;
  4. 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义也不大。

通过RDB文件恢复数据

在实际开发中,一般会考虑到物理机硬盘损坏的情况,所以我们会选择备份dump.rdb文件。将备份的dump.rdb 文件拷贝到redis的安装目录的bin目录下,重启redis服务即可。

优点

  • RDB是一个非常紧凑的文件,非常适用于数据集的备份;
  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复;
  • Redis的主进程不进行I/O操作,确保了极高的性能;
  • 适合大规模数据的恢复,对于数据的完整性和一致性要求不高的话,RDBAOF方式更加高效。

缺点

  • Redis意外宕机时,你可能会丢失几分钟的数据;
  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒;AOF也需要fork,但是可以调节重写日志文件的频率来提高数据集的耐久度。

说到这,RDB 的工作原理与优缺点相信你已经有了初步的认识,接下来我们再了解一下 AOF 持久化的相关配置。如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!