Redis的持久化-AOF

Redis的AOF持久化策略是将发送到Redis服务端的每一条命令都记录下来,并且保存到硬盘中的AOF文件中,类似打日志文件,来一条命令就记录一条。

AOF设置

AOF文件的位置和RDB文件的位置相同,都是通过dir参数设置,默认的文件名是appendonly.aof,可以通过appendfilename参数来修改。

AOF测试

当客户端向服务器发送一些redis命令时,Redis会将所执行的命令记录到aof文件中,如下所示:

当redis服务器重启后,会将执行该aof文件,达到数据恢复的目的。

AOF文件重写

为什么要重写?重写可以去除数据的中间执行过程,直接保留最终数据命令。

举个栗子:比如在redis客户端对key执行了一系列命令

set count 1 //初始值为1 incr count // 加1 incr count //加1 decr count //减1

这个时候结果为

get count “2”

如果不进行AOF重写的话,进行AOF文件恢复的时候,Redis会执行AOF文件中的每一条命令,并最终得到 count 为2 。

进行AOF重写后,相当于把中间的计算过程略去。直接把计算得到的结果设置进redis,相当于仅执行了一条命令 set count 2。

可以使用BGREWRITEAOF命令来重写AOF文件。

重写策略

重写策略的参数设置:

auto-aof-rewrite-percentage 100

当前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时,会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据。

auto-aof-rewrite-min-size 64mb

限制了允许重写的最小AOF文件大小,通常在AOF文件很小的时候,即使其中有些冗余的命令也是可以忽略的。

RDB 优点

  • RDB 是一种表示某个即时点的 Redis 数据的紧凑文件。RDB 文件适合用于备份。例如,你可能想要每小时归档最近 24 小时的 RDB 文件,每天保存近 30 天的 RDB 快照。这允许你很容易的恢复不同版本的数据集以容灾。
  • RDB 非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心,或者是 Amazon S3(可能得加密)。
  • RDB 最大化了 Redis 的性能,因为 Redis 父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘 IO 这样的操作。
  • RDB 在重启保存了大数据集的实例时比 AOF 要快。

RDB 缺点

  • 当你需要在 Redis 停止工作(例如停电)时最小化数据丢失,RDB 可能不太好。你可以配置不同的保存点。然而,你通常每隔 5 分钟或更久创建一个 RDB 快照,所以一旦 Redis 因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
  • RDB 需要经常调用 fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且 CPU 性能不够强大的话,Redis 会停止服务客户端几毫秒甚至一秒。AOF 也需要 fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。

AOF 优点

  • 使用 AOF Redis 会更具有可持久性(durable):你可以有很多不同的 fsync 策略:没有 fsync,每秒 fsync,每次请求时 fsync。使用默认的每秒 fsync 策略,写性能也仍然很不错(fsync 是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。
  • AOF 日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof 工具也可以很轻易的修复。
  • AOF 文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个 AOF 文件。例如,即使你不小心错误地使用 FLUSHALL 命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启 Redis 就可以。

AOF 缺点

  • 对同样的数据集,AOF 文件通常要大于等价的 RDB 文件。
  • AOF 可能比 RDB 慢,这取决于准确的 fsync 策略。通常 fsync 设置为每秒一次的话性能仍然很高,如果关闭 fsync,即使在很高的负载下也和 RDB 一样的快。不过,即使在很大的写负载情况下,RDB 还是能提供能好的最大延迟保证。

RDB和AOF如何取舍

通常来说,你应该同时使用这两种持久化方法,以达到和 PostgreSQL 提供的一样的数据安全程度。

如果你很关注你的数据,但是仍然可以接受灾难时有几分钟的数据丢失,你可以只单独使用 RDB。

有很多用户单独使用 AOF,但是我们并不鼓励这样,因为时常进行 RDB 快照非常方便于数据库备份,启动速度也较之快,还避免了 AOF 引擎的 bug。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏kwcode

使用Cache缓存

存放位置:服务器内存,用于频繁访问且不轻易更改的内容缓存。 string CacheKey = "CT1"; //检索指定项, object objModel ...

3086
来自专栏晓晨的专栏

.NET Core 控制台应用程序使用异步(Async)Main方法

可以看到报错了,提示我们是C# 7.1 的特性。我们有两种方法可以解决,其实最后都是殊途同归,只是操作不一样而已。

1842
来自专栏会跳舞的机器人

Redis持久化

Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式. 你也可以同...

2892
来自专栏跟着阿笨一起玩NET

ASP.NET cache缓存的用法

本文导读:在.NET运用中经常用到缓存(Cache)对象。有HttpContext.Current.Cache以及HttpRuntime.Cache,HttpR...

932
来自专栏崔庆才的专栏

妈妈再也不用担心爬虫被封号了!手把手教你搭建Cookies池

6134
来自专栏fixzd

redis系列:RDB持久化与AOF持久化

Redis的数据都是存储在内存中的,所以Redis持久化也就是要把Redis存储在内存中的数据保存到硬盘。

781
来自专栏FreeBuf

简析60度CMS的Cookies欺骗漏洞

前言 本篇文章只是为了和大家分享漏洞的挖掘经验和思路,同时让大家认识到 Cookies 欺骗漏洞的危害和严重性。 漏洞发现时间:2017.8.16,因产商无回应...

2778
来自专栏Eternally运维

Redis持久化

采用RDB持久化方式,redis会定期把数据快照保存到一个rdb文件中,并在启动时加载rdb文件,恢复之前保存的数据,可以在配置文件中设置保存数据的时间:

2268
来自专栏码农阿宇

ASP.NET CORE入门之读取Json配置文件

首先新建一.net core控制台项目,命名为jsonReader ? 然后选中引用,选择NuGet包管理器,点击浏览引入mircosoft.aspnetcor...

3138
来自专栏跟着阿笨一起玩NET

关于WinForm/Web如何使用缓存Cach

相对到期也称滑动到期:设置相对过期时间 指定时间内无访问会失效。(类似Session机制)

1601

扫码关注云+社区

领取腾讯云代金券