Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

今日内容介绍,大约花费9分钟

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

思考:redis做为缓存,数据的持久化是怎么做的?

在Redis中提供了两种数据持久化的方式:

  • RDB
  • AOF


1. RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中当Redis实例故障重启后,从磁盘读取快照文件,恢复数据

1.1. RDB在四种情况下会执行持久化

  • 1.执行save命令
  • 2.执行bgsave命令
  • 3.Redis停机时(默认执行一次save)
  • 4.触发执行RDB条件

1.2. save和bgsave区别

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

save命令:会由Redis主进程进行执行RDB,会阻塞所有Redis命令,只有执行save命令,日志中就会出现DB savedRedis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

bgsave命令:会使用fork开启子进程执行RDB,避免主进程受影响Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

1.3. Redis停机是RDB持久化

Redis停机时会执行一次save命令,实现RDB持久化。结果如下:说在退出redis之前进行一次RDFRedis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

1.4.  触发RDB条件(理解Save格式即可)

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

# 900秒内,如果超过1个key被修改,则发起快照保存
save 900 1
# 300秒内,如果超过10个key被修改,则发起快照保存
save 300 10
# 60秒内,如果1万个key被修改,则发起快照保存
save 60 10000

1.5 RDB原理

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

当Redis父进程修改数据时,父进程会将原先的数据复制一份生成新的副本,然后修改父进程的指针,指向新的数据,此时父进程修改的新的数据不会影响到子进程。此时子进程的指针仍然指向旧的数据,子进程看到的数据还是bgsave时候的数据。当下一次执行bgsave时,新fork出来的子进程指针才会指向这次新的数据

页表:记录虚拟地址与物理地址的映射关系

RDB的缺点

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  • fork子进程、压缩、写出RDB文件都比较耗时

2. AOF

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

2.1. AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?AOF的命令记录的频率也可以通过redis.conf文件来配:

# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always 
# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec 
# 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?
配置项 刷盘时机 优点 缺点
Always 最多丢失1秒数据 可靠性高,几乎不丢数据 性能影响大
everysec 每秒刷盘 性能适中 最多丢失1秒数据
no 操作系统控制 性能最好 可靠性较差,可能丢失大量数据

2.2.  AOF文件重写

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

# AOF文件比上次文件 增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写 
auto-aof-rewrite-min-size 64mb
Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

2.3. AOF和RDB优缺点对比

RDB AOF
持久化方式 定时对整个内存做快照 记录每一次执行的命令
数据完整性 不完整,两次备份之间会丢失 相对完整,取决于刷盘策略
文件大小 会有压缩,文件体积小 记录命令,文件体积很大
宕机恢复速度 很快
数据恢复优先级 低,因为数据完整性不如AOF 高,因为数据完整性更高
系统资源占用 高,大量CPU和内存消耗 低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源
使用场景 可以容忍数分钟的数据丢失,追求更快的启动速度 对数据安全性要求较高常见

3. Reids持久化面试题

面试官:redis做为缓存,数据的持久化是怎么做的?

候选人

在Redis中提供了两种数据持久化的方式:1、RDB  2、AOF

面试官:这两种持久化方式有什么区别呢?

候选人

RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。

AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据

面试官:这两种方式,哪种恢复的比较快呢?

候选人

RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

面试官:在实际生产中我们如何选择AOF和RDB持久化呢?

候选人

实际上他们两个是相互辅助的

  • 不能只设置RDB,因为只设置RDB会导致数据大量丢失(两次保存时间间隔的数据会丢失)

  • 不能只设置AOF,因为当 AOF 文件非常大时,恢复过程可能需要较长时间,RDB相对于AOF更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug;

  • Redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择;用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!

原创不易,转载请注明出处,感谢支持!如果本文对您有用,欢迎转发分享!

原文始发于微信公众号(springboot葵花宝典):Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容