什么是持久化

  1. Redis 的强劲性能很大程度上是由于其将所有数据都存储在内存中,然而当 Redis 重启或宕机后,所有存储在内存中的数据就会丢失;
  2. 希望在一些情况下 Redis 在重启后能够保证数据不丢失;这时希望 Redis 能将数据从内存中以某种形式同步到硬盘中,使得重启后可以根据硬盘中的记录恢复数据;这一过程就是持久化;

Redis 提供了两种持久化方案

  1. RDB 持久化:根据指定的规则 定时 将内存中的数据存储在硬盘上,在重启之后读取硬盘上的 .rdb 快照文件将数据恢复到内存中;

  2. AOF 持久化:记录服务器执行的所有 写操作 命令形成 .aof 日志文件保存到硬盘中,并在服务器启动时,通过重新执行这些命令来还原数据集;

RDB 持久化

  1. RDB 方式的持久化是通过快照完成的,当符合一定条件时 Redis 会自动将内存中的所有数据生成一份副本并存储在硬盘上,这个过程即为 快照

  2. Redis 允许用户自定义快照条件,当符合快照条件时 Redis 会自动执行快照操作;进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间窗口 M 和改动的键的个数 N(每当时间 M 内被更改的键的个数大于 N 时,即符合自动快照条件);

  3. RDB 持久化相关配置规则如下:

    # 每 900 秒至少有 1 个 key 变化了,则写入快照
    save 900 1 
        
    # 每 300 秒至少有 10 个 key 变化了,则写入快照
    save 300 10 
    
    # 每 60 秒至少有 10000 个 key 变化了,则写入快照
    save 60 10000 
    
    # 快照保存的文件名称
    dbfilename dump.rdb 
    
    # 快照文件保存路径
    dir ./ 
    
  4. RDB 快照的运行方式是异步进行的,在保存快照期间依然能够提供客户端请求:

    • Redis 调用 fork() 创建一个子进程;
    • 使用子进程将数据集写入到一个临时 RDB 文件中;
    • 当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件;

AOF 持久化

  1. RDB 快照功能并不是非常持久(durable):

    • 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据;
    • 尽管对于某些程序来说, 数据的持久性并不是最重要的考虑因素, 但是对于那些追求完全持久化(full durability)的程序来说, 快照功能就不太适用了;
  2. 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化;

    • AOF 可以将 Redis 执行的每一条写命令操作日志存储到硬盘文件中,这一过程显然会降低 Redis 的性能,但是大部分情况下这个影响是可以接受的,另外使用较快硬盘可以提高 AOF 性能;
    • AOF 机制对于日志的写入操作采用的是 append 模式,就是追加模式,因此在写入过程中如果出现宕机问题,也不会破坏已经写入的日志数据;
  3. 默认情况下,Redis 没有开启 AOF 方式的持久化,可以通过 appendonly 参数启用:appendonly yes

  4. AOF 文件的保存位置和 RDB 文件的位置相同,都是 dir 参数设置的,默认的文件名是 appendonly.aof ,可以通过 appendfilename 来修改:

    # AOF 文件和 RDB 文件保存目录是一样的
    dir ./
    
    # 同步的文件名称
    appendfilename "appendonly.aof"
    
  5. AOF 有三种同步策略:

    # 每次同步,每一次发送数据变化都会被立即同步到磁盘中,效率比较低,但是数据最安全
    appendfsync always
    
    # 每秒同步(默认值),异步完成,同步效率非常高,缺点是一旦系统出现宕机,这1秒之内操作的数据就会丢失
    # 一般情况下使用默认值 everysec 就足够了,既兼顾了性能又保证了安全
    appendfsync everysec
    
    # 不同步
    appendfsync no
    

RDB vs AOF

  1. 参考阅读

  2. 一般来说, 如果想达到足以媲美关系型数据库的安全性, 应该同时使用两种持久化功能;

  3. 如果非常关心数据,但仍然可以承受数分钟以内的数据丢失,那么可以只使用 RDB 持久化;

  4. 有很多用户都只使用 AOF 持久化,但并不推荐这种方式:

    • 因为定时生成 RDB 快照非常便于进行数据库备份;
    • 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快;
持久化方式 优点 缺点
RDB • 文件小
• 数据安全性低,容易丢失数据
• 异步备份,性能好
• 数据量比较大时备份速度慢
• 恢复大数据集速度比 AOF
AOF • 数据安全性高
• 相同数据集比 RDB 文件大
• 有利于开发分析
• 根据所使用的 fsync 策略,AOF 速度可能会慢于 RDB
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 什么是持久化
  2. 2. Redis 提供了两种持久化方案
    1. 2.1. RDB 持久化
    2. 2.2. AOF 持久化
  3. 3. RDB vs AOF