简介:
Redis是当下最受欢迎的开源NoSQL数据库之一,支持多种数据结构,如字符串、哈希、列表、集合和有序集。但由于Redis是将所有数据存储在内存中,数据易失性是其最大的弱点。在Redis 2.0之前,它并没有提供任何持久化机制,所有数据都是存储在内存中,当Redis服务器停止或崩溃时,数据将会丢失。因此Redis在2.0之后,加入了持久化机制,来解决数据丢失问题,并支持主从复制和哨兵机制。
多级标题:
一、Redis持久化机制
1.1 RDB持久化
1.2 AOF持久化
二、RDB持久化配置
2.1 RDB的优缺点
2.2 RDB命令
2.3 RDB的配置参数
2.4 RDB的工作原理
2.5 RDB快照的创建
三、AOF持久化配置
3.1 AOF的优缺点
3.2 AOF命令
3.3 AOF的配置参数
3.4 AOF的工作原理
3.5 AOF文件的重写
内容详细说明:
一、Redis持久化机制
Redis 2.0之后,大力加入了持久化机制,支持RDB和AOF两种持久化方式来保证数据存储在磁盘上,即使Redis服务器在不保存状态下崩溃,也能恢复数据。Redis持久化主要有两种方案:RDB和AOF。
1.1 RDB持久化
Redis RDB持久化是将数据快照存储在磁盘上的一种策略。在设置的时间内如果有指定数量的数据被修改,Redis就将数据的快照存储在磁盘上。RDB会生成一个二进制文件,并存储在redis目录下,该文件包含所有Redis内容的压缩快照。若redis发生宕机或者重启的情况时,可以利用该快照文件进行数据恢复。
1.2 AOF持久化
Redis AOF是将每条数据操作命令记录下来,记录Redis的所有写操作,以文本形式保存到一个文件中。AOF文件包含了Redis服务器执行的所有写操作,这种格式被称为AOF文件格式。Redis根据AOF文件中的命令重放来恢复数据。AOF是一种更为持久的方式,但是缺点是对性能有较大的影响,在写入时会导致效率降低。
二、RDB持久化配置
2.1 RDB的优缺点
优点:
(1)RDB文件轻松地生成Redis数据的快照。
(2)RDB文件可以用于灾难恢复。通过简单地将 RDB 文件复制到另一个服务器,您可以轻松地在不同的环境之间迁移 Redis。
缺点:
(1)RDB 文件需要一定的时间来生成。
(2)当Redis宕机时,将丢失最后一次快照生成后的所有数据。
2.2 RDB命令
SAVE命令会将Redis所有的数据进行快照保存到磁盘。直接调用此命令会阻塞Redis的所有客户端,直到快照已经完全保存到磁盘。
BGSAVE命令会派生一个不同的进程来执行快照操作,并且Redis可以正常的服务其它客户端。BGSAVE在快照存储期间,如果有写操作,那么写操作会被记录在AOF日志中。
2.3 RDB的配置参数
保存RDB文件的路径:
1.rdbFile:使用默认路径如果不填写。
2.dir:可以自定义RDB文件的保存路径。
控制RDB的快照:
1.save 900 1:表示900秒内至少有1个键被修改存储快照。
2.save 300 10:表示300秒内至少有10个键被修改存储快照。
3.save 60 10000:表示60秒内至少有10000个键被修改存储快照。
2.4 RDB的工作原理
首先,当Redis收到一个BGSAVE命令时,会派生一个异步的进程来执行快照操作。然后,此进程将遍历整个内存,并将整个数据集对象写入磁盘中,形成RDB文件。Redis能够无损地恢复数据到与快照相似的时间点。通常情况下,在执行快照操作之前,Redis会对新的写操作进行缓存,然后写入到快照完成后的AOF日志。快照操作完成后,Redis开始接受新的写入。
2.5 RDB快照的创建
可以通过调用BGSAVE命令创建RDB快照。执行成功后,可以在Redis目录下找到快照文件,格式类似于 dump.rdb。您可以通过访问信息栏或运行dbSize命令来验证RDB快照的大小。
三、AOF持久化配置
3.1 AOF的优缺点
优点:
(1)AOF可以非常可靠地保护数据。
(2)AOF文件包含了Redis服务器执行的所有写操作。
缺点:
(1)AOF对于性能会有一些影响。
(2)AOF通常比RDB文件更大。
3.2 AOF命令
Redis提供了五种基本的AOF持久化模式,分别是NO、ALWAYS、EVERYSEC、AFFTHRRESH、ONWRITE,具体含义可以参考redis.conf配置文件。
3.3 AOF的配置参数
开启AOF功能,就可以将AOF此类命令写入到AOF日志文件:
1.aof-on:该设置可以开启AOF持久化设置,让Redis在记录写操作时,将AOF日志写入磁盘。
2.aof-rewrite-incremental-fsync:如果设置为是,计算重写期间,每一次写入都需要调用fsync()方法,保证测试精度。
3.aof-use-rdb-preamble:启用后,AOF rewrite时,增加RDB文件的元数据到AOF文件的开头。
3.4 AOF的工作原理
AOF是将所有写操作缓冲在内存中,并以命令序列的形式存储。Redis会每100ms将缓冲区中的操作写入到AOF文件中。写入到AOF文件的命令序列会随着时间的推移而增长。为了控制AOF文件的大小,Redis支持snapshot。snapshot会根据时间间隔或写入操作次数进行触发。执行snapshot时,Redis会生成一个RDB文件,该RDB文件包含存储在Redis中的当前所有数据。然后,Redis会向AOF文件中追加一个SAVE命令,表示执行了一个snapshot。Redis可通过读取AOF文件和执行其中的命令序列来重构数据集。
3.5 AOF文件的重写
可以通过执行BGREWRITEAOF命令来重写AOF文件。此命令类似于BGSAVE,但不是快照,而是将写入新AOF文件中的数据的最小集合。重写期间会将过期条目和重复条目删除以优化文件大小,最终会在旧AOF文件中添加一条“REWRITE”的类似于SAVE的指令。需要注意的是,尽管AOF文件的重写可能与快照一样耗费大量处理时间和内存,但是重写不会被客户端调用,且过程是异步的,可以同时与客户端响应请求。