Redis 持久化机制

Redis的持久化机制包括RDB和AOF两种方式,用于防止数据丢失。RDB在指定时间间隔保存数据快照,适合全量同步,但可能丢失最近修改的数据;AOF记录每次写操作,保证高耐久性,支持秒级数据恢复,但文件体积可能较大。RDB在恢复大数据集时更快,AOF则能提供更好的数据完整性和故障恢复能力。在实际应用中,可以根据对数据丢失容忍度和性能需求选择合适的持久化策略。
摘要由CSDN通过智能技术生成

1. 为什么要进行数据持久化?

在使用 redis 缓存减轻了 mysql 读写压力之后,如果数据在 redis 中不存在,那么最终的方法还是要去数据库中查找,因为最终数据还是存储在数据库当中,在这种情况下,如果 redis 宕机重启之后如果没有持久化机制,那么会导致原本存储在 redis 中的数据全部消失,而这时候如果有大量的请求同时到来的话,那么就会对 mysql 数据造成非常大的压力,可能会把数据库也会干趴下,所以这时就需要 redis 来进行一个持久化的管理。

2. 持久化的作用

redis 因为在某种原因的情况下宕机以后,数据是不会丢失的,因为 redis 有一个解决的方法就是 redis 的持久化机制。而且大部分的缓存框架都会有基本的淘汰策略与持久化机制。

redis 的持久化机制有两种 :AOF 、RDB(默认)。

3. RDB持久化实现原理

官方的解释是RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。在 redis 当中 , 它已经帮忙我们默认开启了 RDB 缓存,在 linux 系统下的redis.conf 文件当中,可以看到

rdbcompression yes            # 开启 RDB 持久化机制
-------------------------------------------------------------------------------
dbfilename dump.rdb           # RDB转储数据库的文件名
-------------------------------------------------------------------------------
dir /www/server/redis/        # RDB 数据存储的文件目录

RDB 持久化采用的是定时存储(全量同步),在 redis.conf 文件当中定义了三种方法,分别是

save 900 1                # 每 900 秒(15分钟)至少有一个 key 发生变化,则 dump 内存快照。
save 300 10               # 每 300 秒(5分钟)至少有十个 key 发生变化,则 dump 内存快照。
save 60 10000             # 每 60 秒(1分钟)至少有一万个 key 发生变化,则 dump 内存快照。

这里就是说如果在规定的时间内发生变化的 key 的数量达到我们设定好的数量之后,redis 就会通过一个子进程来进行数据的快照。

RDB 的优点(官方解释):

  • RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。
  • RDB是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的S3(可能加密),非常适用于灾难恢复。
  • RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
  • 与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些。

以上为官方解释的 RDB 机制的优点,总体来说 RDB 可以保存一个版本链,在进行灾难修复的时候效率比 AOF 会高,而且它只会创建一个子进程所以对redis 性能的影响也比较低。

RDB 的缺点(官方解释):

  • 如果你希望在 redis 意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合你.虽然你可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,你可能会丢失几分钟的数据。
  • RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。

缺点就是因为设置了不同的 save 时间点(每 900 秒(15分钟)至少有一个 key 发生变化,则 dump 内存快照),如果这个900秒没有到系统就宕机了,那么数据还是会丢失掉,而且数据量大的时候 fork 子进程还是会影响 redis 的性能。

AOF 持久化实现原理

官方解释是AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

appendonly no                       # AOF 默认是关闭的,设置为 yes 即为开启
-------------------------------------------------------------------------------
appendfilename "appendonly.aof"     # AOF 数据存储的文件目录

AOF 的优点(官方解释):

  • 使用AOF 会让你的Redis更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
  • AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题.
  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

AOF 的缺点(官方解释):

  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龍九^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值