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

带你彻底理解 Redis 持久化

带你彻底理解 Redis 持久化

一、前言

作为内存数据库,在我们后端开发中应用是非常多的,尤其是在大流量背景下,redis作为缓存数据库就必不可少了。想了解使用场景可以移步至redis使用场景。

作为内存数据库,就会存在一个致命的问题,比如宕机、停电、自然灾害等等导致停止服务,那么内存中的数据就会丢失,对于不重要的数据还好,但是一旦涉及到核心数据,这个是万万不能接受的。为此,也为我们提供了两种持久化方式,和持久化,既然两种持久化方式是同时提供给我们,想必这两种方式是有共存的必要性的。

请大家和我一起认识下这两个大兄弟吧~

二、RDB

RDB概念

是一种快照存储持久化方式,也就是Snapshot快照,就是将某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为,是一个二进制文件,而在服务器启动时,会重新加载文件的数据到内存当中恢复数据。

RDB 持久化开启

持久化方式开启有两种,一种是自动开启,一种是手动开启;

1、手动开启

(1) 命令

命令是一个同步操作,在执行持久化操作的时候,会阻塞进程,其他客户端的命令会被阻塞直到同步完成。

注意:由于命令阻塞进程,如果数据量太大,会造成阻塞,在此期间所有的命令都收不到,所以此命令慎用!

(2)命令

命令是一个异步操作,执行该命令的时候会一个新的子进程,子进程将数据保存到文件之后,子进程才会退出。

注意:执行命令的时候,只有在才会阻塞进程其他客户端;一般进程的操作是很快的。

2、自动开启

自动开启,我们需要先看下的配置,打开配置文件,查看标签如下:

大概做一个简单的简介:

这种通过服务器配置文件触发的方式,与命令类似,达到触发条件时,会forks一个子进程进行数据同步;

RDB 文件生成过程

生成临时文件,并写入数据。

完成数据写入,用临时文代替代正式文件。

删除原来的文件。

三、AOF

以日志的形式记录每一个写操作,将执行过的所有写指令记录下来(读操作不记录),只许追加文件不可以改写文件,启动之后会读取文件来实现重新恢复数据,完成恢复数据的工作。

开启AOF

模式是关闭的,开启需要我们去在配置文件中打开;

这里做一个大概的解释:

写入策略

会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。

上面配置文件中,介绍了三种配置策略:

:每修改同步,每一次发生数据变更都会持久化到磁盘上,性能较差,但数据完整性较好。

: 每秒同步,每秒内记录操作,异步操作,如果一秒内宕机,有数据丢失。

:不会主动调用去将日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次,将缓冲区中的数据写到磁盘上。

重写

随着运行时间的增长,执行的命令越来越多,会导致文件越来越大,当文件过大时,会执行重写机制来压缩文件。

重写触发方式:

1、手动执行 触发重写

2、在文件中配置开启重写,

当符合一定的条件时就会触发重写机制,默认:

重写过程:

从主进程中出子进程,并拿到时的文件数据写到一个临时文件中

在重写过程中,收到的命令会同时写到缓冲区和重写缓冲区中,这样保证重写不丢失重写过程中的命令

重写完成后通知主进程,主进程会将缓冲区中的数据追加到子进程生成的文件中

会原子的将旧文件替换为新文件,并开始将数据写入到新的文件上

数据恢复

当开启时,启动时会优先载入文件来恢复数据;只有当关闭时,才会载入文件恢复数据。

如果出现异常损坏,我们可以使用命令:进行修复;

四、一较高下

前面介绍了和这两种持久化方式,想必他们基本的特性和优缺点都有一定的掌握,我们进行归纳总结下:

RDB

优点:

与方式想比,数据恢复更快

数据进行备份的时候,使用子进程,对性能影响较小

文件比较紧凑,适合做数据备份

缺点:

使用save命令会造成服务器阻塞,直接数据同步完成才能接收后续请求

当服务器宕机的时候,会出现一段时间内数据丢失

当使用数据备份的时候,进程会短暂的阻塞进程,同时出来的进程也会占一部分内存;

AOF

优点:

可以更好的保护数据不丢失,一般会以每隔1秒,如果进程挂掉,最多丢失1秒的数据。

以的模式写入,所以没有任何磁盘寻址的开销,写入性能非常高。

日志文件的命令通过非常可读的方式进行记录,如果操作失误,比如输入,可以再中删除该命令,进行数据恢复;

缺点:(1)对于同一份文件文件比数据快照要大。(2)数据恢复比较慢。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券