RDB持久化(redis database)

redis将当前时刻内存中所有的数据以快照方式写入一个默认为(dump.rdb)的二进制文件中。默认路径为当前redis的安装目录。当redis启动时,会自动加载这个文件进行数据的恢复。

触发方式

当redis进行RDB备份时,有两种触发方式

1,自动触发

我们在配置文件(redis.conf)中配置save这几项。

save 900 1       900秒内有一条数据被修改进行RDB
save 300 10      300秒内有10条数据被修改进行RDB
save 60 10000    60秒内有10000条被修改进行RDB
save ""          不进行RDB持久化

2,手动出发

client端显式调用save或者bgsave命令redis进行RDB操作。

save操作是在主进程中进行RDB快照备份,他会阻塞我们的主进程进来的所有请求。当数据量较大时这会导致我们的应用程序的业务中断,所以不推荐使用save进行RDB持久化。

bgsave是redis主进程fork创建了一个子进程进行RDB操作。所以即使阻塞也只会阻塞创建子进程的这段时间。性能损失更小。

优缺点

RDB优点

1,文件占用空间小,因为redis默认会将我们的RDB文件进行LZF进行压缩。

2,恢复速度比AOF快。

RDB缺点

1,不能进行实时的持久化操作(无法秒级持久化)。因为每次持久化要创建一个子进程,这属于重量级操作,频繁使用会严重影响性能。所以也会导致两次间隔较长时间之间的数据丢失。

2,redis各个版本间的二进制文件格式可能不一致导致无法各个版本兼容。

 

 

AOF持久化(append  only  file)

redis将写操作写入一个appendonly.aof的文件中。

当我们启动redis时,他会将这个文件中记录的写命令重新执一次,迅速还原内存中的数据。

AOF操作有两个函数操作,一个是write函数一个fsync函数操作。

write函数会将写命令写入一个内存缓冲区,我们如果向将其真想写入文件还需要调用fsync函数。

这时候写入命令才真正的被写入AOF文件。

开启方式

配置文件:

我们在配置文件(redis.conf)中,打开appendonly

appendonly yes

然后我们在找到# appendfsync配置

appendfsync always    每条写命令都进行一次AOF写入
appendfsync everysec  每一秒进行一次写入
appendfsync no        由系统自己决定何时进行AOF写入默认30S一次

我们一般使用everysec。每个写命令进行一次写入会大大影响我们的redis性能。

 

AOF重写机制:

AOF会将我们对同一个key的多次操作只保留最终一个结果。以此来减少AOF文件的体积。

触发方式:

1,自动触发重写

配置文件:

auto-aof-rewrite-percentage 100    超过上一次aof重写aof文件大小的百分之多少,会再次优化,如果没有重写过,则以启动时为主
auto-aof-rewrite-min-size 64mb    限制了允许重写的最小aof文件大小

2,手动触发重写

命令redis进行重写指令

bgrewriteaof

当使用手动触发AOF重写时,会fork一个子进程,重建数据库状态,当完成后,会将这段时间内的新数据追加到子进程中进行AOF重写,当重写结束后会自动替换原有的AOF文件。

 

 

优缺点

AOF优点

我们可以配置appendfsync为everysec,将持久化操作限制到秒级。提高了整个数据库数据的完整性。如果有人误删了整个redis全部数据,flushdb或者flushall了,那么只要AOF没有被重写。我们只要找到AOF文件删除最后的清空操作,重启redis还是可以恢复数据的。

AOF缺点

1,因为是追加操作,所以redis的AOF文件会越来越大。虽然redis有重写AOF机制,只保留最小指令集的功能。他会将同一个key的多次修改只保留最终结果。但是还是会越来越大。

2,AOF因为是将写入命令重新再写一遍,所以AOF的恢复效率相对于RDB较低。

 

 

 

RDB和AOF同时使用

对于持久化redis建议我们两个持久化方式共同使用,但如果两个持久化方式都开启,我查到的资料中显示redis会率先加载AOF的进行数据恢复。