Login
网站首页 > 文章中心 > 其它

Redis RDB 与AOF

作者:小编 更新时间:2023-09-23 07:10:37 浏览量:279人看过


参考书籍<>


一丶为什么redis需要持久化

一丶为什么redis需要持久化

redis 作为一个内存数据库,如果不想办法将存储在内存中的数据,保存到磁盘中,那么一旦服务器进程退出,那么redis数据库中的数据就将丢失.

二丶RDB

redis 提供RDB持久化功能,可以将数据库中的数据保存到磁盘中,避免数据意外丢失.Redis RDB 是将一个时间点的数据库状态保存到RDB文件中,RDB文件时一个经过压缩的二进制文件,通过该文件可以还原申生成RDB时的数据库状态.

1.SAVE与BGSAVE

SAVE和BGSAVE 命令都能生成RDB文件

SAVE命令会阻塞redis服务器进程,直到SAVE命令执行完为止,在服务器进程阻塞的期间,服务器无法处理任何命令请求

BGSAVE会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程可以继续处理请求命令

Redis 服务在启动的时候会检测RDB文件的存在,并自动载入RDB文件.由于AOF文件更新的频率比RDB高(频率高意味着数据全),所以如果同时具备AOF 和RDB文件,redis服务器会选择AOF文件进行恢复.

BGREWRITEAOF 可以触发AOF持久化,但是不允许和BGSAVE一起执行(因为一起执行意味着大量的磁盘写入操作)

2.RDB自动间隔保存

redis 允许用户通过配置save选项,让服务器每隔一段时间自动执行一次BGSAVE命令.如


save 900 1
save 300 10
save 60 1000


三丶AOF

除了RDB之外,redis 还有AOF(append only file)持久化的功能,与RDB持久化通过将数据库数据保存到文件中不同,AOF 持久化时通过保存redis服务器执行的修改操作命令来实现的.如


set msg "hello"


对于这条命令,RDB记录的是msg 键和对应的值,但是AOF记录的是set msg "hello"这条命令.AOF持久化可以使用BGREWRITEAOF触发

AOF可以分为如下流程

Redis RDB 与AOF

1.命令追加

服务器在执行完一个写明了后,会以协议格式将被执行的命令追加到redis服务器中的aof_buf末尾

2.AOF 文件写入和同步

redis每次结束一个事件循环之前都会调用flushAppendOnlyFile来判断是否需要将aof_buf里的内容写入到AOF文件中.redis服务器配置的appendfsync 设置可以控制aof 文件写入的时机:

always

将aof缓冲区的所有内容写入并且同步到aof文件

选择此配置,意味着每次都需要将命令写回磁盘,安全性最高,但是会导致效率很低

everysec

每秒写入aof缓冲区中的内容,并同步aof文件(同步操作由另外一个线程专门进行)

选择此配置,意味着每秒写回磁盘,最多丢失一秒的数据

no

将aof缓冲区中的内容写入到AOF文件但是不同步,何时同步由操作系统决定

此配置不会将命令马上写回磁盘,效率高,但是不安全


为了提高文件的写入效率,在现代操作系统中,用户调用write函数,将一些数据写入到文件的时候,操作系统通常会将期望写入的数据保存到一个内存缓冲区中,等缓冲区满或者超过一段事件后,才真正的将缓冲数据写入到磁盘
这样的操作提高的效率,但是带来了数据丢失的风险,所以操作系统提供了fsync 和fdatasync两个同步函数,让用户调用强制让缓冲区写入磁盘,从而确保数据的安全性


③AOF重写

AOF重写程序将使用子进程的方式执行命令,从而让服务器进程可以继续处理请求.

为了解决重写过程中,键值对被修改的问题,redis使用aof重写缓冲区,在重写过程中,用户修改数据库的命令会被保存到AOF缓冲区和AOF重写缓冲区.子进程完成AOF重写后,会将AOF重写缓冲区中的命令同步到新AOF文件中,这时候新文件保存的内容就和数据库一致了.然后子进程将修改新AOF文件名称,原子的覆盖旧AOF文件.

以上就是土嘎嘎小编为大家整理的Redis RDB 与AOF相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章