Redis--(六)Redis持久化

        其实目前我在工作中没有遇到过这个持久化的问题,但也还是需要知道的,不然哪天碰到了措手不及。

一、内存数据库

        Redis的数据都存储在内存当中,避免了磁盘IO的开销,提高读写速度,因此也叫内存数据库。

二、持久化

        持久化,顾名思义就是将短暂的,容易失去的东西转化为长时间保存的,不容易丢失的数据,比如写入磁盘中,确保即使系统崩溃,断电或者其他突发事件中数据不会丢失,也能恢复。

Redis 持久化的方式

        Redis 提供三种持久化的方式: 分别是 RDB(Redis Database Snapshot) 和 AOF(Append Only File)以及 混合持久化

三、RDB(Redis Database Snapshot)

        RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的

        对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。

        如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

        虽然RDB有不少优点,但它的缺点也是不容忽视的。如果你对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每5分钟都持久化一次,当redis故障时,仍然会有近5分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。

四、AOF(Append Only File)

        英文是Append Only File,即只允许追加不允许改写的文件,这种方式旨在持续地保存服务器上的所有修改操作。每当执行一个会改变数据的命令时,Redis 都会将该命令写入 AOF 文件中。当 Redis 需要恢复数据时,只需执行 AOF 文件中的命令就可以恢复到原来的状态。

主要分3个步骤:命令追加、文件写入、文件同步

  • 命令追加: 将 redis 写操作命令追加到 aof_buf 缓冲区
  • 文件写入: 周期性地将 aof_buf 缓冲区的命令写入 AOF 文件的内核缓冲区。
  • 文件同步:根据配置同步策略,将 AOF 文件缓冲区的内容同步到磁盘。

其中文件同步策略 Redis 提供了三种,分别是以下三种:

  • always:每次有命令写入时都立即同步。这提供了最高的数据安全性,但效率最低。
  • everysec:每秒同步一次。这是一个权衡安全性和效率的策略。最多只丢失 1 秒 的数据
  • no:让操作系统决定最佳的同步时间。这可能导致数据丢失,但提供了最高的效率。

五、混合持久化

        混合持久化是 Redis 4.0 新引入的持久化策略,结合了 RDB 的快速恢复和 AOF 的数据完整性的优点,它首先以 RDB 格式保存当前数据状态,然后继续以 AOF 格式记录新的写操作,确保数据完整性并优化恢复速度

混合持久化的实现主要是靠主进程和子进程共同来完成的。

子进程:

子进程进行 AOF 重写:

  • 首先创建新的 AOF 文件 appendonly.rdb
  • 将 Redis 当前的数据生成 RDB 快照写入 appendonly.rdb 文件的开始部分

主进程

  • 主进程先将新的写操作命令写入 AOF 重写缓冲区 -主进程将 AOF 重写缓冲区的内容追加到 appendonly.rdb 文件的 RDB 数据的末尾
  • 使用 appendonly.rdb 文件替换旧的 AOF 文件

混合持久化的优缺点

优点

  • 更快的启动速度:混合持久化结合了RDB的速度优势,所以Redis可以更快地重新启动,不用等待很久。
  • 数据安全:利用AOF的方式,即使服务器突然断电,也只会丢失极短的时间内的数据。
  • 文件更小巧:因为混合持久化结合了 RDB 和 AOF 的优势,所以文件大小和冗余度都可以得到控制。
  • 两全其美:简单说,它就是RDB和AOF的结合体,带来了两者的好处。

缺点

  • 稍微复杂:因为它结合了两种技术,所以处理起来比单一的 RDB 或 AOF 要复杂一点。
  • 可能占更多空间:在某些情况下,保存数据的文件可能会比只使用 RDB 或AOF 的文件要大一些。
  • 写入速度:可能会稍慢一些,特别是当数据需要经常被保存到硬盘时(比如当 appendfsync 配置为“always”时)

六、两种持久化的优缺点

RDB优点

  • 快速备份:RDB可以迅速为你创建一个数据的“快照”,这是一个备份文件,方便你存储或者迁移数据。
  • 启动快:当Redis重新启动时,RDB能帮助它更快速地加载数据,因为它直接读取一个完整的数据文件。
  • 节省空间:与其他持久化方式相比,RDB的文件大小通常较小,因为它是经过压缩的。

RDB缺点:

  • 可能丢数据:因为RDB只是不时地保存一次数据快照,如果在两次保存之间Redis出了问题,那中间的数据就可能会丢失。
  • 有时会卡:在数据很多的情况下,创建 RDB 文件时可能会使服务器短暂地感觉有些卡顿。
  • 卡顿的原因:尽管 Redis 使用写时复制(Copy-On-Write, COW)技术来减少内存的复制,fork( ) 在大数据集上的调用仍然可能相当耗时。这是因为操作系统需要为子进程准备一个与父进程相同的虚拟内存空间。在这个准备过程中,即使不立即复制物理内存,操作系统也需要复制和设置父进程的页表,这在数据集很大时会占用相当一部分时间。fork( ) 的执行时间与服务器上的数据量大小成正比。因此在数据集较大时,fork 可能会有比较久的延迟才能返回,所以才造成的卡顿。

AOF优点

  • 不轻易丢数据:AOF 记录了所有的写操作,所以即使服务器突然断电,数据丢失的机会也很小。
  • 易于理解:AOF是一个文本文件,里面就是一系列的命令,你可以打开查看。
  • 出问题也能救:如果 AOF 文件最后有点损坏,Redis 也能够修复它,避免大量数据丢失。

AOF缺点

  • 可能会慢一些:因为要不断写入操作,所以比 RDB 要慢一点。
  • 文件可能很大:AOF 会记录所有操作,所以文件可能迅速增大,占用更多空间。
  • 恢复时间长:如果需要从 AOF 文件中恢复数据,由于文件可能很大,所以这个过程可能会比较慢。

七、如何选择RDB和AOF

        这其实是要看自己的场景,适合用什么,需要考虑到数据安全性、恢复速度、以及系统性能三者之间的平衡。RDB 适合需要定期备份的场景,AOF 适合对数据丢失有严格要求的应用,而混合持久化模式则是一种比较折中的方案,它结合了 RDB 的快速数据恢复能力和 AOF 的数据安全性

  • RDB 持久化以其高效的数据恢复速度和较小的性能开销脱颖而出,适合数据备份和灾难恢复场景。
  • AOF 持久化通过记录每个写操作确保了更高级别的数据安全性,尽管它可能导致文件体积增大和写入性能的轻微下降。
  • 混合持久化模式结合了 RDB 的快速数据恢复能力和 AOF 的数据安全性,提供了一种既快速又可靠的数据恢复解决方案。

可能后续再学习一些会加笔记,有不对的地方请在评论区指出,我会马上改掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值