Redis--RDB和AOF

Redis--RDB和AOF

  1. 提出问题
    假设我们要将内存中的数据持久化到硬盘中,而这个过程需要10分钟,该怎么做?
    1. 使用阻塞的方式:在持久化过程中停止服务直到持久化完毕。这个方法在开发和维护项目时是可行的,但在项目上线后显然不合适
    2. 不使用阻塞的方式:服务正常运行的同时向硬盘中写数据,但这显然会带来数据时点混乱的问题,如下图所示。因此,在Redis中,提供了RDB和AOF两种方式保证持久化时数据的一致性。
      在这里插入图片描述
  2. RDB持久化方式
    1. 核心机制
      1. linux中子线程间数据相互隔离
      2. linux中的fork()函数
      3. linux中的copy on write 写时复制机制
    2. 实现原理
      1. 在持久化开始时,父进程调用fork()函数创建一个用于持久化的子进程,使用另一个服务子进程正常提供服务,持久化子进程仅复制所有指向数据的指针,之后开始往硬盘中持久化数据,当数据修改时,仅修改服务子进程的指针,过程如下图所示
        在这里插入图片描述
        在这里插入图片描述
    3. 优点
      1. 由于几乎所有操作都通过指针来完成,所以RDB方式不仅速度快,而且占用内存小
      2. RDB持久化数据的方式类似于Java中的序列化,所以恢复数据也相对较快
    4. 缺点
      1. 不支持拉链,只有一个dump.rdb
      2. 丢失数据相对多一些,时点与时点之间窗口数据容易丢失,8得到一个rdb,9点刚要落一个rdb,服务器挂机了
    5. 手动触发RDB持久化
      1. 使用save指令:阻塞式持久化
      2. 使用bgsave指令:上面所讲的持久化方式
    6. 配置自动触发RDB持久化
      1. vi /etc/redis/6379.conf,找到如下配置
        在这里插入图片描述
        • 服务器在 60 秒之内,对数据库进行了至少 10000 次修改,bgsave执行
        • 服务器在 300 秒之内,对数据库进行了至少 10 次修改,bgsave执行
        • 服务器在 900 秒之内,对数据库进行了至少 1 次修改,bgsave执行
  3. AOF持久化方式
    1. 使用类似MySQL中binlog日志的方式记录数据,在 redis 4.0 版本以前和 redis 4.0 版本以后有不同的机制
    2. 4.0版本以前:一直往日志文件中添加数据,在需要重写时,在内核完成重复命令的抵消,并将数据保存到一个新的日志文件中
    3. 4.0版本以后:先通过RDB方式将旧数据写入到AOF日志文件中,执行此过程时会在内存中完成重复命令的抵消,之后再用以前的方式往日志文件中添加数据,即兼顾了RDB的快又保留了AOF的全量!
    4. 优点:保证数据完整,但依旧有可能造成0-4k数据的丢失(取决于配置文件中的flush时机)
    5. 缺点:日志文件体量无限变大;恢复数据较慢
  4. RDB持久化文件与AOF持久化文件都存储在 /var/lib/redis/6379 目录中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值