Redis持久化

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以前:

Redis持久化_第1张图片

7以后:

Redis持久化_第2张图片

shut down 和 flushdb 命令会触发RDB

自动触发和手动触发

修改配置文件,让5s钟修改2次保存

save 5 2

修改rdb文件保存路径

dir ./dumpfiles
//需要注意的是,dumpfiles需要提前创建好

修改rdb文件的文件名

dbfilename dump6379.rdb

然后5s内执行两次操作,发现自动存储了rdb文件:

Redis持久化_第3张图片

修复rdb文件

在这里插入图片描述

手动触发 save 和 bgsave

save:

在主程序中执行会阻塞当前redis服务器,直到持久化工作完成

执行save命令期间,redis不能处理其他命令

线上禁止使用save命令!!!

bgsave:

redis会在后台异步进行快照操作,不阻塞

快照同时还可以响应客户端请求

该触发方式会fork一个子进程由它复制持久化过程
Redis持久化_第4张图片

可以通过lastsave命令获取最后一次成功执行快照的时间

RDB的优点和缺点

  • RDB最大限度地提高了redis的性能,因为redis父进程为了持久化做的唯一工作就是派生一个将完成所有持久化工作的子进程,而父进程不用做任何磁盘IO/或类似操作

  • 与AOP相比,RDB即使是大数据集也会更快地重启

  • RDB是一个非常紧凑的单文件时间点表示,非常适合备份

  • 它是容易恢复的,是一个可以传输到远程数据中心或云端的压缩文件

  • 如果要把redis停止工作时(例如断电后)造成的数据损失降到最低,RDB做的并不好

  • RDB需要经常fork()以便使用子进程进行持久化,如果数据集很大而且CPU性能不好,redis可能停止为客户端服务几毫秒甚至一秒钟 建议调整写日志的频率

哪些情况会触发RDB快照

Redis持久化_第5张图片

如何禁用RDB

save “”

RDB的一些优化参数

Redis持久化_第6张图片
Redis持久化_第7张图片
在这里插入图片描述
在这里插入图片描述

学习AOF

将redis执行过的所有写操作记录下来,重启redis服务器会重新执行写操作

开启AOF:

appendonly yes

AOF持久化的工作流程

Redis持久化_第8张图片

AOF三种写回策略

AOF缓冲区会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件中

Always

同步写回,每个写命令执行完立刻同步地将日志写回磁盘

no

操作系统控制写回,每个写命令执行完,只是先把日志写到AOF缓冲区,由操作系统决定何时写回磁盘

everysec(default)

每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1S把缓冲区中的内容写入磁盘

appendfsync everysec
appendfilename "appendonly6379.aof"
//修改保存名称

AOF实现

Redis持久化_第9张图片

Redis持久化_第10张图片

错误的AOF文件修复

redis-check-aof --fix dumpfiles/appendonly6379.aof

Redis持久化_第11张图片

AOF优势

Redis持久化_第12张图片

AOF缺点

Redis持久化_第13张图片
在这里插入图片描述

AOF的重写机制

由于AOF持久化机制是不断把写命令记录到AOF文件中,那么随着写命令越来越多,AOF文件会越来越膨胀

文件越大,占用服务器内存和AOF恢复占用时间越长

为了解决这个问题,引入了AOF重写机制

AOF重写机制是干什么的? 给AOF文件瘦身的 瘦身计划

只保留可以恢复数据的最小指令集

可以手动使用命令 bgrewriteaof 来刷新

例如有三条命令

重写前:
set k1 v1 
set k1 v2
set k1 v3

重写后:
set k1 v3

AOF重写机制的触发机制

Redis持久化_第14张图片

注意,同时满足且的关系才会触发

  1. 根据上次重写后aof文件的大小,判断当前aof文件是不是增长了100%(一倍)
  2. 判断当前aof文件是否达到64mb

ps:关闭混合,只是用aof持久化
在这里插入图片描述
Redis持久化_第15张图片

AOF重写原理

Redis持久化_第16张图片

AOF持久化系列操作

Redis持久化_第17张图片

RDB和AOF混合持久化

在这里插入图片描述

开启rdb和aof混合持久化
Redis持久化_第18张图片
Redis持久化_第19张图片

结论: RDB做全量持久化,AOF做增量持久化

数据恢复顺序和加载流程

在不考虑混合持久化的时候,同时开启rdb和aof持久化时,重启时只会加载aof文件,不会加载rdb文件

redis纯缓存模式

为了提高redis的性能,不需要做持久化操作,也就是同时关闭rdb和aof

关闭rdb : save “”

关闭aof : appendonly no

你可能感兴趣的:(redis,数据库,缓存)