为你自己学Redis
  • README
  • 安装
    • macos下安装redis
  • 第1章 构建Redis开发环境
    • 1.1 Redis概述
    • 1.2 了解必要的Docker技能
    • 1.3 安装和配置基于Docker的Redis环境
  • 第2章 实践Redis的基本数据类型
    • 2.1 Redis缓存初体验
    • 2.2 针对字符串的命令
    • 2.3 针对哈希类型变量的命令
    • 2.4 针对列表类型变量的命令
    • 2.5 针对集合的命令
    • 2.6 针对有序集合的命令
  • 第3章 实践Redis的常用命令
    • 3.1 键操作命令
    • 3.2 HyperLogLog相关命令
    • 3.3 lua脚本相关命令
    • 3.4 排序相关命令
  • 第4章 实践Redis服务器和客户端的操作
    • 4.1 Redis服务器管理客户端的命令
    • 4.2 查看Redis服务器的详细信息
    • 4.3 查看并修改服务器的常用配置
    • 4.4 多个客户端连接远端服务器
  • 第5章 Redis数据库操作实战
    • 5.1 切换数据库操作
    • 5.2 Redis事务操作
    • 5.3 地理位置相关操作
    • 5.4 位图数据类型的应用
    • 5.5 慢查询实战分析
  • 第6章 Redis数据持久化操作
    • 6.1 Redis持久化机制概述
    • 6.2 AOF持久化机制实战
    • 6.3 RDB持久化机制实战
    • 6.4 如何选用持久化方式
  • 第7章 搭建Redis集群
    • 7.1 搭建基于主从复制模式的集群
    • 7.2 搭建哨兵模式的集群
    • 7.3 搭建cluster集群
  • 第8章 GO整合MySQL与Redis
    • 8.1 GO通过redigo读写Redis
    • 8.2 Go与各种Redis数据类型
    • 8.3 Redis与MySQL的整合
    • 8.4 Redis缓存实战分析
  • 第9章 Redis应用场景与案例实现
    • 9.1 Redis消息队列实战
    • 9.2 Go实战Redis分布式锁
Powered by GitBook
On this page
  • 6.4.1 对比两种持久化方式
  • 6.4.2 综合使用两种持久化方式
  • 6.4.3 查看持久化状态的命令
  1. 第6章 Redis数据持久化操作

6.4 如何选用持久化方式

6.4.1 对比两种持久化方式

AOF可以设置一秒写一次持久化文件,所以相对RDB而言,这种方式能更好地记录内存数据,从而能更好地达到持久化的效果,且AOF是以"在文件末尾追加"的方式写入数据,所以性能较好.不过AOF持久化的文件一般会大于RDB快照,所以用AOF恢复数据时速度会比RDB要慢

在某些个别场景里,Redis服务器在重启时无法加载AOF持久化文件,从而导致无法恢复数据,这种情况虽然出现的概率很小,但是一旦出现,或许就是灾难性的


某些场景是指:

  1. AOF文件损坏:

    • 如果Redis或宿主机突然崩溃,如电源故障,这可能会导致AOF文件的某些部分不完整或损坏

    • 如果磁盘已满或发生其他文件系统错误,可能会导致AOF文件写入不完整

  2. AOF格式版本不兼容:

    • 如果你尝试使用一个较新版本的Redis加载一个由较旧版本的Redis创建的AOF文件,可能会遇到兼容性问题

  3. 文件系统权限问题:

    • 如果Redis进程没有适当的权限来读取AOF文件或其所在的目录,它将无法加载该文件

  4. 配置问题:

    • 如果Redis的配置文件中的appendonly选项被设置为no,那么Redis将不会加载AOF文件,即使它存在

    • appendfilename或dir配置可能指向了错误的AOF文件或目录

  5. AOF文件过大:

    • 如果AOF文件非常大,Redis在启动时可能需要较长时间来加载它.虽然这并不是一个真正的"无法加载"的情况,但在实际操作中可能会被误解为加载失败

  6. 硬件问题:

    • 磁盘故障、损坏的RAM或其他硬件问题可能会影响AOF文件的完整性和可读性

  7. 外部因素:

    • 如果有外部进程(例如备份或监控工具)锁定了AOF文件,这可能会干扰Redis读取文件

  8. AOF文件内部的命令错误:

    • 在某些情况下,AOF文件中的命令可能会引起Redis启动时的错误.例如,一个命令可能引用了一个不存在的键

