一、概念
Redis的读写都是在内存中,所以它的性能较高。但内存中的数据会随着服务器的重启而丢失,为了保证数据不丢失,因此需要将内存中的数据存储到磁盘,以便Redis重启时能够从磁盘中恢复原有数据,Redis内存数据保存到磁盘的这个过程就叫做Redis持久化。
二、持久化的方式
1、快照方式(RDB)
RDB,Redis DataBase,将某一个时刻的内存数据,以二进制的方式写入磁盘。
2、文件追加方式(AOF)
AOF,Append Only File,记录所有的操作命令,并以文本的形式追加到文件中。
3、混合持久化方式
Redis 4.0 之后新增的方式,混合持久化是结合了RDB 和AOF的优点,在写入的时候,先把当前的数据以RDB的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证Redis重启时的速度,又能减低数据丢失的风险。
三、RDB
1、触发方式
RDB的持久化触发方式有两类:
(1)手动触发
手动触发持久化的操作有两个:save和bgsave,它们主要区别体现在:是否阻塞Redis主线程的执行。
save命令:
在客户端中执行 save 命令,就会触发Redis的持久化,但同时也是使 Redis 处于阻塞状态,直到 RDB 持久化完成,才会响应其他客户端发来的命令,所以在生产环境一定要慎用。
bgsave命令:
bgsave(background save)即后台保存的意思,它和 save命令最大的区别是:bgsave会fork()一个子进程来执行持久化,整个过程中只有在fork()子进程时有短暂的阻塞,当子进程被创建之后,Redis的主进程就可以响应其他客户端的请求了。
相对于整个流程都阻塞的save命令来说,bgsave命令更适合使用。
(2)自动触发
1)save m n
是指在m秒内,如果有n个键发生改变,则自动触发持久化。 参数m和n可以在Redis的配置文件中找到,例如,save 60 1 表明在60秒内,至少有一个键发生改变,就会触发RDB持久化。 自动触发持久化,本质是Redis通过判断,如果满足设置的触发条件,自动执行一次 bgsave命令。
注意:当设置多个save m n命令时,满足任意一个条件都会触发持久化。
2)flushall
用于清空Redis数据库,在生产环境下一定慎用,当Redis执行了flushall命令后,会触发自动持久化,把RDB文件清空。
3)主从同步触发
在Redis主从复制中,当从节点执行全量复制操作时,主节点会执行bgsave命令,并将RDB文件发送给从节点,该过程会自动触发Redis持久化。
2、数据恢复
当Redis服务器启动时,如果Redis根目录存在RDB文件dump.rdb,Redis就会自动加载RDB文件恢复持久化数据。
3、RDB的优缺点
(1)优点
RDB的内容为二进制的数据,占用内存更小,更紧凑,更适合做为备份文件;
RDB对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行Redis服务恢复;
RDB可以更大程度的提高Redis的运行速度,因为每次持久化时Redis主进程都会fork()一个子进程,进行数据持久化到磁盘,Redis主进程并不会执行磁盘I/O等操作;
与AOF 格式的文件相比,RDB 文件可以更快的重启。
(2)缺点
因为RDB只能保存某个时间间隔的数据,如果中途Redis服务被意外终止了,则会丢失一段时间内的Redis数据;
RDB需要经常 fork()才能使用子进程将其持久化在磁盘上。如果数据集很大,fork()可能很耗时,并且如果数据集很大且CPU性能不佳,则可能导致Redis停止为客户端服务几毫秒甚至一秒钟。
四、AOF
1、AOF持久化状态查询
Redis默认是关闭AOF持久化,使用config get appendonly命令,可以查询AOF的启动状态。
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
第一行为AOF文件的名称,第二行表示AOF启动的状态,yes表示已启动,no表示未启动。
2、开启AOF持久化
(1)使用命令开启
config set appendonly yes
使用命令行启动的优点是Redis无需重启,缺点是一旦Redis重启,则之前使用命令行设置的配置就会失效。
(2)在redis.conf文件中设置
redis-cli连接后,输入info,可以看到:
config_file:/usr/local/etc/redis.conf
将该文件中的appendonly no改为appendonly yes即可。
修改配置文件的优点是无论重启多少次Redis服务,配置文件中设置的配置信息都不会失效,缺点是每次修改配置文件都要重启Redis服务才能生效。
3、触发方式
(1)自动触发
AOF持久化的自动触发有两种情况:
1、满足 AOF 设置的策略触发
在redis.conf中可修改appendfsync的配置信息,其中:
always:每条 Redis 操作命令都会写入磁盘,最多丢失一条数据;
everysec:每秒钟写入一次磁盘,最多丢失一秒的数据;
no:不设置写入磁盘的规则,根据当前操作系统来决定何时写入磁盘,Linux默认30s写入一次数据至磁盘。
2、满足 AOF 重写触发
(2)手动触发
使用命令bgrewriteaof手动触发AOF持久化。
4、数据恢复
正常情况下,只要开启了AOF持久化,并且提供了正常的appendonly.aof文件,在Redis启动时就会自定加载AOF文件并启动。
5、AOF的优缺点
(1)优点
AOF持久化保存的数据更加完整,AOF提供了三种保存策略:每次操作保存、每秒钟保存一次、跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考虑是一个不错的选择,也是AOF默认的策略,即使发生了意外情况,最多只会丢失1秒的数据;
AOF采用的是命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些意外原因,导致最后操作的持久化数据写入了一半,也可以通过redis-check-aof工具轻松的修复;
AOF持久化文件非常容易理解和解析,它是把所有Redis键值操作命令,以文件的方式存入了磁盘。即使不小心使用flushall命令删除了所有键值信息,只要使用AOF文件,删除最后的 flushall命令,重启Redis即可恢复之前误删的数据。
(2)缺点
对于相同的数据集来说,AOF文件要大于RDB文件;
在Redis负载比较高的情况下,RDB性能更好。
6、持久化文件加载规则
- 如果只开启了AOF持久化,Redis启动时只会加载AOF文件(appendonly.aof),进行数据恢复;
- 如果只开启了RDB持久化,Redis启动时只会加载RDB文件(dump.rdb),进行数据恢复;
- 如果同时开启了RDB和AOF持久化,Redis启动时只会加载AOF文件(appendonly.aof),进行数据恢复。
五、混合持久化
RDB和AOF 持久化各有利弊,RDB可能会导致一定时间内的数据丢失,而AOF由于文件较大则会影响Redis的启动速度,为了能同时使用RDB和AOF各种的优点,Redis 4.0之后新增了混合持久化的方式。
开启混合持久化后,AOF重写时会把Redis的持久化数据,以RDB的格式写入到AOF文件的开头,之后的数据再以AOF的格式追加到文件的末尾。
1、混合持久化状态查询
使用config get aof-use-rdb-preamble命令可以查询混合持久化是否开启,yes代表开启,no代表关闭。
127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"
2、混合持久化的开启
(1)使用命令开启
config set aof-use-rdb-preamble yes
(2)在redis.conf文件中设置
将该文件中的aof-use-rdb-preamble no 改为 aof-use-rdb-preamble yes即可。
3、数据恢复
混合持久化的数据恢复和AOF持久化过程一样,只需要把appendonly.aof放到Redis的根目录,Redis启动时,只要开启了AOF持久化,Redis就会自动加载并恢复数据。
4、混合持久化的优缺点
(1)优点
混合持久化结合了RDB和AOF持久化的优点,开头为RDB的格式,使得Redis可以更快的启动,同时结合AOF的优点,又减低了大量数据丢失的风险。
(2)缺点
兼容性差,如果开启混合持久化,那么此混合持久化AOF文件,就不能用在Redis 4.0之前版本了;
AOF文件中添加了RDB格式的内容,使得AOF文件的可读性变得很差。
六、Redis持久化最佳实践
1、控制持久化开关
根据实际的业务情况出发,在对数据的丢失不敏感的情况下,可考虑关闭Redis的持久化,这样所有的键值操作都在内存中,可以保证最高效率的运行Redis。
持久化关闭操作:
关闭 RDB 持久化,使用命令: config set save ""
关闭 AOF 和 混合持久化,使用命令: config set appendonly no
2、主从部署
使用主从部署,一台用于响应主业务,一台用于数据持久化,这样就能让Redis更加高效的运行。
3、使用混合持久化
混合持久化结合了RDB和AOF的优点,Redis 5.0版本开始默认是开启的。
4、使用配置更高的机器
Redis对CPU的要求不高,反而是对内存和磁盘的要求很高,因为Redis大部分时候都在做读写操作,使用更大内存和更快的磁盘,对Redis性能的提高有帮助。