我是靠谱客的博主 鲤鱼野狼,最近开发中收集的这篇文章主要介绍Redis学习---持久化机制一. 快照(Snapshot)二. AOF只追加日志文件四. 持久化总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Redis持久化机制

  • 一. 快照(Snapshot)
    • 1. 快照特点
    • 2.快照生成方式
      • 1.客户端方式之BGSAVE
      • 2.客户端方式之SAVE
      • 3.服务器配置方式之满足配置自动触发
      • 4.服务器接收客户端shutdown指令
    • 3.配置生成快照名称和位置
      • 1.修改生成快照名称
      • 2.修改生成位置
  • 二. AOF只追加日志文件
    • 1.AOF特点
    • 2.开启AOF持久化
    • 3.日志追加频率
      • 1.always 【谨慎使用】
      • 2.everysec 【推荐】
      • 3.no 【不推荐】
    • 三. AOF文件的重写
      • 1.客户端BGREWRITEAOF触发重写
      • 2.服务器配置方式自动触发
      • 3. 重写原理
      • 4. 重写流程
  • 四. 持久化总结

一. 快照(Snapshot)

1. 快照特点

  • 快照可以将某一时刻的所有数据都写入硬盘中,当然这也是Redis的默认开启持久化方式,保存的文件默认是dump.rdb文件,因此这种方式也称之为RDB方式。

这里看一下bin目录下生成的dump.rdb文件,这就是快照生成的
在这里插入图片描述

2.快照生成方式

我们删除现存的快照文件,rm -rf dump.rdb

  1. 客户端方式: BGSAVE 和 SAVE指令
    在这里插入图片描述

1.客户端方式之BGSAVE

  • 客户端Redis-Cli可以使用BGSAVE命令来创建一个快照,当接收到客户端的BGSAVE命令时,redis会调用fork来创建一个子进程,然后子进程负责将快照写入磁盘中,而父进程则继续处理命令请求。

这里看一下BGSAVE执行流程图,它和SAVE差别还是挺大的

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.客户端方式之SAVE

  • 客户端还可以使用SAVE命令来创建一个快照,接收到SAVE命令的redis服务器在快照创建完毕之前将不再响应任何其他的命令

SAVE的执行流程图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意: SAVE命令并不常用,使用SAVE命令在快照创建完毕之前,redis处于阻塞状态,无法对外服务

3.服务器配置方式之满足配置自动触发

  • 如果用户在redis.conf中设置了save配置选项,redis会在save选项条件满足之后自动触发一次BGSAVE命令,如果设置多个save配置选项,当任意一个save配置选项条件满足,redis也会触发一次BGSAVE命令。

在这里插入图片描述

4.服务器接收客户端shutdown指令

  • 当redis通过shutdown指令接收到关闭服务器的请求时,会执行一个save命令,阻塞所有的客户端,不再执行客户端执行发送的任何命令,并且在save命令执行完毕之后关闭服务器
    在这里插入图片描述

3.配置生成快照名称和位置

1.修改生成快照名称

dbfilename dump.rdb

2.修改生成位置

dir ./

在这里插入图片描述

二. AOF只追加日志文件

1.AOF特点

  • 这种方式可以将所有客户端执行的写命令记录到日志文件中,AOF持久化会将被执行的写命令写到AOF的文件末尾,以此来记录数据发生的变化,因此只要redis从头到尾执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件的记录的数据集.

2.开启AOF持久化

  • 在redis的默认配置中AOF持久化机制是没有开启的,需要在配置中开启

开启AOF持久化

    修改 appendonly yes 开启持久化
    修改 appendfilename "appendonly.aof" 指定生成文件名称

在这里插入图片描述

3.日志追加频率

追加频率就只有这三个值可以修改,谨慎修改
在这里插入图片描述

1.always 【谨慎使用】

  • 说明: 每个redis写命令都要同步写入硬盘,严重降低redis速度
  • 解释: 如果用户使用了always选项,那么每个redis写命令都会被写入硬盘,从而将发生系统崩溃时出现的数据丢失减到最少,这种同步策略需要对硬盘进行大量的写入操作,所以redis处理命令的速度会受到硬盘性能的限制。
  • 警告: 使用固态硬盘(SSD) 用户请谨慎使用always选项,这种模式不断写入少量数据的做法有可能会引发严重的写入放大问题,导致将固态硬盘的寿命从原来的几年降低为几个月。

2.everysec 【推荐】

  • 说明: 每秒执行一次同步显式的将多个写命令同步到磁盘
  • 解释: 为了兼顾数据安全和写入性能,用户可以考虑使用everysec选项,让redis每秒一次的频率对AOF文件进行同步;redis每秒同步一次AOF文件时性能和不使用任何持久化特性时的性能相差无几,而通过每秒同步一次AOF文件,redis可以保证,即使系统崩溃,用户最多丢失一秒之内产生的数据。

3.no 【不推荐】

  • 说明: 由操作系统决定何时同步
  • 解释:最后使用no选项,将完全有操作系统决定什么时候同步AOF日志文件,这个选项不会对redis性能带来影响但是系统崩溃时,会丢失不定数量的数据,另外如果用户硬盘处理写入操作不够快的话,当缓冲区被等待写入硬盘数据填满时,redis会处于阻塞状态,并导致redis的处理命令请求的速度变慢。

三. AOF文件的重写

  1. AOF带来的问题
  • AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件Redis提供了AOF重写(ReWriter)机制。
  1. AOF重写
  • 用来在一定程度上减小AOF文件的体积
  1. 触发重写方式

1.客户端BGREWRITEAOF触发重写

  • 执行BGREWRITEAOF命令 不会阻塞redis的服务

    在这里插入图片描述

2.服务器配置方式自动触发

  1. 配置redis.conf中的auto-aof-rewrite-percentage选项
    在这里插入图片描述
  • 如果设置auto-aof-rewrite-percentage值为100和auto-aof-rewrite-min-size 64mb,并且启用的AOF持久化时,那么当AOF文件体积大于64M,并且AOF文件的体积比上一次重写之后体积大了至少一倍(100%)时,会自动触发,如果重写过于频繁,用户可以考虑将auto-aof-rewrite-percentage设置为更大

3. 重写原理

  1. 注意:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的文件这点和快照有点类似。

4. 重写流程

  1. redis调用fork,现在有父子两个进程 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
  2. 父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
  3. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
  4. 现在父进程可以使用临时文件替换老的AOF文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

在这里插入图片描述

四. 持久化总结

  1. 两种持久化方案既可以同时使用(aof),又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。

  2. 无论使用AOF还是快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。

最后

以上就是鲤鱼野狼为你收集整理的Redis学习---持久化机制一. 快照(Snapshot)二. AOF只追加日志文件四. 持久化总结的全部内容,希望文章能够帮你解决Redis学习---持久化机制一. 快照(Snapshot)二. AOF只追加日志文件四. 持久化总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部