Redis之1持久化

redis为什么要持久化

1.redis做为数据库使用时,数据库必须提供持久化特性;

2.redis做为缓存使用时,持久化缓存数据:

​ redis崩溃时重新加载持久化的数据;

​ redis迁移

redis支持的两种持久化方式

RDB(Redis Database Backup file)

属于全量数据备份,备份的是数据

save 这个是阻塞的。一般在关机维护时使用。

bgsave 这个是由fork()子进程实现的。

配置文件中给出bgsave的规则: (使用的save这个标识)

1
2
3
4
5
6
7
8
9
save 900 1

save 300 10

save 60 10000

dbfilename dump.rdb

dir /var/lib/redis/6379

rdb 的弊端

不支持拉链 只有一个dump.rdb

丢失数据相对多一些 (时点与时点之间窗口数据容易丢失 8得到一个rdb,9刚要落盘一个rdb,挂机了)

rdb的优点

类似java中的序列化,恢复的速度相对快

AOF

append only if,增量持久化备份,备份的是指令

redis的写操作记录到文件中

写操作会触发IO

相关配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
appendonly yes

appendfilename "appendonly.aof"

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

appendfsync always

appendfsync everysec

appendfsync no

AOF优点

丢失数据少

AOF弊端

恢复慢

fork()创建子进程

linux父子进程:

父进程的数据,子进程可不可以看得到?

常规思想,进程是数据隔离的!

进阶思想,父进程其实可以让子进程看到数据!

linux中

export的环境变量,子进程的修改不会破坏父进程

父进程的修改也不会破坏子进程

fork()

1,速度:快

2,空间:小

fork()使用的是copy on write机制。

copy on write:内核机制

写时复制

创建子进程并不发生复制。

创建进程变快了。

根据经验,不可能父子进程把所有数据都改一遍。

玩的是指针。

使用 linux fork()出一个子进程,这时主进程还是可以提供服务的。子进程可以看到内存上的数据。如果主进程进行数据的修改,是先由内存创建出一个8的内存空间,主进程a的指向改成8的内存地址。这时子进程中的a的指向还是指向3。所以如果8点开始持久化,就是8点的数据。

aof 文件大,从而导致恢复更慢,redis的演变

都是重写。

4.0以前

删除抵消的命令(add k1 1 del k1)

合并重复的命令 (inby k1 1 重复1000)

最终也是一个纯指令的日志文件

4.0以后

将老的数据RDB到aof文件中

将增量的以指令的方式Append到AOF

AOF是一个混合体,利用了RDB的快,利用了日志的全量

redis中,RDB和AOF可以同时开启

如果开启了AOF,只会用AOF恢复

4.0以后:AOF中包含RDB全量,增加记录新的写操作(aof文件为一个混合文件)


Redis之1持久化
http://hanqichuan.com/2022/05/17/redis/redis之1持久化/
作者
韩启川
发布于
2022年5月17日
许可协议