内存型数据库Redis持久化小结

因为Redis是内存型数据库,所以为了防止因为系统崩溃等原因导致数据丢失的问题,Redis提供了两种不同的持久化方法来将数据存储在硬盘里面,一种方法是快照,它可以将存在于某一个时刻的所有数据都写入到硬盘里面,另外一种方法是只追加文件,它会在执行写命令时,将被执行的写命令都写入到硬盘里面。

redis持久化方式有两种,分别是rdb和aof,本文将会详细介绍两种方式的具体实现与详解,并在合适场景使用哪种持久化方式给出明确的选择。

快照持久化

首先,搬运一下官方文档的解释。

Redis可以通过创建快照来获得在内存里面的数据在某一个时间点上的副本。在创建快照之后,用户可以对快照进行备份,可以将快照复制到其它服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器时使用。

图片 1

有两个命令可以用于生成RDB文件,一个是SAVE,另外一个BGSAVE。

翻译:Redis 提供了多种不同级别的持久化方式:

· RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

· AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写,使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

· Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

· 你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

在只使用快照持久化来保存数据时,如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化只适用于那些即使丢失一部分数据也不会造成问题的应用程序。

官方文档明确给出两种方式是以什么形式来保证redis持久化,rdb就是时间点快照,aof是把redis所有写操作的命令进行记录,两种方式各有利弊。

SAVE

Redis通过创建快照来获得存储在内存里面的数据在某个时间节点上的副本。

特点:SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求。

主要是有2中方式,save,bgsave

缺点:服务器持久化期间无法接受其它请求。

图片 2RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数, 前者用于生成 RDB 文件到磁盘, 而后者则用于将 RDB 文件中的数据重新载入到内存中

BGSAVE

rdbSave 函数负责将内存中的数据库数据以 RDB 格式保存到磁盘中, 如果 RDB 文件已存在, 那么新的 RDB 文件将替换已有的 RDB 文件。

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

在保存 RDB 文件期间, 主进程会被阻塞, 直到保存完成为止。

缺点:创建子进程所耗费的时间会随着Redis占用的内存而增加。

SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:

AOF持久化

图片 3save

AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来纪录数据所发生的变化,因此,Redis只要从头到尾重新执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件所记录的数据集。

SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。

在设置同步频率的时候,存在三个选项:

图片 4bgsave

选项

BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求。

同步频率

图片 5可以看到两个命令的区别

always 每个Redis写命令都要同步写入硬盘,但是这样做会占用Redis所拥有的内存,严重降低Redis的速度 everysec 每秒执行一次同步,显式地将多个写命令同步到硬盘 no 让操作系统来决定应该何时进行同步

两种方式区别save的优势是不消耗额外内存,缺点是阻塞客户端命令,客户端执行命令会有时变慢几毫秒。bgsave需要fork消耗额外的内存但是不阻塞客户端命令。

最好使用everysec,既能避免每次都写入所造成的性能影响,又能避免操作系统崩溃所导致的可能丢失不定量数据,其即使系统崩溃,用户最多只会丢失一秒之内产生的数据,当硬盘忙于执行写入操作的时候,Redis还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

图片 6bgsave的保存场景

缺点:因为Redis会不断的将被执行的写命令纪录到AOF文件里面,所以随着Redis不断执行,AOF文件的体积也会不断增长,极端条件下,AOF甚至可能会用完硬盘的所有可用空间。

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

为了解决上面的缺点,Redis提供了BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,使得AOF文件尽可能的小。它的原理和BGSAVE命令相似,Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写,因为AOF文件重写也需要用到子进程,所以同样存在快照持久化因为创建子进程所导致的性能问题和内存占用问题。

Redis 调用 fork() ,同时拥有父进程和子进程。

子进程将数据集写入到一个临时 RDB 文件中。

当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。

本文由皇家赌场手机版发布于首页,转载请注明出处:内存型数据库Redis持久化小结

相关阅读