• Redis持久化的两种方式


    什么是Redis持久化?

    因为redis是内存里的数据库,将redis中的数据保存到硬盘里就是持久化。以便在重启机器、机器故障之后恢复数据。

    Redis支持两种不同的持久化操作:

    1. 快照(snapshotting,RDB)

    2. 只追加文件(append-only file,AOF)

    快照(RDB)持久化

    Redis可以通过创建快照来获得存储在内存里面的数据在某个时间点上的副本。Redis创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis主从结构,主要用来提高Redis性能),还可以将快照留在原地以便重启服务器的时候使用。

    Redis默认采用的是快照

    redis.conf配置文件中默认以下配置:

    1. ​save 900 1     #在900秒(15分钟)之后,如果至少有1key发生变化,Redis就会自动触发BGSAVE命令创建快照。
    2. save 300 10      #在300秒(5分钟)之后,如果至少有10key发生变化,Redis就会自动触发BGSAVE命令创建快照。
    3. save 60 10000    #在60秒(1分钟)之后,如果至少有10000key发生变化,Redis就会自动触发BGSAVE命令创建快照。

    根据配置,快照将被写入dbfilename选项指定的文件里面,并存储在dir选项指定的路径上面。如果在新的快照文件创建完毕之前,Redis、系统或者硬件这三者中的任意一个崩溃了,那么Redis将丢失最近一次创建快照写入的所有数据。

    创建快照的办法有如下几种:

    1.BGSAVE命令: 客户端向Redis发送 BGSAVE命令 来创建一个快照。对于支持BGSAVE命令的平台来说(基本上所有平台支持,除了Windows平台),Redis会调用fork来创建一个子进程,然后子进程负责将快照写入硬盘,而父进程则继续处理命令请求。

    2.SAVE命令: 客户端还可以向Redis发送 SAVE命令 来创建一个快照,接到SAVE命令的Redis服务器在快照创建完毕之前不会再响应任何其他命令。SAVE命令不常用,我们通常只会在没有足够内存去执行BGSAVE命令的情况下,又或者即使等待持久化操作执行完毕也无所谓的情况下,才会使用这个命令。

    3.save选项: 如果用户设置了save选项(一般会默认设置),比如 save 60 10000,那么从Redis最近一次创建快照之后开始算起,当“60秒之内有10000次写入”这个条件被满足时,Redis就会自动触发BGSAVE命令。

    4.SHUTDOWN命令: 当Redis通过SHUTDOWN命令接收到关闭服务器的请求时,或者接收到标准TERM信号时,会执行一个SAVE命令,阻塞所有客户端,不再执行客户端发送的任何命令,并在SAVE命令执行完毕之后关闭服务器。

    5.一个Redis服务器连接到另一个Redis服务器: 当一个Redis服务器连接到另一个Redis服务器,并向对方发送SYNC命令来开始一次复制操作的时候,如果主服务器目前没有执行BGSAVE操作,或者主服务器并非刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE命令。

    如果系统真的发生崩溃,用户将丢失最近一次生成快照之后更改的所有数据。因此,快照持久化只适用于即使丢失一部分数据也不会造成一些大问题的应用程序。不能接受这个缺点的话,可以考虑AOF持久化。

    AOF(只追加文件)持久化

    与快照持久化相比,AOF持久化 的实时性更好,因此已成为主流的持久化方案。默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:

    appendonly yes

    开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof。

    AOF在Redis的配置文件的三种同步方式
    1. appendfsync always   #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
    2. appendfsync everysec #每秒钟同步一次,显示地将多个写命令同步到硬盘
    3. appendfsync no     #让操作系统决定何时进行同步

    1.appendfsync always 可以实现将数据丢失减到最少,不过这种方式需要对硬盘进行大量的写入而且每次只写入一个命令,十分影响Redis的速度。另外使用固态硬盘的用户谨慎使用appendfsync always选项,因为这会明显降低固态硬盘的使用寿命。

    2.appendfsync everysec选项 ,让Redis每秒同步一次AOF文件,Redis性能几乎没受到任何影响。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。当硬盘忙于执行写入操作的时候,Redis会放慢自己的速度以便适应硬盘的最大写入速度。为了兼顾数据和写入性能,一般多考虑使用该选项

    3.appendfsync no 选项一般不推荐,这种方案会使Redis丢失不定量的数据而且如果用户的硬盘处理写入操作的速度不够的话,那么当缓冲区被等待写入的数据填满时,Redis的写入操作将被阻塞,这会导致Redis的请求速度变慢。

    虽然AOF持久化非常灵活地提供了多种不同的选项来满足不同应用程序对数据安全的不同要求,但AOF持久化也有缺陷——AOF文件的体积太大。

    重写AOF

    AOF虽然在某个角度可以将数据丢失降低到最小而且对性能影响也很小,但是极端的情况下,体积不断增大的AOF文件很可能会用完硬盘空间。另外,如果AOF体积过大,那么还原操作执行时间就可能会非常长。

    为了解决AOF体积过大的问题,用户可以向Redis发送 BGREWRITEAOF命令 ,这个命令会通过移除AOF文件中的冗余命令来重写(rewrite)AOF文件来减小AOF文件的体积。BGREWRITEAOF命令和BGSAVE创建快照原理十分相似,所以AOF文件重写也需要用到子进程,这样会导致性能问题和内存占用问题,和快照持久化一样。更糟糕的是,如果不加以控制的话,AOF文件的体积可能会比快照文件大好几倍。

    文件重写流程:

    和快照持久化可以通过设置save选项来自动执行BGSAVE一样,AOF持久化也可以通过设置

    1. auto-aof-rewrite-percentage
    2. auto-aof-rewrite-min-size

    选项自动执行BGREWRITEAOF命令。

    例如:假设用户对Redis设置了如下配置选项并且启用了AOF持久化。那么当AOF文件体积大于64mb,并且AOF的体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行BGREWRITEAOF命令。

    1. auto-aof-rewrite-percentage 100  
    2. auto-aof-rewrite-min-size 64mb

    在实际应用中,保证数据不会丢失非常重要!将数据持久化到硬盘上是很必要的。

    除了进行持久化外,在实际中还必须对持久化得到的文件进行备份(最好是备份到不同的地方),这样才能尽量避免数据丢失事故发生。如果条件允许的话,最好能将快照文件和重新重写的AOF文件备份到不同的服务器上面。

  • 相关阅读:
    元学习在小样本学习任务中的应用
    MySQL group by后取每个分组中最新一条数据
    【技术美术实践部分】Unity Shader:学习顶点/片元着色器
    LeetCode 0213. 打家劫舍 II:动动态规划
    R 语言 | 自定义R中的管道符 `%>>2%`
    《微服务架构设计模式》之三:微服务架构中的进程通信
    AcWing 827. 双链表
    【2023美团后端-8】删除字符串的方案,限制不能连续删
    gazebo中给机器人添加16线激光雷达跑LIO-SAM
    CMS指纹识别
  • 原文地址:https://blog.csdn.net/Jilit_jilit/article/details/136585762