Redis如何实现持久化

Redis如何实现持久化


Redis默认将所有数据存储在内存中,虽然读写效率极高,但存在两大风险

  • 数据易失性:进程重启或服务器宕机导致内存数据丢失。
  • 恢复成本高:无法直接通过内存重建大规模数据集。

Redis作为高性能的键值数据库,其核心特性之一是数据持久化------将内存中的数据持久保存到磁盘,防止服务宕机时数据丢失,持久化机制通过在磁盘中保存数据副本,为Redis提供了数据安全保障和灾难恢复能力

目前Reids有两种持久化机制

RDB

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

快照文件称为RDB文件,默认是保存在当前运行目录

触发方式

  1. 手动触发

    • SAVE:阻塞主进程直至快照完成(生产环境慎用)
    • BGSAVE:fork子进程异步生成快照(主流方式)
  2. 自动触发

    redis.conf中配置规则,例如:

    conf 复制代码
    save 900 1      # 900秒内至少1次修改
    save 300 10     # 300秒内至少10次修改
    save 60 10000   # 60秒内至少10000次修改

    RDB的其他配置也可以在redis.conf中配置

    conf 复制代码
    # 是否压缩,建议不开启,压缩也会消耗cpu,磁盘的话不值钱
    rdbcompression yes
    
    # RDB文件名称
    dbfilename dump.rdb
    
    #文件保存的路径目录
    dir ./

异步生成

在 Redis 生成 RDB 文件时是异步的(使用 bgsave 命令)采用了 fork 子进程的方式来进行快照操作。生成 RDB 文件的过程由子进程执行,主进程继续处理客户端请求,所以可以保证 Redis 在生成快照的过程中依然对外提供服务,不会影响正常请求

并且在生成过程中,主进程会正常处理客户端的请求,如果进行数据的修改,就会使用写时复制的技术:

  • 当主进程执行读操作时,访问共享内存
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作,后续主进程的读操作也会访问拷贝的数据

优缺点

优点

  • 文件紧凑:二进制压缩格式,体积小,适合备份与迁移。
  • 恢复速度快:直接加载快照文件到内存,效率极高。
  • 性能影响小:异步生成快照,对主进程影响有限。

缺点

  • 数据丢失风险:两次快照间的数据可能丢失。
  • 大文件生成耗时:数据集较大时,fork子进程可能导致短暂延迟。

AOF

AOF全称为Append OnlyFile(追加文件),Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。,AOF以日志形式记录所有写操作命令,重启时通过重放命令重建数据,AOF文件更注重数据安全性

比如说当执行写操作的时候:

复制代码
SET name jack

这条命令会更改redis中的数据,并且在AOF文件中记录操作命令:

复制代码
$3
SET
$3
name
$3
jack

AOF默认是关闭的,需要在配置文件中打开

conf 复制代码
# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename"appendonly.aof"

文件同步策略 :根据策略(appendfsync)将缓冲区内容写入磁盘:

  • always:每次写操作同步(安全,性能最低)
  • everysec:每秒同步(平衡方案,推荐默认)
  • no:由操作系统决定(性能最佳,风险最高)

可以redis.conf中配置:

conf 复制代码
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always

# 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到A0F文件,是默认方案
appendfsync everysec

#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

优缺点

优点

  • 数据安全性高 :最多丢失1秒数据(everysec配置)。
  • 可读性强:AOF文件为文本格式,便于人工分析。
  • 容错机制 :支持崩溃后使用redis-check-aof工具修复。

缺点

  • 文件体积大:即使经过重写,通常仍大于RDB文件。
  • 恢复速度慢:重放所有命令耗时较长。
  • 写入负载高:高频写入场景可能影响性能。

对比

RDB AOF
持久化方式 定时对整个内存做快照 记录每一次执行的命令
数据完整性 不完整,两次备份之间会丢失 相对完整,取决于刷盘策略
文件大小 会有压缩,文件体积小 记录命令,文件体积很大
宕机恢复速度 很快
数据恢复优先级 低,因为数据完整性不如AOF 高,因为数据完整性更高
系统资源占用 高,大量CPU和内存消耗 低,主要是磁盘IO资源 但AOF重写时会占用大量CPU和内存资源
使用场景 可以容忍数分钟的数据丢失,追求更快的启动速度 对数据安全性要求较高常见

如何选择持久化方案

场景 推荐方案 理由
数据备份与快速恢复 RDB 文件小,加载速度快
高数据安全性要求 AOF(everysec) 最多丢失1秒数据
平衡安全与性能 RDB + AOF(混合模式) 兼顾恢复速度与实时性
容灾恢复 RDB定期备份至云存储 防止物理损坏
相关推荐
羊锦磊13 分钟前
[ Redis ] SpringBoot集成使用Redis(补充)
java·数据库·spring boot·redis·spring·缓存·json
倔强的石头_39 分钟前
【金仓数据库】ksql 指南(三) —— 创建与管理表空间和模式
数据库
白帽子黑客罗哥42 分钟前
Redis实战深度剖析:高并发场景下的架构设计与性能优化
redis·网络安全·性能优化·高并发·分布式锁·秒杀系统·缓存架构
williamdsy1 小时前
【清除 Mac DNS 缓存】Mac 电脑能访问外网却无法加载特定页面?你的 DNS 缓存“发霉”了!
macos·缓存
程序新视界2 小时前
详解MySQL两种存储引擎MyISAM和InnoDB的优缺点
数据库·后端·mysql
半路_出家ren2 小时前
设计一个学生管理系统的数据库
linux·数据库·sql·mysql·网络安全·数据库管理员
金仓拾光集4 小时前
筑牢风控生命线:金仓数据库替代MongoDB,重构证券融资融券业务的数据基石
数据库·mongodb·信创·1024程序员节·kingbasees·国产化替代
那我掉的头发算什么4 小时前
【数据库】navicat的下载以及数据库约束
android·数据库·数据仓库·sql·mysql·数据库开发·数据库架构
奎歪歪5 小时前
UniApp缓存系统详解
缓存·uni-app·1024程序员节
纪伊路上盛名在5 小时前
如何批量获取蛋白质序列的所有结构域(domain)数据-2
数据库·人工智能·机器学习·统计·计算生物学·蛋白质