Redis持久化

概述

大家都知道,Redis是内存数据库,它会把数据都储存在内存当中,可以大幅提高读取速度,但这也出现一个问题,数据易丢失。所以,将内存中的数据持久化处理是很有必要的。Redis共提供了两种持久化的方式,RDB全量写入方式和AOF增量写入方式。

RDB全量写入方式

RDB就是将整个redis中的内容dump下来,做一个快照。RDB是redis默认的持久化方式。

相关配置

1
2
3
4
5
6
save 900 1
save 300 10
save 60 10000
rdbchecksum yes #是否校验rdb文件
dbfilename "redis-6379.rdb" #持久化文件名称
dir "/data/dbs/redis/6379" #持久化数据文件存放的路径

前三行是触发RDB的条件,意思是当900秒中redis有一条数据写入就会进行RDB操作,二三行同上。

相关命令

save

save是以阻塞的方式将redis的数据写入rdb文件,是redis主进程进行此项操作,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。

bgsave

执行bgsave操作时,redis主进程会先fork一个子进程,由子进程将数据写入rdb文件。这种方式耗费的资源比save要多。

AOF增量写入方式

AOF类似于日志,会将对redis的所有操作写入aof文件中,方便数据的恢复。

相关配置

1
2
3
4
5
6
dir "/data/dbs/redis/6379" #AOF文件存放目录
appendonly yes #开启AOF持久化,默认关闭
appendfilename "redis-6379.aof" #AOF文件名称
appendfsync no #AOF持久化策略
auto-aof-rewrite-percentage 100 #触发AOF文件重写的条件,增量百分比
auto-aof-rewrite-min-size 64mb #触发AOF文件重写的条件,文件大小

三种触发持久化的策略

第四行是AOF持久化的策略,AOF共有三种持久化策略,分别为always、everysec 、no。

  • always策略是每提交一个修改命令都调用fsync刷新到AOF文件
  • everysec策略是每秒钟都调用fsync将一秒内的修改刷新至AOF文件,但可能会丢失一秒以内的数据
  • noc策略是依靠OS进行刷新,redis不主动刷新AOF

AOF文件重写

我们知道,AOF持久化会记录redis的每一条修改指令,所以AOF文件会变得非常非常的大。因此redis实现了AOF文件重写的方法,就是会合并对相同key的操作。例如:key的值为1, INCR key操作进行了5次,AOF重写后变为SET key 6。查了相关的资料,发现这个“重写”的说法是有歧义的。AOF重写并不是对原有AOF文件进行任何写入和读取,而是根据目前的结果来用相应的语句实现。讲了这么多,redis配置文件中有关重写的配置有auto-aof-rewrite-percentage和auto-aof-rewrite-min-size。第一个的意思是达到文件增量的百分比时触发重写,默认为100%;第二个是文件大小达到指定大小触发重写,默认为64mb。

两种持久化方式的比较

RDB AOF
恢复优先级
文件体积
恢复速度
数据安全性 易丢数据 根据策略决定
轻重