《Redis核心原理与实战》学习笔记2——Redis持久化

一、概念

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性能的提高有帮助。

原文地址:https://www.cnblogs.com/luckyliulin/p/13547954.html