redis是内存型的数据库,数据全在内存中,当关机或者断电,内存中的数据就会被清除。
redis的持久化就是将内存中的数据写到一个磁盘文件中以进行数据的备份和还原到内存中的过程。redis的两大持久化方式
RDB(Redis DataBase)和 AOF(Append Only File)。
一、RDB(Redis DataBase)->默认方式
简单来说,就是围绕一个xxx.rdb文件(一个压缩后的二进制文件)的数据备份与还原,根据配置的save策略,在一段时间内如果写的次数满足了save的策略,就会触发.rdb文件的数据备份。默认是在redis服务启动的位置的一个dump.rdb文件。
根据redis.conf 文件中的默认配置
logfile ""
dbfilename dump.rdb
dir ./
默认是在redis服务启动的位置生成dump.rdb文件,默认没有日志文件。
这样在redis关机重启时,会默认从redis服务启动位置读取dump.rdb文件,并将数据还原到内存中。( 所以每次启动redis服务时都要和上一次启动的位置一样,才能读取到当前路径下的dump.rdb文件,或者将上一次生成的dump.rdb文件放到当前目录下在启动redis服务才能将数据还原到内存,很麻烦。)
解决:
logfile "/opt/javaTools/myRedis/redis.log" #redis日志文件保存位置
dbfilename dump.rdb #rdb文件名
dir /opt/javaTools/myRedis/ #指定redis的工作空间位置,这样每次生成文件和还原数据时都会在该目录进行生成和还原。
注意:指定具体工作空间后,还要指定日志文件的位置,否则 shutdown (关闭redis服务)指令将无法使用。
1、如何触发RDB快照?
1)根据配置文件里的save配置 save seconds changes seconds 秒内有changes个k-v改变就会自动触发持久化
2)手动输入save或bgsave命令立即触发RDB快照
3)shutdown命令(关闭redis服务),或是系统宕机时,会立即更新dump.rdb的保存时间,但依旧会遵循save point 的保存频率
4)通过flushall命令(清空redis所有数据库),但是先清空在保存,得到的是一个没有数据的文件。
2、如何触发数据恢复?
将备份文件放到redis.conf中dir 和dbfilename 配置的路径下,当启动时自动读取恢复数据。
3、如何禁用RDB持久化?
1)redis.conf中的所有save指令注释掉 或者 设置值为空字符串。
2)redis-cli 中执行 config set save "" 但config指令设置的配置文件属性,当Redis服务重启后就会恢复到默认的状态。
二、AOF(Append Only File)
简单来说,AOF就是围绕一个appendonly.aof 文件来进行数据的备份与还原。根据配置的Append Only Mode,对所有写的操作的指令,按照redis保存协议的格式,存储到appendonly.aof文件中,当数据恢复时会读取该文件并将所有的指令执行一遍,已完成数据恢复到内存。在dir目录下生成appendonly.aof文件。
1、开启aof持久化
redis.conf -》 appendonly yes PS:使用config set appendonly yes指令是临时的,当redis服务重启后该配置将失效。
2、恢复与修复
1、恢复
和RDB一样,redis服务启动时会自动的到dir目录下找配置的文件名的.aof文件,并将全部指令重新执行一遍。
2、修复
当appendonly.aof文件被写坏了时(里面的内容不符合redis协议的语法),导致redis服务无法启动。解决:通过redis自带的修复工具 redis-check-aof --fix appendonly.aof 修复该文件,然后重启redis服务即可。
3、AOF文件重写
aof把所有写的操作全部保存到.aof文件中是为了数据的恢复,但有些写的操作在数据恢复时只需要保留最后的结果即可,如一个变量连续 incr 100次,aof文件会保留所有的写记录,这样就会造成aof文件迅速变大,超过设定的文件大小值。但该数据的恢复,只需要一个set 指令即可完成,所以从redis2.4开始,当aof文件满足重写条件时,redis会自动的fork出一条线程来完成aof文件的重写,重写的结果是能完全恢复原来数据的最少指令集,文件大小小于原来的。如:一百个incr num 变成 set num 100
触发条件:
1、手动触发:执行bgrewriteaof命令
2、自动触发:根据redis.conf中的配置auto-aof-rewrite-min-size(触发aof重写的最小aof文件大小,默认64MB)和auto-aof-rewrite-percentage(当前AOF文件大小是上次rewrite后文件大小的百分之多少且文件大于64M时触发,一般这个64M会调整成很大,如3G) 配置参数确定自动触发时机。
三、总结:
1、RDB生成的数据文件体积较小,数据恢复速度较快;但无法做到实时持久化,可能会损失一部分数据。
2、AOF速度较慢,但能做到实时持久化,保障了数据的安全
若同时开启RDB和AOF来进行持久化,redis服务启动时会优先加载AOF文件,AOF文件加载失败后才会加载RDB文件。
3、若只是让redis做缓存,可以不使用持久化策略。
下一篇:6、redis的事务和Lua脚本