为了更好地理解和解决加载AOF文件时的问题,可以查看Redis的日志文件.这通常会提供有关为什么Redis无法加载AOF文件的详细信息和错误消息.如果出现问题,你可以使用redis-check-aof工具来检查和修复AOF文件.


相对而言,RDB的快照是二进制文件,所以一般比AOF要小,所以在恢复数据时占优势,而且通过BGSAVE等方式生成快照时,Redis服务器会新创建一个子进程,所以不会影响Redis服务器继续执行命令.不过RDB持久化的缺陷之前也已经提到,即无法即时恢复数据

综合考虑到这两种方式的优缺点,在实际项目里可以同时用到这两种方式,当出现数据误删的情况时,可以用AOF持久化文件来恢复数据,在一般情况下,可以用RDB快照来恢复数据.一旦出现因AOF持久化文件损坏而无法恢复数据的情况,就可以用RDB的方式来恢复数据,最大限度地提升Redis内存数据的安全性

6.4.2 综合使用两种持久化方式

  • step1. 编写配置文件

(base) root@yuanhong section6-4 % cat redis.conf
# 快照或AOF文件存储路径
dir /StudyRedisBaseOnDocker/conf/chpater6/section6-4

# 5秒内有1个或1个以上的键被修改时生成快照
save 5 1

# 300秒内有100个或100个以上的键被修改时生成快照
save 300 100

# 60秒内有1000个或1000个以上的键被修改时生成快照
save 60 1000

# 快照文件名
dbfilename my_dump.rdb

# 启用AOF持久化机制
appendonly yes

# 持久化频率为每秒持久化1次
appendfsync everysec

# 持久化文件名称
appendfilename my_appendonly.aof
  • step2. 启动redis-server

(base) root@yuanhong section6-4 % redis-server /StudyRedisBaseOnDocker/conf/chpater6/section6-4/redis.conf
  • step3. 写入一些键值对

(base) root@yuanhong ~ % redis-cli
127.0.0.1:6379> SET name Peter
OK
127.0.0.1:6379> SET age 18
OK
  • step4. 查看配置文件指定的路径下的文件情况

(base) root@yuanhong section6-4 % ls
my_appendonly.aof	my_dump.rdb		redis.conf

可以看到,AOF文件和RDB文件同时存在

6.4.3 查看持久化状态的命令

  • INFO persistence:查看持久化相关状态

127.0.0.1:6379> INFO persistence
# Persistence
loading:0
current_cow_size:0
current_cow_size_age:0
current_fork_perc:0.00
current_save_keys_processed:0
current_save_keys_total:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1692090209
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:0
aof_enabled:1
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0
module_fork_in_progress:0
module_fork_last_cow_size:0
aof_current_size:87
aof_base_size:0
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0

其中:

  • rdb_last_save_time:上次RDB持久化快照的生成时间

  • aof_enabled:是否启用AOF持久化机制

  • aof_last_write_status:上次AOF同步数据的操作是否成功

  • aof_current_rewrite_time_sec:表示当前AOF重写操作(如果有的话)已经进行的秒数.如果没有AOF重写操作正在进行,该值为-1

  • aof_last_rewrite_time_sec:上一次AOF重写操作所花费的总时间.单位:秒

Previous6.3 RDB持久化机制实战Next第7章 搭建Redis集群

Last updated 1 year ago