zoukankan      html  css  js  c++  java
  • redis持久化

      redis是一个内存数据库,为了保证数据的持久性,它提供了三种持久化方式:RDB、AOF、混合持久化模式(4.0增加,5.0默认开启)

    一、RDB

      RDB是redis默认采用的持久化方式,其是通过快照完成的,当符合一定的条件时,redis会自动将内存中的数据进行快照并持久化到硬盘。

      1、触发RDB快照的时机:

        符合指定配置的快照规则

        执行save或bgsave命令

        执行flushall

        执行主从复制操作

      2、设置快照规则及配置

        save 多少秒内   数据变了多少

        save "":不使用RDB存储

    #15分钟内至少有一个键被更改则进行快照
    save 900 1
    #5分钟内至少有10个键被更改则进行快照
    save 300 10
    #1分钟内至少有10000个键被更改则进行快照
    save 60 10000
    #rdb文件名
    dbfilename dump.rdb
    #rdb快照文件存放路径
    dir ./

      3、RDB快照的实现原理及过程

      (1)redis调用系统中的fork函数复制一份当前进程的副本

      (2)父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入磁盘中的临时文件

      (3)当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。

      4、RDB的优缺点

        缺点:使用RDB方式实现持久化,一旦redis异常退出,则会丢失最后一次快照之后的数据。

        优点:RDB可以最大化redis的性能,父进程在北村RDB文件时唯一要做的就是fork出来一个子进程,然后由子进程来处理接下来的保存工作,父进程无需执行任何IO操作,同时这也是一个缺点,如果数据集比较大时,fork可能也比较耗时,可能会造成服务器在一段时间内停止处理客户端请求。

    二、AOF

      默认情况下redis是没有开启AOF方式的持久化。

      开启持久化后,每执行一条更改redis中数据的命令,redis就会将该命令写入磁盘中的AOF文件,这一过程会降低Redis的性能,但大部分情况下这个影响是可以接受的,另外使用较快的磁盘也可以提高AOF的性能。

    #开启aof
    appendonly yes
    #设置aof文件名称
    appendfilename "appendonly.aof"
    #文件存储路径 RDB和AOF使用的同一个目录参数
    dir ./

      redis在每一次该更数据的时候, aof机制都会将数据记录到aof文件中,但实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入了硬盘缓存,再通过硬盘缓存机制去刷新并保存到文件中。

    # 每次执行写入都会进行同步,这个是最安全但是又是效率最低的方式
    # appendfsync always
    # 每一秒执行一次(默认)
    appendfsync everysec
    # 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
    # appendfsync no

      AOF重写原理(优化AOF文件)

      redis可以在AOF文件体积变得过大时,自动的在后台对AOF进行重写,重写后的AOF文件包含了回复当前数据集所需的最小命令集合。例如对同一个key做了多次赋值,那么只保留最后一次赋值操作等。

    三、如何选择RDB和AOF

      如果是作为数据库,则需要使用 RDB + AOF,这样数据极少会丢失

      如果是缓存服务器,则只需要开启RDB

      不建议只使用AOF(性能差)

      进行数据恢复时,先恢复RDB再回复AOF

      如何选择RDB和AOF是redis4.0之前需要考虑的,在redis4.0之后,redis提供了混合持久化方式。

    四、混合持久化方式

      redis4.0之后新增了混合持久化方式,该方式结合了RDB和AOF的优点,在写入时,先把当前的数据以RDB的形势写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证redis重启时的速度,又能降低数据丢失的风险。

      查询是否开启混合模式可以使用config get aof-use-rdb-preamble命令

    127.0.0.1:6379> config get aof-use-rdb-preamble
    1) "aof-use-rdb-preamble"
    2) "yes"

      如果出现yes表示已开启混合持久化,no表示关闭,redis5.0默认开启,如果是其他版本则需要检查一下,如果是关闭的,可以使用命令行开启或通过修改redis配置文件开启两种方式。

     (1)通过命令开启

    config set aof-use-rdb-preamble yes

     (2)通过修改redis配置文件开启

    aof-use-rdb-preamble yes

      如果通过命令开启,如果重启redis就会失效;如果通过修改redis配置文件变更,需要重启redis才能生效。

    ------------------------------------------------------------------
    -----------------------------------------------------------
    ---------------------------------------------
    朦胧的夜 留笔~~
  • 相关阅读:
    RecyclerView 源码分析(一) —— 绘制流程解析
    sqlserver outer join
    获取最后一个标签 xpath
    pytesseract
    pytesseract代码优化
    sql server recursion
    sql
    sql server
    mssql乱码问题
    SQL
  • 原文地址:https://www.cnblogs.com/liconglong/p/14322527.html
Copyright © 2011-2022 走看看