Redis 持久化方式

Redis的数据是保持在内存中的,但当服务器宕机时,内存中的数据会丢失,因此需要将内存中的数据持久化,使得内存数据丢失时能够重新载入。Redis的持久化方式有RDB和AOF两种

 一、RDB持久化

Redis默认采用RDB持久化,可以将Redis在内存中的数据库状态保存到磁盘内,避免数据意外丢失。其中RDB文件是一个经过压缩的二进制文件。

1.RDB文件的创建

(1)当执行save命令或bgsave命令时,会生成RDB文件。两者的区别是,save命令会阻塞Redis服务器进程,此时服务器不能处理任何命令的请求,直至RDB文件创建完成;bgsave命令会派生出一个子进程,由子进程负责创建RDB文件,服务器进程继续处理客户端请求

(2)可通过修改save配置设置保存条件,如果满足以下配置的条件,即3600秒内对数据库至少修改一次、300秒内对数据库至少修改100次、60秒内对数据库至少修改10000次,其中一个条件得到满足,服务器就会执行bgsave命令

(3)当Redis服务器关闭时,会创建RDB文件

2.RDB文件的载入

在服务器启动时,会载入RDB文件,此时服务器处于阻塞状态,直至载入工作执行完毕。

二、AOF持久化

AOF(append only file)持久化是通过保存Redis服务器所执行的写命令来记录数据库的状态的。可通过修改redis.conf文件中的配置开启AOF持久化。

appendonly 默认为no,若要开启AOF持久化功能,将no修改为yes

1.AOF功能实现

(1)命令追加:当AOF功能开启时,会将服务器执行的命令追加到服务器状态的aof_buf缓冲区末端

(2)AOF文件的写入和同步:服务器每执行一次事件循环之前,都会调用flushAppendOnlyFile函数,考虑是否将缓冲区的命令写入至AOF文件。其中flushAppendOnlyFile函数的行为由配置appendfsync选项的参数决定

  • always:同步写回,每个事件循环都会立马同步写回至AOF文件,速度最慢,但可靠性最高
  • everysec:默认选项,每秒将AOF缓冲区的命令写回至AOF文件
  • no:由服务器决定何时将命令同步至AOF文件

2.AOF重写

因为AOF文件是通过记录服务器执行的写命令还保存数据库状态,随着时间推移文件会越来越大。为了解决文件体积膨胀的问题,Redis提供了AOF重写功能。

(1)AOF重写的实现:AOF文件重写不需要对现有的AOF文件进行读写分析,而是通过读取数据库状态,用一条写命令保存键值对。AOF重写是在子进程中执行的,在重写过程中,Redis服务器还会接受客户端发送的写命令,可能会对现有数据库状态进行修改,使得当前数据库状态和重写后AOF文件所保存的数据库状态不一致,因此Redis服务器设置了一个AOF重写缓冲区。在服务器创建子进程后开始使用,服务器每执行完一个写命令,会将该命令同时发送给AOF缓冲区和AOF重写缓冲区。当重写工作完成后,会将重写缓冲区的内容全部写入到新的AOF文件

三、对比

安全性:AOF模式由于提供了三种持久化策略,安全性更高,适用于对数据不丢失要求高的场景

载入速度:由于AOF文件实际保存的是服务器运行期间执行过的命令,重新载入时需要逐条执行,而RDB文件保存的是数据库的键值对,在重新载入时,RDB模式会更快

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值