Redis初识 持久化数据

LuckQI

在这里你可以得到不只是技术,关注即可习得新技能

Redis我们都知道Redis的内容是放在内存当中的,如果我们的安装Redis的服务器宕机了,那么我们在内存保存的内容也就丢失了。在Redis当中给提供了不同级别的持久化的方式来进行数据的保存:

RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。

AOF持久化方式记录每次对服务器写的操作。当服务器重启的时候会重启执行这些命令来恢复原始的数据,AOF命令以redis协议追加每次写的操作到文件的末尾,Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。

也可以不运行持久化的方式。只是保证服务器存在的情况下运行。

两种持久化的方式都可以共同存在,在这种情况下,Redis重启的时候会优先载入AOF的文件来恢复原始的数据,通常情况下AOF的文件保存的数据要比RDB的方式保存的数据集要完整。

RDB的优点与缺点

----------------------------------------------

1. 优点

RDB是一个非常紧凑的文件,保存某个时间点的数据集,然后根据指定的时间间隔进行存储。

RDB是一个紧凑的单一文件,很方便的传导远端数据中心,适合用于灾难恢复。

RDB在保存文件时,父进程唯一需要的是fork出一个子进程,接下来的工作全部由子进程来完成。所以RDB的持久化方式可以最大化redis的性能。

与AOF相比,恢复大的数据集的时候RDB的方式会更快一些。

2. 缺点

Redis 如果发生宕机的时候,我们的RDB快照还没有进行数据备份,那么容易把在定时前存储的内容全部丢失。

RDB需要fork自己成来保存数据到硬盘中,当当数据级比较大的时候fork进程就比较耗时,会导致Redis在毫秒级内不能响应客户端的请求。AOF也需要fork但是可以调节重写日志的频率来提高数据的耐久度。

AOF优点和缺点

1. 优点

使用AOF会让你的Redis更加耐久。并且我们可以使用不同的策略fsync。每秒,每次写的时候策略。Redis的性能还是依然很好。一旦出现故障丢失的就是一秒的数据而已。

AOF文件是一个只进行追加的日志文件,所以不需要写入seek,及时由于某些原因导致未执行完整的执行命令,我们也可以使用redis-check-aof 工具来修复 这些问题。

Redis 可以使在AOF文件变得过大的时候,会自动的在后台对AOF进行重写,重写后的新的AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是就对安全的。即使在重写的时候,服务器发生了宕机,现有的AOF文件也不丢失。一旦新文件创建完成。Redis就会切换到新文件中并开始对新的AOF文件进行追加操作。

AOF文件有序的保存了对数据库执行的所有写入操作。这些写入操作以Redis协议的格式保存。因此AOF文件也可以被人容易读懂,对文件进行分析也是很轻松。

2.缺点

AOF的体积要是RDB文件的体积大。

根据需要的fsync策略 AOF的速度可能会慢于RDB。一般情况下fsync的性能依然非常高,而关闭fsync 可以让AOF的速度和RDB一样快。即使在巨大的写入负载时,RDB可以提供更有保证的最大延迟时间。

3.选择合适的快照

如果我们能接受几分钟的数据丢失,那么RDB持久化的方式是挺合适的。

AOF的方式能帮助我们快速的保存数据。

快照

1. RDB快照保存

默认情况下,Redis 将数据库快照片保存在dump.rdb的二进制文件中,我们在Redis进行设置。 save 60 1000 满足条件就是 60秒内至少有1000 个键被改动。 这种方式被称为 快照snapshotting.

工作方式

上面所说保存 保存到我二进制文件中,服务器需要执行以下的操作才可以实现。

Redis调用forks ,同时拥有父进程和子进程。

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

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

这种方式帮助Redis 可以从 写时复制机制中获益。

2. 追加方式的AOF

AOF的快照方式是在文件后面直接追加命令。 我们只需要在配置文件中打开 appendonly yes .但是随着时间的推移,AOF文件会越来越大,那么AOF文件就可以开始进行重建,执行BGREWRUTEAOF命令。 Redis 将会生成一个新的AOF文件。

如果文件有所损坏,我们也可以使用命令来进行恢复redis-check-aof –fix

工作方式

两者都利用了写是复制的机制。

Redis开始执行fork();同事拥有父进程和子进程。

子进程开始将新的AOF文件内容写入到临时文件中。

对于所写的父进程是两边操作,一边写入到内存换从中,一边将这些数据追加到AOF文件中。

子进程完成工作后给父进程发送一个信号,父进程接收到信号后,内存数据追加到新的AOF文件中。

最后新文件替换旧文件。然后命令追加到新文件中。

持久化的目的就是我们防止服务器出现问题的时候,数据不会出现问题,但是我们也需要为这些快照也进行备份,防止数据丢失。

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

扫码关注云+社区

领取腾讯云代金券