DEV Community

testted123456
testted123456

Posted on

redis-持久化

一、RDB快照持久化

  1. 在指定时间间隔将内存数据写入磁盘,默认持久化方式

  2. 触发方式

1. 执行save和bgsave命令
2. 配置文件设置save <seconds> <changes>规则,自动间隔性执行bgsave命令
3. 主从复制时,从库全量复制同步主库数据,主库会执行bgsave
4. 执行flushall命令清空服务器数据
5. 执行shutdown命令关闭Redis时,会执行save命令
Enter fullscreen mode Exit fullscreen mode
  1. save命令
    save会阻塞redis进程,再快照创建完之前不能出来其他请求

  2. bgsave命令

  • bgsave不会阻塞redis进程,会fork出一个进程把全量数据写入临时rdb文件,再替换正式rdb文件

  • 配置文件自动触发bgsave

# 900秒内有1次key改变则触发
save 900 1
# 300秒内有10次key改变则触发
save 300 10
# 60秒内有10000次key改变则触发
save 60 10000
Enter fullscreen mode Exit fullscreen mode
  1. 优点:
  • RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集,适合做数据的备份,灾难恢复

  • 可以最大化Redis的性能,在保存RDB文件,服务器进程只需fork一个子进程来完成RDB文件的创建,父进程不需要做IO操作

  • 与AOF相比,恢复大数据集的时候会更快

  1. 缺点:
  • RDB的数据安全性是不如AOF的,保存整个数据集的过程是比繁重的,根据配置可能要几分钟才快照一次,如果服务器宕机,那么就可能丢失几分钟的数据

  • Redis数据集较大时,fork的子进程要完成快照会比较耗CPU、耗时

二、AOF持久化

# appendonly参数开启AOF持久化
appendonly no

# AOF持久化的文件名,默认是appendonly.aof
appendfilename "appendonly.aof"

# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的
dir ./

# 同步策略(always/everysec/no)
appendfsync everysec

# aof重写期间是否同步
no-appendfsync-on-rewrite no

# 重写触发配置
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 加载aof出错如何处理
aof-load-truncated yes

# 文件重写策略
aof-rewrite-incremental-fsync yes

# 同时开启rdb、aof
aof-use-rdb-preamble yes
Enter fullscreen mode Exit fullscreen mode
  1. append命令
  • 开启aof,每个执行一个命令,都会把该命令以协议格式先追加到aof_buf缓存区的末尾,而不是直接写入文件,避免每次有命令都直接写入硬盘,减少硬盘IO次数

  • aof_buf写入aof策略:

appendfsync always:
将aof_buf缓冲区的所有内容写入并同步到AOF文件,每个写命令同步写入磁盘

appendfsync everysec:
将aof_buf缓存区的内容写入AOF文件,每秒同步一次,该操作由一个线程专门负责

appendfsync no:
将aof_buf缓存区的内容写入AOF文件,什么时候同步由操作系统来决定
Enter fullscreen mode Exit fullscreen mode
  1. rewrite命令
  • 随着时间推移,aof文件会越来越大,rewrite就是为了缩小aof文件的大小

  • rewrite不是读取aof文件,而是读redis生成新的aof文件替换老的aof文件

  • redis-7会把数据保存到aof目录下的rdb中,同时清空aof文件

  • 命令触发

# fork出一个进程来执行,服务器继续执行命令,且最加到aof_buf、
# aof_rewrite_buf
127.0.0.1:6379> bgrewriteaof
Enter fullscreen mode Exit fullscreen mode
  • 自动触发 配置文件:
# 当AOF文件的体积大于64MB,且AOF文件的体积比上一次重写后的体积大了一倍(100%)时,会执行`bgrewriteaof`命令
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
Enter fullscreen mode Exit fullscreen mode
  1. 优点:
  • 数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据)

  • AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复

  1. 缺点:
  • 对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢

  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB。 不过在一般情况下, 每秒 fsync 的性能依然非常高

Top comments (0)