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

    
    

    什么是持久化?

    用一句话概括持久化: 将数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中, 或者存储在磁盘文件中。

    从应用层与系统层理解持久化

    应用层: 如果关闭你的应用然后重新启动则先前的数据依然存在。

    系统层: 如果关闭你的系统(电脑) 然后重启则先前的数据依然存在。

    Redis 为什么要持久化?

    Redis 中的数据类型都支持push/pop, add/remove 及取交集和差集及更丰富的操作, 而且这些操作都是原子性(Atomic)的。在此基础上, Redis支持各种不同方式的排序。与Memcached一样,为了保证效率, 数据都是缓存在内存中的。为了能够长期保存, 就要将Redis放在缓存中的数据做持久化存储。

    Redis实现持久化的方式

    1. RDB快照持久化(Redis DataBase {SnapShoting})

    工作原理: 把当前内存中的数据集写入磁盘(Snapshot 快照 数据库中所有键值对数据)。 恢复时是将快照文件直接读到内存中。

    RDB的两种触发方式: 自动触发和手动触发。

    (1). 自动触发

    [1]. save

    配置参数: save _ _

    第一格为秒数, 第二格为发生变化的key的数量

    save 900 1: 900 秒(15分钟)内有一个key发生变化, 就执行快照 ---> RDB

    save 300 10: 300秒(5分钟)内有10个key发生变化, 就执行快照 ---> RDB

    save 60 10000: 60秒内有10000个key发生变化, 就执行快照 ---> RDB

    [2]. stop-writes-on-bgsave-error yes 表示rdb写进程执行失败的时候, 停止写入新的数据

    [3]. rdbcompression yes 是否压缩rdb, 默认为yes, redis会采用LZFSE算法(苹果开源的压缩算法, C语言实现)进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。

    LZFSE算法详情请见: https://blog.csdn.net/u012319493/article/details/83653860

    [4]. rdbchecksum: 默认为yes。 存储快照后, 可以让redis使用CRC(Cyclic Redundancy Check 循环冗余校验)64算法来进行数据校验, 但是会增加大概10%的性能消耗, 如果希望获取到最大的性能提升, 请关闭此功能。

    [5].dbfilename: 设置快照的文件名, 默认为dump.rdb

    [6]. dir: 设置快照文件的存放路径, 这个配置项一定是个目录, 而不能是文件名。默认和当前配置文件保存在统一目录, 文件名由配置的 dbfilename 决定。

    (2). 手动触发

    [1]. save

    该命令会阻塞当前Redis服务器, 执行save命令期间, Redis不能处理其他命令, 直到RDB过程完成为止。

    [2]. bgsave

    执行该命令时, Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程, RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段, 一般时间很短。

    基本上 Redis内部所有的RDB操作都是采用bgsave命令。

    1. AOF(Append Only File)

    工作原理: 把写操作指令,持续的写到一个类似日志文件里。(类似于从postgresql等数据库导出sql一样,只记录写操作)粒度较小,crash之后,只有crash之前没有来得及做日志的操作没办法恢复。

    AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)

    AOF重写: 执行 BGREWRITEAOF 命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。

    AOF容错: 服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。

    RDB 和 AOF 之间的相互作用:
    在版本号大于等于 2.4 的 Redis 中, BGSAVE 执行的过程中, 不可以执行 BGREWRITEAOF 。 反过来说, 在 BGREWRITEAOF 执行的过程中, 也不可以执行 BGSAVE 。
    这可以防止两个 Redis 后台进程同时对磁盘进行大量的 I/O 操作。
    如果 BGSAVE 正在执行, 并且用户显示地调用 BGREWRITEAOF 命令, 那么服务器将向用户回复一个 OK 状态, 并告知用户, BGREWRITEAOF 已经被预定执行: 一旦 BGSAVE 执行完毕, BGREWRITEAOF 就会正式开始。当 Redis 启动时, 如果 RDB 持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集, 因为 AOF 文件所保存的数据通常是最完整的。

    Redis数据备份

    Redis 对于数据备份是非常友好的, 因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 原子地用临时文件替换原来的 RDB 文件。这也就是说, 无论何时, 复制 RDB 文件都是绝对安全的。

  • 相关阅读:
    day7 面向对象 静态方法 类方法 属性方法 类的特殊成员方法 元类 反射 异常处理
    day6 面向对象 封装 继承 多态 类与实例在内存中的关系 经典类和新式类
    day5 time datetime random os sys shutil json pickle shelve xml configparser hashlib subprocess logging re正则 python计算器
    kafka常用操作命令
    linux基础
    django学习1——初识web应用程序
    mysql数据库(三)——pymysql模块
    mysql数据库(二)——表的查询
    mysql数据库(一)
    Python常用模块——re模块
  • 原文地址:https://www.cnblogs.com/ronnieyuan/p/11482709.html
Copyright © 2011-2022 走看看