zoukankan      html  css  js  c++  java
  • Redis持久化的方式

    分为:
    • RDB持久化:二进制格式,save/bgsave 命令产生。
    • AOF持久化:客户端命令,追加写入,文件大。

    一、RDB持久化

    1、什么是RDB持久化

    英文名称是 Redis DataBase,它还有一个常用的名字:快照持久化。所谓快照,在这里指的是某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘里。

    2、手动触发机制

    (1)save 命令
    手动执行 save 命令产生 RDB 持久化数据文件。
     
    但是,因为 Redis 对于客户端的命令时串行执行的,所以当执行 save 命令时,因为执行时间较长,会堵塞其它命令的执行。不推荐在线上环境使用。
     
    (2)bgsave 命令
    与 save 不同的是,执行过程中它并不会阻塞客户端的请求。而是将持久化工作交给子进程来执行,主进程仍负责客户端请求的处理工作。

    3、自动触发机制

    自动触发通常是 Redis 中配置文件来执行的。有这么个配置你需要了解下:
    save m n
    其中 m 代表秒数,n 代表次数,放在一起表示的是 m 秒内发生 n 次变化时,会触发 bgsave。
     
    了解了自动化配置,我们再来看下 Redis 配置文件 redis.conf 中的三个配置项:
    save 900 30
    save 500 10
    save 200 1
    `save 900 30` 表示的是时间900秒内,如果 Redis 中数据发生了 30 次变化,就会执行 bgsave。后边两个就不用介绍了,一样的原理。
    看到这三个配置项,不知道你会不会有疑问,这三个到底该执行哪一个?答案是设置多个 save m n 命令时,满足任何一个条件都会触发持久化,可以理解为或关系。

    4、RDB 文件恢复

    当 Redis 服务器重启时,在数据目录(dir 的配置值)下检测到 dump.rdb 文件后,会自动加载进行数据恢复。

    二、AOF持久化

    1、什么是AOF持久化

    与 RDB 不同的是,它保存的数据格式是客户端发送的命令。

    2、AOF实现方式

    想要使用 AOF 持久化方式,需要启用配置文件中的 appendonly 参数。默认情况下,Redis 是不开启的。
    appendonly yes
    开启 AOF 持久化后每执行一条修改数据的命令,Redis 就会将该命令写入 aof_buf 缓冲区。后续写入 AOF 文件中的操作是由下面的配置来控制的:
    appendonly always # 每次写入都进行刷盘操作,对性能影响最大,占用磁盘 IO 较高,数据安全性最高。
    appendonly everyesc # 1秒刷一次盘,对性能影响相对较小。
    appendonly no # 按照操作系统的机制进行刷盘,对性能影响最小,数据安全性低。

    3、AOF 重写机制

    随着命令的不断写入,AOF 文件会变得越来越大,这时候该如何是好呢?别急,Redis 中提供了瘦身功能,也就是重写机制。
    Redis 配置文件中有两个对应的参数是来决定重写机制的触发时机的。
    auto-aof-rewrite-precentage 100 # AOF 文件距离上次文件增长超过多少百分比
    auto-aof-rewrite-min-size 64mb # AOF 文件体积最小多大以上触发
    满足所设置的条件时,会自动触发 AOF 重写,此时 Redis 会扫描整个实例的数据,重新生成一个 AOF 文件来达到瘦身的效果。

    4、AOF 文件恢复

    和 RBD 不同的是,Redis 中是通过创建一个不带网络连接的伪客户端来进行实现的。
     
    注意:如果服务器开启了 AOF 持久化功能,会优先使用 AOF 文件来进行恢复。只有在 AOF 关闭状态下,服务器才会使用 RDB 文件来进行恢复。

    三、两种持久化的优/缺点

    1、RDB

    优点:
    • 备份文件小,恢复快。
    缺点:
    • 备份时间间隔大,服务宕机会丢失很多数据。

    2、AOF

    优点:
    • 顶多丢失1秒的数据,使用追加方式写入文件,速度快。
    • 可读性强,易于修改命令。
    缺点:
    • 文件体积大。
    • 恢复速度慢。

    四、混合持久化

    既然 RDB 与 AOF 持久化都存在各自的缺点,那么有没有一种更好的持久化方式?
    接下来要介绍的是混合持久化。其实就是 RDB 与 AOF 的混合模式,这是 Redis4 之后新增的。

    1、持久化方式

    混合持久化是通过 aof-use-rdb-preamble 参数来开启的。它的操作方式是这样的,在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。这样既能保证数据恢复时的速度,同时又能减少数据丢失的风险。

    2、文件恢复

    那么混合持久化中是如何来进行数据恢复的呢?在 Redis 重启时,先加载 RDB 的内容,然后再重放增量 AOF 格式命令。这样就避免了 AOF 持久化时的全量加载,从而使加载速率得到大幅提升。

    五、总结

    1、RDB持久化

    将某一时刻的数据以二进制形式写入到磁盘里,服务重启时检测到对应文件自动加载进行数据恢复。
    有手动触发和自动触发两种机制。

    2、AOF持久化

    以文件追加的方式写入客户端执行的写命令。
    数据恢复时,通过创建伪客户端的方式执行命令,直到恢复完成。

    3、混合持久化

    在写入的时候先把数据以 RDB 的形式写入文件的开头,再将后续的写命令以 AOF 的格式追加到文件中。 
    ------------------------------我是博客签名------------------------------
    座右铭:不要因为知识简单就忽略,不积跬步无以至千里。
    版权声明:自由转载-非商用-非衍生-保持署名。
    本作品采用知识共享署名 4.0 国际许可协议进行许可。
    ----------------------------------------------------------------------
  • 相关阅读:
    C# winfrom ListView控件实现自由设置每一行字体及背景色等
    VS2017Enterprise版本安装ImageWatch 2017问题解决
    C++ 对于函数名的操作,函数名本身和取*以及取&的区别
    C++数组和指针
    相机像素和显示分辨率
    (最简单详细)IronPython下载、安装及简单使用
    DataRow修改某一Cell的值
    DataGridView控件绑定数据之后,置顶操作
    DataGridVIew控件绑定数据之后的,增、插、删操作
    毕向东java基础课学习笔记4——标识符、常量、变量
  • 原文地址:https://www.cnblogs.com/wuqinglong/p/14463879.html
Copyright © 2011-2022 走看看