9、redis的持久化策略

本文深入解析Redis的两种持久化策略:RDB快照和AOF日志,包括配置、工作原理及优缺点对比,帮助理解如何根据业务需求选择合适的持久化方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

1、了解Redis的持久化的使用

1、掌握Redis的持久化的配置

学习过程:

    Redis是内存数据库,所以在服务器重启或者断电时,内存数据肯定会丢失,对于某些应用来说这是不可接收,例如如果使用Redis作为订单号的生成器,每一次都会逐次增1,如果断电重启后,订单号必须能够接着增1,而不是从0开始。所以Redis有必要持久化数据。当然如果你的业务仅仅只是用于简单的缓存,那么你也可以禁用持久化以提升效率。  

Redis的有两种持久化策略:

  • rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略

  • aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合

一、rdb方式

    快照rdb持久化方式时安装redis时的默认方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是dump.rdb,这些也都可以通过配置文件修改的。

redis.conf常见配置:

dbfilename "dump.rdb" 

dir "/data/dbs/redis/6381"

save 900 1 

save 300 10

save 60 10000

意义如下:

    dbfilename "dump.rdb"          #持久化文件名称

    dir "/data/dbs/redis/6381"    #持久化数据文件存放的路径

    默认是如上配置:900秒之内,如果超过1个key被修改,则发起快照保存;

    300秒内,如果超过10个key被修改,则发起快照保存

    1分钟之内,如果1万个key被修改,则发起快照保存

    rdb持久化工作原理简单:当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write。

   RDB持久化也分两种:SAVE和BGSAVE

  1、SAVE是阻塞式的RDB持久化,当执行这个命令时redis的主进程把内存里的数据库状态写入到RDB文件(即上面的dump.rdb)中,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。

 2、BGSAVE属于非阻塞式的持久化,它会创建一个子进程专门去把内存中的数据库状态写入RDB文件里,同时主进程还可以处理来自客户端的命令请求。但子进程基本是复制的父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。这种方式尤其需要注意的。如果redis本身内存使用率就60%,总的内存使用率在80%左右,持久化的时候立马占到100%以上的。

可以使用命令操作的。

127.0.0.1:6379> bgsave

Background saving started

127.0.0.1:6379> save

OK

   从上面的配置可知,rdb方式不能完全保证数据持久化,因为是定时保存,所以当redis服务down掉,就会丢失一部分数据,而且数据量大,写操作多的情况下,会引起大量的磁盘IO操作,会影响性能。

 

二、aof方式

    使用aof做持久化,每一个写命令都通过write函数追加到appendonly.aof中.配置方式:启动aof持久化的方式 

    appendonly yes  

    Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到redis关闭前的最后时刻。

    LOG Rewriting随着修改数据的执行AOF文件会越来越大,其中很多内容记录某一个key的变化情况。因此redis有了一种比较有意思的特性:在后台重建AOF文件,而不会影响client端操作。在任何时候执行BGREWRITEAOF命令,都会把当前内存中最短序列的命令写到磁盘,这些命令可以完全构建当前的数据情况,而不会存在多余的变化情况(比如状态变化,计数器变化等),缩小的AOF文件的大小。所以当使用AOF时,redis推荐同时使用BGREWRITEAOF。

    AOF文件刷新的方式,有三种,参考配置参数appendfsync :

    appendfsync always每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全;

    appendfsync everysec每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据;

    appendfsync no依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾。

appendonly yes              //启用aof持久化方式

# appendfsync always      //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用

appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 

# appendfsync no    //完全依赖os,性能最好,持久化没保证

 

    可能由于系统原因导致了AOF损坏,redis无法再加载这个AOF,可以按照下面步骤来修复:首先做一个AOF文件的备份,复制到其他地方;修复原始AOF文件,执行:$ redis-check-aof –fix ;可以通过diff –u命令来查看修复前后文件不一致的地方;重启redis服务。

redis-check-aof --fix  appendonly.aof   

 

三、Redis 4.0版本后支持---混合持久化
Redis 4.0有一个新的持久化选项——混合持久化。将 rdb 文件的内容和增量的 AOF 日志文件存在一起。AOF文件的前半段是RDB格式的全量数据后半段是redis命令格式的增量数据。

修改配置

aof-use-rdb-preamble yes #默认时没有开启混合持久化的改成yes

我们先看看原来的aof文件

[root@localhost redis]# cat appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$6
liubao
*2
$6
SELECT
$1
0
*3
$3
set
$3
age
$3
456
*2
$6
SELECT
$1
0
*3
$3
set
$3
msg
$5
hello

执行一下

192.168.137.101:0>BGREWRITEAOF

然后在设置一个值

192.168.137.101:0>set test abc

然后再看看aof文件
[root@localhost redis]# cat appendonly.aof 
REDIS0008dis-ver4.0.13edis-bitsctime\ed-mem-preambleagenameliubaomsghello

SELECT
$1
0
*3
$3
set
$4
test
$3
abc

可以看到前面实际上就是rdb的内容,后面就是新的aof的内容了,混合持久化的有点就是再redis重启后,加载aof恢复数据时是会快很多,同时aof文件也会小很多。

四、取消持久化

    其实我们也可以把持久化取消,以达到最高的运行效率,当然数据一旦断电也就会没有,我们可以使用主从配置或者集群的方式提高稳定性。所以很多时候也会在取消持久化功能的

  1. 注释掉原来的持久化规则

#save 900 1

#save 300 10

#save 60 10000

2.设置为空

