redis提供两种不同的持久化方法来将数据存储到硬盘里面。一种方法叫快照(RDB),它可以将存在于某一时刻的所有数据都写入硬盘里面;另一种方法叫只追加文件(AOF),它会在执行写命令时,将被执行的写命令复制到硬盘里面。
一、RDB持久化
redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。在创建快照之后,用户可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本,还可以将快照留在原地以便重启服务器时使用。(类似于关系数据库将数据库导出成xxx.sql文件相似)
1.创建RDB的三种方式:
(1)通过save创建RDB文件,save命令是一个同步命令,当执行save命令时,后面的命令需要等待。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set php 1
OK
127.0.0.1:6379> set java 2
OK
127.0.0.1:6379> dbsize
(integer) 7
127.0.0.1:6379> save
OK
可以看到生成的rdb文件。
(2)通过bgsave创建RDB文件,bgsave是一个异步的命令,redis会调用fork来创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。
bgsave的流程图如下所示:
(3)通过配置文件来自动生成RDB文件,比如save 60 10000,那么从redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,redis就会自动触发bgsave命令。如果设置多个save选项,只要其中一条满足,redis就会触发一次bgsave命令。
在redis的配置文件redis.conf加入如下配置:
save 900 1
save 300 10
save 60 3
当上诉三个条件任意一个满足时,执行bgsave命令,生成RDB文件。
二、AOF持久化
AOF持久化会将被执行的写命令写到AOF文件的末尾,以此来记录数据发生的变化。因此redis只要从头到尾执行一次AOF文件包含的所有写命令,就可以恢复AOF文件所记录的数据集。
AOF的三种配置参数:
选项 | 同步频率 |
always | 每个redis写命令都要同步写入硬盘。这样做会严重降低redis的速度 |
everysec | 每秒执行一次同步,显示地将多个写命令同步到硬盘 |
no | 让操作系统来决定应该何时进行同步 |
在配置文件中我们选择everysec选项:
appendonly yes//开启aof
appendfsync everysec
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set hello redis
OK
127.0.0.1:6379> set a v
OK
127.0.0.1:6379> set b c
OK
127.0.0.1:6379> set h a
OK
这个时候我们就可以看到生成的AOF文件:
三、RDB和AOF对比
命令 | RDB | AOF |
启动优先级 | 低 | 高(当redis重启时,优先执行AOF操作) |
文件体积 | 小 | 大(AOF文件的体积大小。因为redis会不断的将被执行的写命令记录到AOF文件中,随着redis不断运行,AOF文件的体积不断增长,在极端的情况下,体积不断增大的AOF文件甚至可能会用完硬盘的所有可用空间) |
恢复速度 | 快 | 慢 |
数据安全性 | 丢数据 | 根据策略决定 |
操作轻重 | 重 | 轻 |
可以使用bgrewriteaof命令,来解决aof文件过大的问题,这个命令会通过移除AOF文件中的冗余命令来重写AOF文件,使AOF文件的体积变得尽可能的小。