Redis是内存数据库,所以如果不把数据保存到磁盘上,服务器⼀旦进程退出,或者
断电,数据就会丢失,所以 Redis 提供了持久化功能
- RDB(Redis 数据库):RDB 持久性以指定的时间间隔执⾏数据集的时间点快照。
- AOF(仅追加⽂件):AOF 持久性记录服务器接收到的每个写操作。然后可以在服务器启动时再次重播这些操作,从⽽重建原始数据集。命令使⽤与 Redis协议本身相同的格式进⾏记录。
要注意的是Redis7 提供了新的持久化模式: RDB + AOF :可以在同⼀个实例中组合AOF 和 RDB 。
RDB
RDB的特点
- RDB持久化是通过创建数据的快照实现的。具体来说,Redis会在指定的时间间隔内,将内存中的数据集快照写⼊磁盘,也就是创建了⼀个数据集的副本。
- 这个时间间隔可以通过"save"配置选项进⾏设置,如"save 900 1"表示如果900秒内有⾄少1个key变化,则创建⼀个snapshots快照。
- RDB是Redis默认的持久化⽅式,主要优点是能最⼤化Redis的性能,并且⽣成的RDB⽂件⾮常适合⽤于全量复制、数据备份等场景。
- 但是,如果Redis意外宕机,你可能会丢失最后⼀次快照以后修改的所有数据。
- rdb保存⽂件:dump.rdb 默认保存在当前运⾏⽬录
RDB总结
- 当我们redis⼀旦出现问题,服务重启,服务关闭以后,再次启动时就会读取备份⽂件,恢复数据。
- 为了避免出现备份被删除或者丢失的问题,⼀般情况下我们会定时把redis中的备份数据迁移到别处以防⽌数据丢失。
- 还有⼀点要注意:设置时间不能太短,加⼊1秒就备份数据,会导致⼤量的磁盘IO,造成磁盘压⼒
RDB相关配置
stop-writes-on-bgsave-erfor yes # 持久化如果出错,是否还需要继续⼯作!rdbcompression yes # 是否压缩 rdb ⽂件,需要消耗⼀些 Cpu 资源!rdbchecksum yes # 保存 rdb ⽂件的时候,进⾏错误的检查校验!dbfilename dump.rdb #rdb ⽂件名称dir./ #rdb ⽂件保存的⽬录!save 900 1
RDB如何触发
自动触发
当满足配置中的save条件,例如900秒里有一次更新,自动触发RDB
手动触发
- save命令:在redis中使⽤save命令,此命令有Redis主进程执⾏,会阻塞所有命令,但是这个⽅式如果数据量⼤的时候会导致效率较慢
- bgsave命令:所以⽐较推荐执⾏bgsave,此命令会开启⼦进程执⾏rdb,避免主进程受影响(⽣产必须⽤这个命令)该触发⽅式会fork一个子进程由⼦进程复制持久化过程
fork流程
RDB的缺点
1 、执⾏间隔时间⻓,两次 RDB之前可能存在数据丢失⻛险
2 、 fork⼦进程、压缩、写出RDB⽂件都⽐较耗时
AOF
AOF的特点
Redis提供的⼀种持久化策略,也被称为追加模式或⽇志模式。与 Redis 的另⼀种持久化策略RDB 不同, AOF 是通过保存 Redis 服务器所执⾏的写命令来记录数据库的状态。
简单理解: Redis 处理的每⼀个写命令都会记录在 AOF ⽂件,可以看做时命令⽇志⽂件。
其实这种⽅式就是当Redis 有要求不能丢失任何写的内容,可以采⽤ AOF 持久化⽅式。
由于在使⽤AOF 持久化⽅式时, redis 会将每⼀个收到的命令都通过 write 函数追加到⽂件中(默认appendonly.aof )。当 redis 重启时会通过重新执⾏⽂件中保存的写命令在内存中重建整个数据库内容
AOF命令
⾸先AOF默认是关闭的,需要修改redis.conf配置⽂件来开启
appendonly yes # 是否开启 AOF 默认 noappendfilename "appendonly.aof" # AOF ⽂件名appenddirname "appendonlydir" #Redis7 新增 , ⽤于储存所有 AOF ⽂件的⽬录名称
AOF 命令记录频率可以通过 redis.conf 配置⽂件控制
appendfsync always # 表示每执⾏⼀次写命令,⽴即记录到 AOF ⽂件 性能最差appendfsync everysec # 写命令执⾏完先放⼊ AOF 缓冲区,然后表示每隔 1 秒钟将缓冲区数据写⼊AOF ⽂件,默认(最多丢失 1 秒内的数据)appendfsync no # 写命令执⾏完放⼊ AOF 缓冲区,由操作系统决定何时将缓冲区内容写磁盘
redis 7.0 优化 AOFRW (AOF rewrite)
从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)机制如果触发
自动触发条件
此时为两种条件同时满⾜,才会触发机制
条件 1 :根据上次重写后的 AOF ⽂件⼤⼩,判断当前 AOF ⽂件⼤⼩是否增⻓了 1 倍
条件 2 :重新时需要满⾜设定的⽂件⼤⼩默认 64mb
⼿动触发命令
执⾏命令: bgrewriteaof 命令
AOFRW原理
- 触发重写机制以后,Redis会创建⼀个⼦进程,此进程会读取现有的AOF⽂件,将包含的指令压缩并写⼊到临时⽂件中
- 此时主进程如果收到新的写指令,会把这些新指令累计到缓存区中,同时也会写⼊到原有的AOF⽂件中,保证重写过程失败,原有⽂件依旧可⽤
- 当⼦进程重写完成后,主进程会把重写期间产⽣的变化写⼊到新的ADF⽂件中
- 追加结束之后,新的ADF会覆盖⽼的AOF
![](https://img-blog.csdnimg.cn/direct/9454129613f74408b9ae7c524929fcc2.png)
RDB与AOF混合持久化
注意: 同时开启 RDB 和 AOF 持久化时,重启时只会加载 AOF ⽂件,不会加载 RDB ⽂
件,除⾮开始判断发现 AOF ⽂件不存在,会找 RDB ⽂件
开启⽅式
设置 redis.conf 配置⽂件中的aof-use-rdb-premble yes # 开启混合模式 默认为 no
总结:
1. RDB ⽤做全量持久化
2. AOF 做增量持久化
3. 使⽤ RDB 进⾏快照存储,使⽤ AOF 持久化记录所有写操作,当重写策略满⾜或
⼿动触发时,将最新的数据储存为 RDB