redis持久化机制

redis的持久化机制常常会在面试中问到,基本上都可以回答出RDB和AOF两种持久化机制。
问题一:什么是持久化?

将数据(如内存中的对象)保存到可永久保存的存储设备中的过程称为持久化。

问题二:为什么要持久化

redis的数据都是缓存在内存中的,那么当系统宕机或者关机时,内存中的数据就会丢失,所以需要持久化来保证数据的长期保存。

问题三:redis持久化机制有几种,分别是什么?

1、RDB持久化机制
2、AOF持久化机制
RDB持久化可以在指定的时间间隔内对数据进行快照,快照可以比作将数据拍成一张照片。也是redis默认的持久化方式。间隔时间可配置在redis.conf中

save 900 1
save 300 10
save 60 10000
//900秒内 对数据进行了至少1次更改
//300秒内 对数据进行了至少10次更改
//60秒内 对数据进行了至少10000次更改
三个条件触发任意一个 都会进行RDB快照。
RDB持久化:

分为三种机制 1、save 2、besave 3、自动化
1、save机制

save命令是阻塞redis服务器的,当执行save命令时,redis不能进行其他的操作,当save执行完毕后,redis才可以执行其他的命令,执行完成后新生成的RDB文件将会替换掉旧的RDB文件。这种方式不可取,因为在执行save的期间,当大量的请求进来时,这些请求是无法第一时间执行的。

2、besave机制

besave命令是非阻塞的,在执行besave快照时,redis服务器还可以处理其他的请求,因为快照是在后台一步执行的。其实besave命令也是会发生阻塞的,不过和save不同的是,besave的阻塞是放生在fork子进程时才会发生,不会影响其他的进程,而且阻塞的时间很短。所以 redis内部几乎所有的RDF都是通过这种当时进行的快照。

3、自动机制

自动触发是由我们的配置文件来完成的。在redis.conf配置文件中
save 900 1
save 300 10
save 60 10000
特别需要注意的是:配置文件中写的是save,其实际自动执行的是besave命令。

总结:RDF持久化在执行的过程中实际上是父进程fork一个子进程进行快照,当子进程快照完成后将会替换掉原来的旧文件。
RDF持久化时,每次进行的快照都是全量的,这可以应用于备份,而且只有一个文件,不会每次快照都生成不同的文件。

AOF持久化:

AOF的工作机制为,每当收到写,删除等命令时,都会记录下来,查询命令不会被记录,这种方式和日志记录的方式很相似。都没新增的记录都会追加到文件的末尾。
这样的操作会存在一个问题,AOF文件会越来越大,这时怎么处理?
redis提供了bgrewriteaof命令,这个命令的意思时,fork子进程,通过查询所有内存中的数据的方式,全量保存到新的AOF文件中 这个和RDB很相似。
三种同步策略
1、每秒同步
2、每修改同步
3、不同步

问题四:二者优缺点,如何选择?
RDB优点:

1、全量备份、一个文件。
2、和AOF相比 同量级的数据,RDB效率更高
3、灾难恢复的绝佳选择

AOF优点:

1、数据的安全性,通过日志记录的方式每次都是新增,而非全量
2、数据的可阅读性强
3、日志过大时,可以通过rewrite方式 自动重写文件

如何选择?

小学生才做选择题,我全都要。
真正环境中,可根据实际需要选择。
两者可以共存,
AOF优先级要高于RDB
RDB可以用作大量数据的备份或者灾难恢复
AOF保证数据的完整安全性