首页 > 数据库 >【博学谷学习记录】超强总结,用心分享 | Redis 持久化

【博学谷学习记录】超强总结,用心分享 | Redis 持久化

时间:2022-11-07 10:47:39浏览次数:46  
标签:AOF aof 博学 超强 Redis 内存 RDB 日志 重写


redis提供了两种持久化的方式,分别是RDB (Redis DataBase)和AOF (Append Only File)。

redis默认采用的是RDB方式。

AOF

  • 每条写命令追加至 aof 文件,当重启时会执行 aof 文件中每条命令来重建内存数据
  • AOF 日志是写后日志,即先执行命令,再记录日志
    • Redis 为了性能,向 aof 记录日志时没有对命令进行语法检查,如果要先记录日志,那么日志里就会记录语法错误的命令

同步策略

  • 记录 AOF 日志时,有三种同步策略
    • Always 同步写,日志写入磁盘再返回,可以做到基本不丢数据,但性能不高。
      • 为什么说基本不丢呢,因为 aof 是在 serverCron 事件循环中执行 aof 写入的,并且这次写入的是上一次循环暂存在 aof 缓冲中的数据,因此最多还是可能丢失一个循环的数据
    • Everysec 每秒写,日志写入 AOF 文件的内存缓冲区,每隔一秒将内存缓冲区数据刷入磁盘,最多丢一秒的数据
    • No 操作系统写,日志写入AOF 文件的内存缓冲区,由操作系统决定何时将数据刷入磁盘

AOF 重写

  • AOF 文件太大引起的问题
    1. 文件大小受操作系统限制
    2. 文件太大,写入效率变低
    3. 文件太大,恢复时非常慢
  • 重写就是对同一个 key 的多次操作进行瘦身
    1. 例如一个 key 我改了 100 遍,aof 里记录了100 条修改日志,但实际上只有最后一次有效
    2. 重写无需操作现有 aof 日志,只需要根据当前内存数据的状态,生成相应的命令,记入一个新的日志文件即可
    3. 重写过程是由另一个后台子进程完成的,不会阻塞主进程
  • AOF 重写过程
    1. 创建子进程时会根据 主进程 生成 内存快照,只需要对子进程的内存进行遍历,把每个 key 对应的命令写入新的日志文件(即重写日志)
    2. 此时如果有新的命令执行,修改的是主进程内存,不会影响子进程内存,并且新命令会记录到 重写缓冲区
    3. 等子进程所有的 key 处理完毕,再将 重写缓冲区 记录的增量指令写入重写日志
    4. 在此期间旧的 AOF 日志仍然在工作,待到重写完毕,用重写日志替换掉旧的 AOF 日志

RDB

  • RDB - 是把整个内存数据以二进制方式写入磁盘

    • 对应数据文件为 dump.rdb
    • 恢复速度快
      • AOF,以命令为单位,通过执行一条条命令来进行数据恢复,速度慢。
      • RDB,恢复时,直接将磁盘中的数据文件加载到内存中即可。
  • 相关命令有两个

    • save - 在主进程执行,会阻塞其它命令
    • bgsave - 创建子进程执行,避免阻塞,是默认方式
      • 子进程不会阻塞主进程,但创建子进程的期间,仍会阻塞,内存越大,阻塞时间越长
      • bgsave 也是利用了快照机制,执行 RDB 持久化期间如果有新数据写入,新的数据修改发生在主进程,子进程向 RDB 文件中写入还是旧的数据,这样新的修改不会影响到 RDB 操作
      • 但这些新数据不会补充至 RDB 文件(两次快照之间宕机了,会丢失数据)
  • 缺点: 可以通过调整 redis.conf 中的 save 参数来控制 rdb 的执行周期,但这个周期不好把握

    • 频繁执行的话,会影响性能
    • 偶尔执行的话,如果宕机又容易丢失较多数据
    save 900 1      -- 900秒内至少有一个改动
    save 300 10		-- 300秒内至少有10个改动
    save 60 10000	-- 60秒内至少有10000个改动
    

混合持久化

  • 从 4.0 开始,Redis 支持混合持久化,即使用 RDB 作为全量备份两次 RDB 之间使用 AOF 作为增量备份

    • 配置项 aof-use-rdb-preamble 用来控制是否启用混合持久化,默认值 no

      • aof-use-rdb-preamble yes
        
    • 持久化时将数据都存入 AOF 日志,日志前半部分为二进制的 RDB 格式后半部分是 AOF 命令日志

    • 下一次 RDB 时,会覆盖之前的日志文件

  • 优缺点

    • 结合了 RDB 与 AOF 的优点,恢复速度快,增量用 AOF 表示,数据更完整(取决于同步策略)、也无需 AOF 重写
    • 与旧版本的 redis 文件格式不兼容

标签:AOF,aof,博学,超强,Redis,内存,RDB,日志,重写
From: https://www.cnblogs.com/Azureblue/p/16865148.html

相关文章

  • CentOS 7.9 Redis 设置开机自启动
    CentOS7.9Redis设置开机自启动 1、创建Redis的开机自启动文件在/etc/systemd/system/目录下创建redis.service文件,并加入如下内容:[Unit]Description=redis-......
  • redis集群的弱一致性
    Redis集群不能保证强一致性。一些已经向客户端确认写成功的操作,会在某些不确定的情况下丢失。产生写操作丢失的第一个原因,是因为主从节点之间使用了异步的方式来同步数据......
  • redis的rdb与aof
    Redis持久化提供了多种不同级别的持久化方式:RDB持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-timesnapshot)。AOF持久化记录服务器执行的所有写操作......
  • 史上最详细Docker安装Redis (含每一步的图解)实战
    不仅教你安装,还教你删除。每一行命令都带图解,绝对能懂。大家对搭建RedisClustr(Redis集群)感兴趣的,可以看看这篇文章Docker搭建RedisCluster集群环境希望对大家有所......
  • Redis集群介绍
    什么是集群能够对外提供相同服务的多台服务器组成的集合。为什么要建立集群1.从可用性角度考虑,如果只有一台机器提供服务,一旦出现故障,那么整个服务不可用。2.从容量角......
  • 【博学谷学习记录】超强总结,用心分享|狂野架构kafka消费者分配策略
    消费者分配策略一个consumergroup中有多个consumer,一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定哪个partition由哪个consumer来消费,Kafka提供了......
  • 【博学谷学习记录】超强总结,用心分享 。分布式缓存
    分布式缓存--基于Redis集群解决单机Redis存在的问题单机的Redis存在四大问题:1.数据丢失问题:实现Redis数据持久化2.并发能力问题:搭建主从集群,实现读写......
  • OpenEuler2203 基于容器和本地文件部署Redis Cluster的过程以及简单性能测试
    背景其实文件搭建和集群搭建没有任何区别这次用先用容器搭建出来,然后测试一下性能想着再使用本地部署的方式搭建一下.两项验证容器和基于文件的搭建的性能差异部分资......
  • docker实战教程(十五):docker上安装redis
    简单版从dockerhub上拉取redis镜像到本地(指定版本为6.0.8)运行redis容器进入redis环境这样安装同样存在数据和配置文件的问题复杂版在Centos宿主机下新建目录/app......
  • pycharm操作redis
    安装在终端环境下输入:pipinstallredispycharm操作redis之普通连接#1.导入模块fromredisimportRedis#2.实例化产生链接对象conn=Redis()#连接本地的redi......