Redis持久化
redis持久化
指的是把内存中的数据写入磁盘中。因为redis是基于内存进行数据存储的,当服务器关闭或者重启时,内存中的数据会丢失,所以需要通过持久化机制,来把数据定期自动或者按需手动保存到磁盘中,以便服务器启动时恢复数据。
实现方法分为如下两种
1.RDB(Redis DataBase)
是什么:在指定的时间间隔内,执行数据集的时间点快照,快照文件就是RDB文件(例如dump.rdb)。当Redis重启时,会加载这个.rdb
文件,直接将文件中的数据加载到内存中。
相关配置
位于redis.conf配置文件的snapshot模块中
save <seconds> <changes> [<seconds> <changes> ...]
大概位于第440行
用于配置使时间间隔和数据修改次数,及每个一段固定时间查看当前redis修改数据的次数,超过了设定的i修改次数则进行快照。dir 文件位置
(例如 /root/myredis/dumpfiles) 大概位于第510行
用于设置rdb文件存放的位置dbfilename 文件名
(例如dump6379.rdb) 大概位于第487行
用于设置rdb文件的名字- stop-writes-on-bgsave-error
- rdbcompression
- rdbchecksum
- rdb-del-sync-files
自动触发
1.配置文件中的默认快照
根据配置文件中的save进行自动快照操作。
2.主从复制
手动触发
1.save
- 功能:
SAVE
命令用于在主线程中同步生成 RDB 文件,将当前 Redis 数据库的数据快照保存到磁盘上。 - 执行过程:执行
SAVE
命令时,Redis 会阻塞主线程,直到 RDB 文件创建完成。在此期间,Redis 无法处理其他客户端的任何请求。 - 适用场景:由于其阻塞特性,
SAVE
命令通常不适用于生产环境,尤其是在数据量较大时,可能会导致长时间的阻塞。
2.bgsave
- 功能:
BGSAVE
命令用于异步生成 RDB 文件。它通过创建一个子进程来执行数据快照操作,而主线程继续处理客户端请求。 - 执行过程:
- 主进程调用
fork()
创建一个子进程。 - 子进程负责将内存中的数据写入到磁盘上的临时文件中。
- 写入完成后,子进程会用新生成的临时文件替换旧的 RDB 文件。
- 主进程在整个过程中几乎不受影响,只有在
fork()
阶段会有短暂的阻塞。
- 主进程调用
- 适用场景:
BGSAVE
是推荐的持久化命令,尤其适用于生产环境。它可以在不影响 Redis 正常服务的情况下,完成数据的持久化操作。
3.特殊命令
- 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义。
- 执行shutdown且没有设置开启AOF持久化也会产生dump.rdb文件。
2.AOF(Append Only File)
是什么:AOF是Redis的一种持久化机制,它通过将Redis执行的写操作命令以追加的方式记录到一个日志文件(通常是appendonly.aof
)中来实现数据的持久化。在Redis重启时,会加载AOF文件,重新执行其中记录的命令,从而恢复数据。
相关配置
位于redis.conf配置文件的append only模块中
appendonly yes/no
用于设置是否启用AOF,默认只启用RDB,不启用AOF。
dir 文件位置
用于指定
.aof
文件所在目录的存放的位置。appenddirname 目录名
用于指定aof文件所在的目录
区分:
redis7版本开始,.aof文件存放路径等于
dir下的文件位置/appenddirname目录名/xxx.aof
redis6版本时,.aof文件存放位置仅等于
dir下的文件位置/xxx.aof
appendfilename 文件名
指定.aof的文件名称
写回策略
AOF的写回策略决定了Redis何时将内存中的命令写入到AOF文件中。Redis提供了三种写回策略,分别通过配置文件中的appendfsync
参数来设置:
appendfsync always
- 描述:每次写操作都会立即同步到AOF文件中。
- 优点:数据安全性最高,即使Redis崩溃,也不会丢失任何数据。
- 缺点:性能开销较大,因为每次写操作都会触发一次磁盘同步操作,可能会降低Redis的性能。
appendfsync everysec
- 描述:每秒同步一次AOF文件。这是默认的写回策略。
- 优点:在性能和数据安全性之间取得了较好的平衡。即使发生故障,最多只会丢失1秒内的数据。
- 缺点:在极端情况下(如系统崩溃),可能会丢失1秒内的数据。
appendfsync no
- 描述:不主动同步AOF文件,由操作系统决定何时同步。
- 优点:性能开销最小,因为Redis不会主动触发磁盘同步操作。
- 缺点:数据安全性最低,如果操作系统崩溃或Redis进程被意外终止,可能会丢失较多数据。
重写机制
AOF文件会随着Redis的写操作不断增加,文件大小可能会变得很大。为了优化AOF文件的大小,Redis提供了AOF重写机制,通过生成一个新的AOF文件来替换旧的AOF文件,从而减小文件大小并提高性能。
工作原理
- 触发条件:
- 自动触发:可以通过配置文件中的
auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
参数来设置自动触发条件。auto-aof-rewrite-percentage
:表示AOF文件大小增长的百分比。例如,设置为100
,表示当AOF文件大小增长超过100%时,会触发重写。auto-aof-rewrite-min-size
:表示AOF文件的最小大小。例如,设置为64mb
,表示只有当AOF文件大小超过64MB时,才会触发重写。
- 手动触发:可以通过命令
BGREWRITEAOF
手动触发AOF重写。
- 自动触发:可以通过配置文件中的
- 重写过程:
- 当触发AOF重写时,Redis会启动一个子进程来执行重写操作。
- 子进程会读取当前内存中的数据,并生成一个新的AOF文件,该文件只包含恢复当前数据集所需的最小命令集合。
- 在重写过程中,主进程会继续处理客户端的请求,并将新的写操作命令追加到一个临时缓冲区中。
- 当子进程完成重写后,主进程会将临时缓冲区中的命令追加到新的AOF文件中,然后用新的AOF文件替换旧的AOF文件。
- 优点:
- 减小文件大小:通过生成一个新的AOF文件,只保留恢复当前数据集所需的最小命令集合,从而减小文件大小。
- 提高性能:新的AOF文件更紧凑,加载速度更快,同时减少了磁盘空间的占用。
- 注意事项:
- AOF重写不会阻塞主进程,因为重写操作是由子进程完成的,主进程可以继续处理客户端的请求。
- 在重写过程中,主进程会将新的写操作命令追加到临时缓冲区中,以确保数据的完整性。
3.RDB-AOF混合持久化
一、两种持久化方式优先级
- 当同时开启RDB和AOF两种持久化方式时,AOF的优先级高于RDB。若AOF文件存在并无损,则只加载AOF文件。
二、混合持久化开启
开启方式
配置文件append only模块
aof-use-rdb-preamble yes
混合持久方式的数据执行流程
(1)Redis启动时,会检查是否存在AOF文件(
appendonly.aof
)。如果存在且配置了混合持久化(aof-use-rdb-preamble yes
),Redis会先加载AOF文件。(2)检查AOF文件是否包含RDB快照
- 如果AOF文件中包含RDB快照(即混合持久化模式),Redis会先加载RDB快照部分,快速恢复大部分数据。
- 然后,Redis会继续加载AOF文件中自RDB快照之后的增量日志,依次执行这些日志中的写操作,以恢复到最新的数据状态。
(3)如果AOF文件不存在或损坏
- 如果AOF文件不存在或损坏,Redis会尝试加载RDB文件(
dump.rdb
)。 - 如果RDB文件也不存在或损坏,Redis将无法恢复数据,启动时会报错。
(4)数据恢复完成
完成上述步骤后,Redis的数据恢复过程结束,服务开始正常运行。
4.纯缓存模式
定义
纯缓存模式是指同时关闭RDB和AOF持久化功能,将Redis仅作为内存缓存使用,不进行任何数据持久化操作。
1.关闭RDB
save ""
禁用rdb持久化模式下,仍然可以手动执行save
、bgsave
命令生成rdb文件
2.关闭AOF
appendonly no
仍然可以手动执行bgrewriteaof
生成aof文件