为解决Redis数据丢失问题,实现数据持久化,可以使用两种机制来实现数据持久化;也就是RDB(Redis DataBase)和AOF(Append Only File),下面我们就来分别简单介绍一下这两种持久化机制的开启方法。
无论使用哪种持久化类型,都需要固定Redis工作目录
[root@localhost redis-4.0.1]# pwd
/root/redis-4.0.1
[root@localhost redis-4.0.1]# vim redis.conf #编辑Redis配置文件
...
dir ./ #Redis工作目录;如果是相对路径,RDB转储文件和AOF文件将保存在此目录,用于下次启动Redis服务器时寻找该目录下的转储文件;建议设置为绝对路径
一:RDB持久化
打开RDB持久化功能:
[root@localhost redis-4.0.1]# pwd
/root/redis-4.0.1
[root@localhost redis-4.0.1]# vim redis.conf #编辑Redis配置文件
...
dbfilename dump.rdb #在此处配置RDB转储文件名,默认是dump.rdb
RDB其实就是把数据以快照的形式保存在磁盘上;Redis提供了三种触发方式,save、bgsave、自动化。Redis服务器每次启动时,将自动加载dump.rdb文件到内存数据库中,实现数据的持久化
save:该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止;另外,执行shutdown关闭Redis命令时,系统也会调用save完成快照文件的转储工作后再关闭Redis服务器
[root@localhost redis-4.0.1]# ./src/redis-cli save #手动执行save命令,会阻塞服务器,直到保存完成提示“OK”
37337:M 14 Mar 14:17:55.514 * DB saved on disk
OK
[root@localhost redis-4.0.1]# ls -lih | grep dump.rdb
36360655 -rw-r--r-- 1 root root 157 3月 14 14:17 dump.rdb #RDB转储文件保存成功
bgsave:执行该命令时,Redis会在后台异步进行快照操作,转储快照同时还可以响应客户端请求;Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束
但bgsave有个缺点,执行bgsave命令,服务器只提示“Background saving started”开始保存,但是不会提示什么时候保存完成,如果判断时候保存完成,需要查看Redis日志(如果配置并开启了服务器日志的话;否则就需要根据数据量大小来判断是否保存完成)
[root@localhost redis-4.0.1]# ./src/redis-cli bgsave #手动执行bgsave命令,系统开始异步转储RDB文件
Background saving started
[root@localhost redis-4.0.1]# #可以发现bgsave命令不会阻塞操作
[root@localhost redis-4.0.1]# ls -lih | grep dump.rdb
36360655 -rw-r--r-- 1 root root 157 3月 14 14:17 dump.rdb #RDB转储文件保存成功
自动触发:自动触发是由配置文件决定的,自动触发条件可以在redis.conf进行配置
[root@localhost redis-4.0.1]# pwd
/root/redis-4.0.1
[root@localhost redis-4.0.1]# vim redis.conf #编辑Redis配置文件
...
save 900 1 #表示900 秒内如果至少有 1 个 key 的值变化,则进行数据转储
save 300 10 #表示300 秒内如果至少有 10 个 key 的值变化,则进行数据转储
save 60 10000 #表示60 秒内如果至少有 10000 个 key 的值变化,则进行数据转储
stop-writes-on-bgsave-error yes #转储失败后是否允许Redis服务器继续接受数据,设置为no时将阻止Redis继续接收数据;所以为了配合自动转储,需要设置为yes
rdbcompression yes #对于存储到磁盘中的快照,可以设置是否进行压缩存储;设置为yes可以减少转储文件占用磁盘的空间
rdbchecksum yes #在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗。
二:AOF持久化
全量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录
Redis服务器每次启动时,将自动读取aof文件恢复数据,思想数据的持久化
打开AOF持久化功能:
[root@localhost redis-4.0.1]# pwd
/root/redis-4.0.1
[root@localhost redis-4.0.1]# vim redis.conf #编辑Redis配置文件
...
appendonly yes #开启AOF持久化
appendfilename "appendonly.aof" #配置AOF持久化文件名
appendfsync everysec #配置AOF持久化策略
#always 表示只要缓冲区中数据发生更改,则就将该数据写入到aof文件中
#everysec 每秒写入把缓冲区中数据写入aof文件中(redis默认)
#no 不做任何策略配置,将策略的配置交给操作系统,一般操作系统是等待缓冲区被占完之后,将数据写入aof文件中
[root@localhost redis-4.0.1]# pwd
/opt/pigmstoc/toc/database/Redis/redis-4.0.1
[root@localhost redis-4.0.1]# ls -lih | grep appendonly.aof
68934080 -rw-r--r-- 1 root root 0 3月 14 14:39 appendonly.aof
测试AOF持久化功能:
我们可以通过一些简单的操作,来测试AOF文件是否记录了我们对数据库的操作
[root@localhost redis-4.0.1]# ./src/redis-cli SET testkey redis #测试插入一个键
OK
[root@localhost redis-4.0.1]# cat appendonly.aof #插入键的操作被成功记录到AOF文件
*2
$6
SELECT
$1
0
*3
$3
SET
$7
testkey
$5
redis