Redis持久化

26 阅读4分钟

十、Redis持久化

Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!

在主从复制中,rdb是备用的!

1、RDB(Redis Database)

什么是RDB

1679724726688.png

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshort快照,它恢复时是将快照文件直接读到内存里。

Redis会单独的创建(fork)一个子进程来持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。这个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能会丢失。我们默认的就是RDB,一般情况下不需要修改这个配置

有时候在生产环境中我们会将dump.rdb文件备份

RDB保存的文件是 dump.rdb 都是在我们的配置文件中快照中进行配置的!

1679722434762.png

触发机制

1、save的规则满足的情况下,会自动触发rdb规则

2、执行flushall命令,也会触发我们的rdb规则

3、退出redis,也会产生rdb文件!

备份就自动生成一个dump.rdb

如何恢复rdb文件

1、只需要rdb文件放在我们redis启动目录就可以了,redis启动的时候会检查dump.rdb恢复其中的数据!

2、查看需要存在的位置

27.0.0.1:6379> config get dir
1) "dir"
2) "/opt/redis-7.0.9/myredis" #如果在这个目录下面存在dump.rdb文件,启动就会自动恢复其中的数据

优点

1、适合大规模的数据恢复!dump.rdb

2、如果你对数据的完整性要求不高!

缺点

1、需要一定的时间间隔进程操作!如果redis意外宕机,最后一次修改数据就没有了!

2、fork子进程的时候会占用一定的内存空间!

2、AOF(Append Only File)

将我们的所有命令都记录下来,history,恢复的时候就把这个文件全部再执行一遍!

是什么 1679725473413.png

以日志的形式来记录每一个写的操作,将Redis执行过的所有指令都记录下来(读操作不记录),只许追加但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF保存的是appendonly.aof文件 1679727683122.png

默认是不开启的,我们需要手动进行配置!我们只需要将appendonly改为yes就开启了aof!

1679727610579.png

如果aof文件有错位的,这时候是启动不起来 的,我们需要修复这个aof文件,redis提供了 redis-check-aof --fix 文件名

1679728198273.png

redis-check-aof --fix /opt/redis-7.0.9/myredis/appendonlydir/appendonly.aof.1.incr.aof 将出问题的一部分删除

[root@localhost myredis]# cd /usr/local/bin
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server                
[root@localhost bin]# redis-check-aof --fix /opt/redis-7.0.9/myredis/appendonlydir/appendonly.aof.1.incr.aof 
Start checking Old-Style AOF
0x              a5: Expected \r\n, got: 6461
AOF analyzed: filename=/opt/redis-7.0.9/myredis/appendonlydir/appendonly.aof.1.incr.aof, size=188, ok_up_to=140, ok_up_to_line=40, diff=48
This will shrink the AOF /opt/redis-7.0.9/myredis/appendonlydir/appendonly.aof.1.incr.aof from 188 bytes, with 48 bytes, to 140 bytes
Continue? [y/N]: y
Successfully truncated AOF /opt/redis-7.0.9/myredis/appendonlydir/appendonly.aof.1.incr.aof
[root@localhost bin]# cd /opt/redis-7.0.9/myredis/
[root@localhost myredis]# redis-server redis7.conf 
[root@localhost myredis]# ps -ef|grep redis
root      68905  68641  0 13:53 pts/2    00:00:00 redis-cli -a yanghang -p 6379
root      69969      1  0 15:12 ?        00:00:00 redis-server *:6379
root      69975   9625  0 15:12 pts/1    00:00:00 grep --color=auto redis

重写规则

如果aof文件大于64M,太大了!就会重新fork一个子进程来将我们的aof文件重写!

优点

1、每一次修改都同步,文件的完整性都会更加好!

2、默认的设置是每秒同步一次,可能会丢失一秒的数据!

3、从不同步,效率最高

缺点

1、相对于数据文件来说,aof文件远远大于rdb,修复速度也比rdb慢!

2、aof运行效率要比rdb慢,所以我们的redis默认的是rdb!