Redis持久化
为什么需要Redis持久化?
Redis在内存中保存数据,而内存数据是易失性的。这意味着如果Redis进程关闭或崩溃,所有在内存中的数据都将丢失。为了避免这种情况,Redis提供了持久化功能,它可以将Redis的数据存储到磁盘上,以便在Redis重新启动时能够恢复数据。
官方提供了持久化的那些方式?
1. RDB (Redis DataBase)
RDB Persistence 在指定的时间间隔内执行数据集的时间点快照
2. AOF (Append Only-File)
AOF持久性记录服务器收到的增删改操作,然后可以在服务器启动时再次播放这些记录,重建原始数据集
3. 没有持久性
你可以完全禁用持久性,这有时在缓存中使用
4. RDB + AOF
你可以在同一实例中合并 DRB 和 AOF
学习RDB
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照
这样一来,即使故障宕机,快照文件也不会丢失
这个快照文件就称为RDB文件(dump.rdb)
Redis的数据都在内存中,保存备份时它执行的是全量快照,也就是说,把内存中的所有数据都记录到磁盘中,一锅端
在执行RDB操作时,Redis会阻止所有客户端进行写操作,以确保在生成RDB文件期间不会有任何数据更改
RDB操作在Redis不同版本,也有较大改动
7以前:
7以后:
shut down 和 flushdb 命令会触发RDB
自动触发和手动触发
修改配置文件,让5s钟修改2次保存
save 5 2
修改rdb文件保存路径
dir ./dumpfiles
//需要注意的是,dumpfiles需要提前创建好
修改rdb文件的文件名
dbfilename dump6379.rdb
然后5s内执行两次操作,发现自动存储了rdb文件:
修复rdb文件
手动触发 save 和 bgsave
save:
在主程序中执行会阻塞当前redis服务器,直到持久化工作完成
执行save命令期间,redis不能处理其他命令
线上禁止使用save命令!!!
bgsave:
redis会在后台异步进行快照操作,不阻塞
快照同时还可以响应客户端请求
该触发方式会fork一个子进程由它复制持久化过程
可以通过lastsave命令获取最后一次成功执行快照的时间
RDB的优点和缺点
-
RDB最大限度地提高了redis的性能,因为redis父进程为了持久化做的唯一工作就是派生一个将完成所有持久化工作的子进程,而父进程不用做任何磁盘IO/或类似操作
-
与AOP相比,RDB即使是大数据集也会更快地重启
-
RDB是一个非常紧凑的单文件时间点表示,非常适合备份
-
它是容易恢复的,是一个可以传输到远程数据中心或云端的压缩文件
-
如果要把redis停止工作时(例如断电后)造成的数据损失降到最低,RDB做的并不好
-
RDB需要经常fork()以便使用子进程进行持久化,如果数据集很大而且CPU性能不好,redis可能停止为客户端服务几毫秒甚至一秒钟 建议调整写日志的频率
哪些情况会触发RDB快照
如何禁用RDB
save “”
RDB的一些优化参数
学习AOF
将redis执行过的所有写操作记录下来,重启redis服务器会重新执行写操作
开启AOF:
appendonly yes
AOF持久化的工作流程
AOF三种写回策略
AOF缓冲区会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件中
Always
同步写回,每个写命令执行完立刻同步地将日志写回磁盘
no
操作系统控制写回,每个写命令执行完,只是先把日志写到AOF缓冲区,由操作系统决定何时写回磁盘
everysec(default)
每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1S把缓冲区中的内容写入磁盘
appendfsync everysec
appendfilename "appendonly6379.aof"
//修改保存名称
AOF实现
错误的AOF文件修复
redis-check-aof --fix dumpfiles/appendonly6379.aof
AOF优势
AOF缺点
AOF的重写机制
由于AOF持久化机制是不断把写命令记录到AOF文件中,那么随着写命令越来越多,AOF文件会越来越膨胀
文件越大,占用服务器内存和AOF恢复占用时间越长
为了解决这个问题,引入了AOF重写机制
AOF重写机制是干什么的? 给AOF文件瘦身的 瘦身计划
只保留可以恢复数据的最小指令集
可以手动使用命令 bgrewriteaof 来刷新
例如有三条命令
重写前:
set k1 v1
set k1 v2
set k1 v3
重写后:
set k1 v3
AOF重写机制的触发机制
注意,同时满足且的关系才会触发
- 根据上次重写后aof文件的大小,判断当前aof文件是不是增长了100%(一倍)
- 判断当前aof文件是否达到64mb
ps:关闭混合,只是用aof持久化
AOF重写原理
AOF持久化系列操作
RDB和AOF混合持久化
开启rdb和aof混合持久化
结论: RDB做全量持久化,AOF做增量持久化
数据恢复顺序和加载流程
在不考虑混合持久化的时候,同时开启rdb和aof持久化时,重启时只会加载aof文件,不会加载rdb文件
redis纯缓存模式
为了提高redis的性能,不需要做持久化操作,也就是同时关闭rdb和aof
关闭rdb : save “”
关闭aof : appendonly no