Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB持久化 RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 手动触发数据持久化
手动触发分别对应save和bgsave:
示例如下:
127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379>
# 持久化的数据存放目录及文件名取决于配置文件中以下几个配置:
dbfilename dump.rdb # 定义数据持久化的文件名
dir /usr/local/redis/data # 定义数据持久化的文件存放目录
[root@redis data]# ll /usr/local/redis/data # 以下就是dump.rdb文件存放目录
总用量 28
-rw-r--r-- 1 root root 725 3月 9 14:15 dump.rdb
在每次redis启动时,都会去指定目录下寻找dump.rdb文件并读取它,把其中的数据读取到redis中,这是它可以做到数据持久化的根本原因。 自动触发数据持久化
四种自动触发的情况:
配置文件中与RDB相关的配置如下:
#以下三行是数据持久化的策略,若要停止数据持久化,只需将其都注释掉即可。
# 以下同步策略可以自行根据线上情况更改
save 900 1 # 每900秒(15分钟)如果有1个key发生变化,则保存
save 300 10 # 每300秒(5分钟)如果有10个key发生变化,则保存
save 60 10000 # 每60秒(1分钟)如果有10000个key发生变化,则保存
dbfilename dump.rdb # 保存的文件名
dir /usr/local/redis/data # 文件的存放路径
下面的默认值为yes,当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这可以让我们意识到数据没有正确持久化到磁盘上,否则我们不会注意到灾难的发生了。如果redis重启了,那么有可以重新开始接受数据了。
stop-writes-on-bgsave-error yes
# 该值为yes的话,在redis持久化数据到磁盘时如果出现失败,redis会停止接受所有的写请求。
下面的选项默认值为yes,表示对于存储到磁盘中的快照数据,是否进行压缩存储。
rdbcompression yes
下面的选项默认值为yes,表示在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样会增加大约10%的性能消耗,如果希望可以获取到最大的性能提升,可以关闭该功能。
rdbchecksum yes
AOF数据持久化 相关参数如下:
appendonly no # 默认关闭aof持久化方式,将其设置为yes可以开启aof持久化
默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendfilename "appendonly.aof" # aof文件名
# appendfsync always
appendfsync everysec
# appendfsync no
上面三行是aof方式的持久化策略:
auto-aof-rewrite-percentage 100
aof自动重写配置,当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候,Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-min-size 64mb
设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写,默认这个值为64M,生产中根据实际情况,可能会指定为几个G。