11. Redis 数据持久化
Redis是内存数据库,所以如果不把数据保存到磁盘上,服务器一旦进程退出,或者断电,数据就会丢失,所以Redis提供了持久化功能
- RDB(Redis 数据库):RDB 持久性以指定的时间间隔执行数据集的时间点快照。
 - AOF(仅追加文件):AOF 持久性记录服务器接收到的每个写操作。然后可以在服务器启动时再次重播这些操作,从而重建原始数据集。命令使用与 Redis 协议本身相同的格式进行记录。
 
要注意的是Redis7提供了新的持久化模式:RDB + AOF:可以在同一个实例中组合 AOF和 RDB。
RDB
- RDB持久化是通过创建数据的快照实现的。具体来说,Redis会在指定的时间间隔内,将内存中的数据快照写入磁盘,也就是创建了一个数据集的副本。
 - 这个时间间隔可以通过"save"配置选项进行设置,如"save 900 1"表示如果900秒内有至少1个key变化,则创建一个snapshots快照。
 - RDB是Redis默认的持久化方式,主要优点是能最大化Redis的性能,并且生成的RDB文件非常适合用于全量复制、数据备份等场景。
 - 但是,如果Redis意外宕机,你可能会丢失最后一次快照以后修改的所有数据。
 - rdb保存文件:dump.rdb 默认保存在当前运行目录
 
RDB触发条件
默认触发在服务停止时
1. 自动触发
在redis.conf 配置文件中 配置
save xxx xxx
save "" 表示禁用RDB
AOF
Redis提供的一种持久化策略,也被称为追加模式或日志模式。与Redis的另一种持久化策略RDB不同,AOF是通过保存Redis服务器所执行的写命令来记录数据库的状态。
简单理解:Redis处理的每一个写命令都会记录在AOF文件,可以看做时命令日志文件。
其实这种方式就是当Redis有要求不能丢失任何写的内容,可以采用AOF持久化方式。
由于在使用AOF持久化方式时,redis会将每一个收到的命令都通过write函数追加到文件中(默认appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令在内存中重建整个数据库内容。
AOF命令
首先AOF默认是关闭的,需要修改redis.conf配置文件来开启
appendonly yes #是合开启AOF 默认no
appendfilename "appendonly.aof" # AOF文件名
appenddirname "appendonlydir"#Redis7新增,用于储存所有AOF文件的目录名称AOF命令记录频率可以通过redis.conf配置文件控制
appendfsync always #表示没执行一次写命令,立即记录到AOF文件 性能最差
appendfsync everysec #写命令执行完先放入AOF缓冲区,然后表示每个1秒钟将缓冲区数据写入AOF文件,默认(最多丢失1秒内的数据)
appendfsync no #写命令执行完放入AOF缓冲区,由操作系统决定何时将缓冲区内容写会磁盘由此可以看出alwavs安全性最高性能最差,以此类推逐步提高性能减少安全性
从Redis 7.0.0开始,Redis使用多部分AOF机制(AOFRW)。即把原来的单个AOF文件拆分为基础文件(最多一个)和增量文件(可能不止一个)。基础文件表示重写 AOF 时存在的数据的初始(RDB 或AOF 格式)快照。增量文件包含自上次创建基本AOF
文件以来的增量更改。所有这些文件都放在单独的目录中,并由清单文件跟踪,这是为了解决随着Redis处理的写命令增多,AOF文件也会变得越来越大,命令回放的时间也会增多的问题。
- BASE:表示基础的AOF,它一般由子进程通过重写产生,最多只有一个
 - INCR:表示增量AOF,它一般会在AOFRW开始创建,可能存在多个
 - HISTORY:表示历史的AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR都变成HISTORY,此类型AOF会被Redis自动删除
 
AOF rewrite(AOFRW)机制
AOFRW会移除AOF中冗余的写命令,以等效的方式重写、生成一个新的AOF文件,来达到减少AOF文件大小的目的
机制触发有两种方式
1. 自动
此时为两种条件同时满足,才会触发机制
条件1:根据上次重写后的AOF文件大小,判断当前AOF文件大小是否增长了1倍
条件2:重新时需要满足设定的文件大小默认 64mb

2、手动
执行命令:bgrewriteaof命令
3、原理:
1:触发重写机制以后,Redis会创建一个子进程,此进程会读取现有的AOF文件,将包含的指令压缩并写入到临时文件中
2:此时主进程如果收到新的写指令,会把这些新指令累计到缓存区中,同时也会写入到原有的AOF文件中,保证重写过程失败,原有文件依旧日可用
RDB与AOF混合持久化
RDB + AOF:您还可以在同一个实例中组合 AOF和 RDB。
以上是官网给出的建议,要注意的是,如果AOF被开启,那么Redis会优先加载AOF文件
具体如何应用
官方给出的解释如下:
一般情况下,如果您想要关系型数据库提供的数据安全程度相当的数据安全性,则应该使用这两种持久性方法。
如果您非常关心数据,但仍然可以忍受实难发生时几分钟的数据丢失,那么您可以简单地单独使用 RDB。
有许多用户单独使用AOF,但我们不鼓励这样做,因为时不时地拥有 RDB 快照对于进行数据库备份、更快地重新启动以及在AOF 引擎出现错误时是一个好主意。
注意:同时开启RDB和AOF持久化时,重启时只会加载AOF文件,不会加载RDB文件,除非开始判断发现AOF文件不存在,会找
RDB文件
开启方式
设置redis.conf配置文件中的
aof-use-rdb-premble yes #开启混合模式 默认为no总结:
1.RDB用做全量持久化
2.AOF做增量持久化
3.使用RDB进行快照存储,使用AOF持久化记录所有写操作,当重写策略满足或手动触发时,将最新的数据储存为RDB