redis持久化
什么是持久化?
用一句话概括持久化: 将数据保存到可永久保存的存储设备中。持久化的主要应用是将内存中的对象存储在数据库中, 或者存储在磁盘文件中。
从应用层与系统层理解持久化
应用层: 如果关闭你的应用然后重新启动则先前的数据依然存在。
系统层: 如果关闭你的系统(电脑) 然后重启则先前的数据依然存在。
Redis 为什么要持久化?
Redis 中的数据类型都支持push/pop, add/remove 及取交集和差集及更丰富的操作, 而且这些操作都是原子性(Atomic)的。在此基础上, Redis支持各种不同方式的排序。与Memcached一样,为了保证效率, 数据都是缓存在内存中的。为了能够长期保存, 就要将Redis放在缓存中的数据做持久化存储。
Redis实现持久化的方式
- 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命令。
- 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 文件都是绝对安全的。