Redis持久化(rdb、aof、混合)

允我心安 提交于 2020-02-26 02:27:51

前言

Redis是基于内存操作的单线程缓存中间件。

一 RDB快照(snapshot)

在默认情况下,Redis将内存数据库快照保存在dump.rdb二进制文件中,

Redis服务重新启动时根据dump.rdb文件重写Redis内存。

dump.rdb文件默认在redis安装目录下面。

可以在redis.conf中对redis快照频率进行设置。

1、save设置语法

save <seconds> <changes>

语法含义:

N秒内至少有M个变动,则自动保存一次数据快照。

比如,save 10 1,即10秒内,发生至少一次变动,则自动保存一次数据快照。

2、redis.conf修改配置

配置修改后要记得重启redis服务,让配置生效。

3、实例验证

把dump.rdb文件删掉,redis-cli连接客户端,然后进行简单set操作。

然后在redis安装目录可以看到新生成的dump.rdb文件。

dump.rdb文件内容为二进制。

如果我们再把dump.rdb文件清掉,杀掉redis进程,重新启动redis,我们会发现刚才set的key1在redis里面

没有了,因为dump.rdb被清掉了,redis重启时就恢复不了数据,所以redis重启后找不到key1。

反之,则能找到key1。

二 AOF(append only file)

rdb快照是达到条件之后进行dump.rdb备份,如果Redis因为某些原因造成故障停机,服务将会丢失最近

写入且仍未保存到快照中的那些数据。Redis针对这种丢失,从1.1版本开始增加了aof持久化方式。

1、aof持久化

aof持久化方式是将redis操作的每一条写数据指令(比如set)记录到appendonly.aof(默认文件名)文件中,

当服务重启的时候,将appendonly.aof中的指令逐条执行恢复数据到redis内存。

2、aof配置

redis.conf中将appendonly no,修改为appendonly yes,

也可以修改文件名,一般建议不用修改文件名,然后重启redis服务。

服务重启后,可以看到appendonly.aof文件。

3、实例验证

redis-cli连接客户端,然后进行简单set操作。

查看appendonly.aof文件,可以看到操作的命令存到aof文件中。

然后在进行一个简单的get操作。

再次查看appendonfly.aof文件,get命令并没有存入appendonly.aof中,

证明了redis的aof持久化存储的只是redis的写操作命令,不会存读操作命令。

我们可以通过重启服务来验证是否恢复Redis内存,如果担心dump.rdb文件影响,

先删掉dump.rdb文件再重启。

4、aof高级配置

可以配置Redis多久才将数据fsync到磁盘一次。

1)每次有新命令追加到AOF文件时就执行一次fsync:非常慢,但是非常安全,数据一般不会丢。

2)每秒fsync一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失1秒钟的数据。

3)从不fsync :将数据交给操作系统来处理。更快,也更不安全的选择。

推荐(并且也是默认)的措施为每秒fsync一次, 这种fsync策略可以兼顾速度和安全性。

三 RDB和AOF优缺点

rdb持久化:故障数据丢失比aof严重,但是服务重启恢复数据快;

aof持久化:故障数据丢失较rdb少,但是服务启动时恢复数据慢,因为要把aof文件中指令执行一遍。

使用rdb还是aof持久化,在于你的业务场景对数据丢失承受能力和服务启动时数据恢复快慢来决定。

但是,普通要求下,建议使用rdb快照备份。

四 混合持久化

重启Redis时,我们很少使用rdb来恢复内存状态,因为会丢失大量数据。我们通常使用AOF日志重写,

但是AOF重写性能相对rdb来说要慢很多,这样在Redis实例很大的情况下,启动需要花费很长的时间。 

Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。

1、混合持久化

AOF在进行文件重写(aof文件里可能有太多没用指令,所以aof会定期根据内存的最新数据生成aof文件)

时将重写这一刻之前的内存rdb快照文件的内容和增量的AOF修改内存数据的命令日志文件存在一起,

都写入新的aof文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,

原子的覆盖原有的AOF文件,完成新旧两个AOF文件的替换。

混合持久化文件结构:

2、混合持久化配置

开启混合持久化:

aof-use-rdb-preamble yes   

重启Redis服务。

3、bgrewriteaof重写AOF

AOF根据配置规则在后台自动重写aof文件,也可以人为执行命令bgrewriteaof重写AOF。 于是在Redis重启的时候,

可以先加载rdb的内容,然后再执行aof指令部分达到Redis数据重放的目的,重启效率因此大幅得到提升。

4、实例验证

通过bgrewriteaof手动重写aof。
 

查看appendonly.aof文件内容,看到rdb格式的二进制文件。

 

再执行一条set命令。

然后再看appendonly.aof文件内容。

从文件格式可以看到,混合持久化appendonly.aof文件由rdb格式和aof指令格式两大部分组成。

Redis在重启时,先重写rdb到内存,然后在重写aof到内存,重启效率高,还能减少数据的丢失。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!