[redis] 数据持久化

RDB

  1. 重点

    	1. RDB 是经过压缩的二进制文件用于保存和还原 Redis 服务器所有数据库中的所有键值对数据。
    	2. SAVE 命令会阻塞服务器,执行过程中客户端命令请求会被拒绝。
    	3. BGSAVE 命令由子进程执行保存操作,不会阻塞服务器,可以继续处理客户端命令。
    	4. 服务器为避免父进程及子进程同时执行 rdbSave 调用,防止竞争条件,所以禁止 SAVE 和 BGSAVE 同时执行,
    	5. 服务器状态中会保存所有用 save 选项设置的保存条件( save <秒> <次数>),当任意一个条件被满足时,服务器会自动执行 BGSAVE 命令,服务器默认每隔 100 毫秒执行一次,执行函数为 serverCron。
    	6. RDB 文件保存地址可以在 redis-cli 中通过   `config get dir` 命令获取。
    	7. 如果服务器启动了 AOF 功能,那么服务器会优先使用 AOF 文件来还原数据库状态。
    	只有在 AOF 持久化功能处于关闭状态时,服务器才会使用 RDB 文件来还原数据库状态。
    
  2. 服务器载入文件时的流程判断

    服务器启动
    执行程序
    已开启 AOF 持久化功能?
    载入 AOF 文件
    载入 RDB 文件
  3. dirty 计数器和 lastsave 属性
    1. dirty 计数器用于保存服务器上一次成功执行 SAVE 或 BGSAVE 之后,服务器对所有的数据库状态执行了多少次修改(包括写入、删除、更新等)。
    2. lastsave 属性 UNIX 时间戳,记录了服务器上一次成功执行 SAVE 或 BGSAVE 的时间。

AOF(Append Only File)

  1. 重点

    	1. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态的(追加),
    	2. AOF 文件中的所有命令都已 Redis 命令请求协议的格式保存,命令请求会先保存到 AOF 缓冲区,然后再定期写入并同步到 AOF 文件中。
    	3. AOF 实现过程:命令追加、文件写入、文件同步三个步骤。
    	4. AOF 重写并不需要对现有的 AOF 文件进行任何读取、分析或者写入操作。
    	5. 在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新的 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新的 AOF 文件工作后,服务器会将重写缓冲区中的所有内容追加到新的 AOF 文件的末尾,使新旧 AOF 文件保存的数据库状态完全一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,完成 AOF 重写操作。
    	6. AOF 重写过程中,客户端请求的新的命令会分别保存到 AOF 缓冲区 和 AOF 重写缓冲区。
    	7. 重写时为避免执行命令时造成客户端输入缓冲区溢出,重写程序处理 列表、哈希表、集合、有序集合 这四种可能会带有多个元素的键时,会先检查键所包含的元素数量,如果超出 redis.h/AOF_REWRITE_ITEMS_PER_CMD(64) 常亮的值,那么重写程序将使用多条命令来记录键的值。 
    
  2. AOF 实现过程

    1. 命令追加:Redis 先将写命令追加到缓冲区 (aof_buf),而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘 IO 成为 Redis 负载的瓶颈。
    2. 文件写入:通过 flushAppendOnlyFile 函数来判断,是否需要将 aof_buf 缓冲区中的内容写入并保存到 AOF 文件中。其中 flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值来决定。
      always:将 aof_buf 缓冲区中所有内容写入并同步到 AOF 文件,(性能最低,安全性最高);
      everysec: 将 aof_buf 缓冲区中所有内容写入到 AOF 文件,如果上次同步 AOF 文件的时间距离现在已超过 1 秒,则再次对 AOF 文件进行同步(性能、安全性平衡,最多丢失 1 秒的命令数据);
      no: 将 aof_buf 缓冲区中所有内容写入到 AOF 文件,不进行同步,由操作系统来决定何时同步,通常同步周期为 30 秒(性能最高,有数据安全性问题);
  3. AOF 文件载入和数据还原

    服务器启动载入程序
    创建伪客户端
    从 AOF 文件中分析并读取一条写命令
    使用伪客户端执行写命令
    AOF 文件中的所有写命令都已经被执行完毕?
    载入完毕
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值