首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

五分钟读透redis持久化

redis持久化有两种方式:RDB和AOF

1、RDB文件是一个经过压缩的二进制文件

2、AOF文件保存redis服务器所执行的写命令来记录数据库状态

redis在服务器启动的时候会检查是否开启了AOF,如果开启了就优先使用AOF文件来缓存数据库,只有AOF关闭的时候才会使用RDB文件来还原数据库状态,AOF文件的更新频率一般比RDB文件更新的频率更高。具体流程如下:

redis中SAVE 和BGSAVE 命令可以用于生成RDB文件

1、SAVE 会堵塞服务器进程,期间服务器不能处理任何命令

2、BGSAVE 会派生出一个子进程,然后由子进程负责创建RDB,服务器进程(父进程)继续处理请求

如果在redis服务器中配置了save选项时。会让服务器每个一段时间执行一次BGSAVE。

例如

save 900 1

save 300 10

save 60 10000

那么只要 900秒数修改一次,300秒修改10次,60秒修改10000次其中一个条件,系统就会执行BGSAVE命令。

AOF打开时,每次执行写命令都会追加到服务器的aof_buf缓冲区末尾,而什么时候写入aof文件则取决于appendfsync 参数的配置。appendfsync 参数的配置会直接影响持久化的效率和安全性。

1、always 每个事件循环都将aof_buf

中的数据写入 aof文件,并同步aof文件,所以always 执行

2、everysec 每个事件循环写入aof,并且每秒同步aof文件

3、no 表示每个事件循环都写入aof,但是何时同步aof文件,则由系统决定。

综上所述:

效率:always

安全性:always >everysec >no

写入aof和同步aof的理解:

操作系统为例提高写入效率,当用户调用write方法时,会先写入内存缓冲区,当缓冲区空间被填满,或者超过指定时限时才会写入硬盘。但是在计算机停机的时候,这部分数据将会丢失。为此,系统提供了fsync,fdatasync两个方法,强制将缓冲区的内容写入硬盘。所以写入aof只是写入到内存缓冲区,而同步aof才最终写入硬盘实现数据的持久化。

aof记录所有的写命令,aof文件内容越来越多,体积越来越大,可能会影响redis的性能,同时会存在很多冗余的命令。为了解决这个问题,redis实现了一个AOF重写的功能。

AOF 重写实际上是读取数据库中的键值,生成一个新的AOF文件。生成新的AOF文件的时候线程将会长时间堵塞,影响线上操作,所以redis实现了 bgrewriteaof 。即在aof重写期间,客户端发送来的写命令redis会写入一份到 aof重写缓冲区(并非aof缓冲区,实际上会同时向aof缓冲区和aof重写缓冲区各写一份)中,完成创建写aof文件之后,会将aof重写缓冲区中的内容追加到新的aof文件中,

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190131G05JH700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券