save ""

   取消持久化需要注意的一点:如果你以前有使用过持久化功能,那么需要把以前的持久化文件删除才行。最好运行flushall命令清楚旧数据了。

3、aof持久化也需要关闭了。

aof-use-rdb-preamble no

appendonly no

总结:

   两种方式你可以自己根据需要选择,也可以同时开启两种持久化方式:

1、在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

2、RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件,那要不要使用AOF呢?那要看情况而定,如果缓存信息比较重要,那么可以使用AOF,因为RDB更适合用于备份数据库,这也是大部分的使用场景。

<think>好的,我现在要处理用户关于Redis持久化策略的面试问题及答案的需求。首先,我需要确认用户的具体需求是什么。用户提到他们想了解Redis持久化相关的常见面试问题及解答,并且已经提供了一些引用资料。我需要根据这些引用内容来组织答案,同时遵循用户给出的系统级指令。 首先,我需要回顾Redis持久化机制。Redis主要有两种持久化方式:RDB(Redis Database)和AOF(Append Only File),以及它们的混合模式。根据引用[1],混合持久化结合了RDB和AOF的优点。引用[2]和[3]提到了RDB的配置方式,包括save指令的作用和如何禁用RDB。此外,用户提供的引用中还提到了集群模式下的问题,但当前问题主要关注持久化策略,所以可能暂时不需要涉及集群相关内容,除非问题涉及到分布式环境下的持久化。 接下来,我需要整理常见的面试问题。通常,面试官会问两者的区别、优缺点、配置方式、数据恢复过程、混合持久化等。根据引用内容,混合持久化是一个重点,因为它结合了RDB的快照和AOF的增量日志。此外,如何配置RDB和禁用RDB也是关键点,如引用[2]和[3]所述。 在组织答案时,需要确保每个问题结构清晰,回答准确,并且正确引用提供的资料。例如,在回答RDB和AOF的区别时,需要指出RDB是快照,而AOF是日志追加,同时引用[1]和[3]来说明它们的优缺点。混合持久化的部分需要引用[1]详细说明其工作原理和优势。 同时,要遵循用户给出的格式要求:行内公式用$...$,独立公式用$$...$$,但这里可能涉及的技术内容较少,可能不需要数学公式,但需要注意代码块的格式。例如,如果提到配置文件中的设置,可能需要用代码块展示,如引用[2]中的save指令示例。 另外,用户要求生成相关问题,所以需要根据内容提出几个相关问题,如RDB和AOF的区别、如何选择持久化方式、混合持久化的实现等。 最后,确保所有引用都正确标注,例如在提到禁用RDB时引用[3],混合持久化引用[1],配置RDB引用[2]。需要检查每个引用是否准确对应到相关内容,避免错误引用。 现在需要将以上思路转化为结构化的回答,包含问题与解答,以及相关问题部分,同时遵守格式要求,使用中文,确保LaTeX语法正确,并正确添加引用标识。</think>### Redis 持久化策略面试常见问题与解答 --- #### 1. Redis 有哪些持久化方式?它们的核心区别是什么? Redis 提供两种持久化方式:**RDB(Redis Database)** 和 **AOF(Append Only File)**。 - **RDB**:通过生成数据快照(二进制文件)保存某一时刻的全量数据。触发方式包括手动执行`SAVE/BGSAVE`命令或根据配置自动触发(例如 `save 900 1` 表示 900 秒内至少 1 次修改时触发快照)[^2][^3]。 - **AOF**:记录所有写操作命令(文本日志),通过重放日志恢复数据。支持不同的同步频率(如每秒同步或每次操作同步)。 **核心区别**: - RDB 是紧凑的二进制文件,恢复速度快,但可能丢失最后一次快照后的数据。 - AOF 提供更高的数据安全性,但文件体积较大且恢复速度较慢[^1][^3]。 --- #### 2. 如何配置 RDB 持久化?如何禁用 RDB? 在 Redis 配置文件(`redis.conf`)中: ```python # 示例配置:900秒内至少1次修改触发快照 save 900 1 save 300 10 save 60 10000 ``` - **禁用 RDB**:注释所有 `save` 指令并重启 Redis 服务[^2]。 --- #### 3. 什么是混合持久化?它如何结合 RDB 和 AOF 的优势? **混合持久化**(Redis 4.0+ 支持)将 RDB 快照与 AOF 增量日志合并: 1. 定期生成 RDB 快照作为全量数据基准。 2. 后续写操作以 AOF 格式追加到日志。 **优点**: - 快速恢复(RDB 基础) + 数据完整性(AOF 增量)[^1]。 **启用方式**: ```python aof-use-rdb-preamble yes ``` --- #### 4. 数据恢复时 Redis 如何选择持久化文件? Redis 重启时按以下优先级恢复数据: 1. 如果启用了 AOF,优先加载 AOF 文件(包含更完整的数据)。 2. 若未启用 AOF,则加载 RDB 文件。 **注意**:混合持久化模式下,AOF 文件包含 RDB 头部和后续操作日志,恢复时先加载 RDB 部分再重放 AOF 命令[^1]。 --- #### 5. AOF 重写(Rewrite)的作用是什么? AOF 文件体积过大时,Redis 会通过重写机制生成更紧凑的新 AOF 文件: - 删除冗余命令(如多次修改同一键值的操作)。 - 基于当前数据状态生成等效的最小命令集。 **触发方式**:手动执行 `BGREWRITEAOF` 或根据配置自动触发(例如 `auto-aof-rewrite-percentage 100`)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值