1. 为什么要持久化

Redis是基于内存存储的数据库,如果遇到服务重启或者崩溃,内存中的数据将会被清空。所以为了确保数据安全性和可靠性,我们需要将内存中的数据持久化到磁盘上。

持久化不仅可以防止由于系统故障、重启或者其他原因导致的数据丢失。还可以用于备份、数据恢复和迁移等操作。

2. Redis持久化机制概述

Redis提供了两种主要的持久化机制:RDB持久化和AOF持久化。此外,还可以采用混合持久化(RDB + AOF)的方式,将这两种持久化方式结合在一起。下面我们简要概述这些持久化机制。

2.1 RDB持久化

RDB(Redis DataBase)持久化是一种基于快照的持久化方式。在指定的时间间隔内,如果满足一定条件(如某段时间内发生的写操作次数),Redis会生成一个包含当前内存数据的RDB文件。这个RDB文件可以用于数据恢复或备份。RDB持久化提供了较高的数据压缩率和快速的数据加载速度,但可能存在一定程度的数据丢失。

2.2 AOF持久化

AOF(Append Only File)持久化是一种基于日志的持久化方式。Redis将所有的写操作命令记录到一个AOF文件中。当Redis重新启动时,可以通过重放AOF文件中的命令来恢复数据。AOF持久化提供了更高的数据安全性,可以保证数据的完整性。然而,与RDB持久化相比,AOF文件通常较大,数据加载速度较慢。

2.3 混合持久化(RDB + AOF)

混合持久化结合了RDB持久化和AOF持久化的优点,可以在保证数据安全性的同时,提供较快的数据加载速度。在这种持久化方式下,Redis会同时生成RDB文件和AOF文件。当Redis重新启动时,优先使用AOF文件恢复数据,以确保数据的完整性。混合持久化适用于对数据安全性和性能要求较高的场景。

3. RDB持久化

3.1 RDB持久化原理

RDB持久化是基于快照的持久化,把当前时刻全量数据持久化到磁盘上,最终生成一个RBD文件。

3.2 RDB持久化触发方式

RDB持久化可以通过以下几种方式触发:

  1. 手动触发:使用SAVEBGSAVE命令。SAVE是同步命令,执行过程中会阻塞其他请求。BGSAVE是异步命令,主进程会forks一个子进程,进行异步持久化,持久化过程中主进程仍然可以处理其他请求。

  2. 自动触发:在配置文件中设置触发条件,redis.conf配置如下:

    # 900s内至少有一次写操作
    save 900 1
    # 300s内至少有1次写操作
    save 300 10
    # 60s内至少有10000次写操作
    save 60 10000
  3. 关闭Redis时触发:Redis在关闭服务时会自动触发一次RDB持久化。

  4. 主从同步时触发:当从节点连接到主节点时,主节点会触发一次RDB持久化,并将生成的RDB文件发送给从节点进行同步。

3.3 RDB持久化优缺点

RDB持久化具有以下优点:

  1. 高性能:由于采用子进程进行磁盘操作,主进程无需进行磁盘IO,保证了Redis的高性能。
  2. 快速恢复:RDB文件包含了某一时刻的完整数据快照,可以快速恢复数据。
  3. 更小的存储空间:RDB文件经过压缩,占用较小的磁盘空间。

RDB持久化的缺点包括:

  1. 数据丢失:由于RDB持久化是基于时间间隔的,可能存在一定程度的数据丢失。
  2. 子进程占用内存:在生成RDB文件过程中,子进程会占用和主进程相同的内存空间,可能导致内存不足的问题。

4. AOF持久化

4.1 AOF持久化原理

AOF(Append Only File)持久化是一种基于日志的持久化方式。Redis将所有的写操作命令追加到一个AOF文件中。当Redis重新启动时,可以通过重放AOF文件中的命令来恢复数据。

4.2 AOF持久化配置

AOF持久化的配置主要包括以下几个方面:

  1. 启用AOF持久化:在配置文件中设置appendonly yes

    # 开启aof持久化
    appendonly yes # aof文件名
    appendfilename "appendonly.aof"
  2. AOF文件同步策略:在配置文件中设置appendfsync选项。可选值包括:

    • always:每次写操作都同步到磁盘,保证最高的数据安全性,但性能较差。
    • everysec:每秒同步一次磁盘,提供较好的数据安全性和性能平衡。
    • no:由操作系统决定何时同步磁盘,性能最好,但数据安全性较差。
    # 持久化策略,always表示每次写入都进行持久化
    appendfsync always
  3. AOF重写策略:在redis.conf文件中进行配置,控制AOF重写的触发条件。

    # 指定在执行BGSAVE或BGREWRITEAOF命令时是否禁用AOF文件同步。默认为yes,表示禁用同步。
    no-appendfsync-on-rewrite yes # 定AOF文件大小增长到原始大小的百分比时进行重写。
    # 默认为100,表示AOF文件大小增长到原始大小的两倍时进行重写。
    auto-aof-rewrite-percentage 100 # 指定进行AOF重写的最小AOF文件大小。默认为64mb。
    auto-aof-rewrite-min-size 64

4.3 AOF重写(Rewrite)

随着写操作的不断进行,AOF文件会不断增长。为了减小AOF文件的大小,Redis提供了AOF重写功能。AOF重写会创建一个新的AOF文件,只包含当前内存中数据的最小命令集。在重写过程中,Redis会继续将新的写操作追加到原始AOF文件中。当重写完成后,新的AOF文件将替换原始AOF文件。

可以手动执行bgrewriteaof命令,触发AOF重写。

redis> bgrewriteaof

4.4 AOF持久化优缺点

AOF持久化具有以下优点:

  1. 更高的数据安全性:根据同步策略的选择,AOF持久化可以保证较高的数据安全性。
  2. 更好的容错性:即使AOF文件存在部分损坏,仍可以恢复大部分数据。

AOF持久化的缺点包括:

  1. 较大的存储空间:与RDB持久化相比,AOF文件通常较大,占用较多磁盘空间。
  2. 数据加载速度较慢:由于需要重放AOF文件中的命令,数据恢复速度相对较慢。

5. 混合持久化

RDB持久化加载速度快,AOF持久化数据更安全,有没有一种持久化方式结合两者的优点?

当然有,就是混合持久化。

5.1 混合持久化原理

Redis首先使用RDB持久化将内存中的数据快照存储到磁盘上,然后再使用AOF持久化将所有新的写操作追加到AOF文件中。这样做的好处是:

  1. 在系统崩溃时,可以通过RDB文件进行快速的恢复,而AOF文件可以用于恢复最近的修改。
  2. RDB持久化可以减少AOF文件的大小,从而减少磁盘空间的使用。
  3. 在RDB持久化中,Redis可以使用子进程来将快照写入磁盘,这样可以避免主进程的阻塞。

5.2 混合持久化优缺点

混合持久化具有以下优点:

  1. 高数据安全性:结合了AOF持久化的高数据安全性。
  2. 快速恢复:利用RDB持久化的快速数据恢复速度。
  3. 提高从节点同步效率:利用RDB文件进行快速同步。

混合持久化的缺点包括:

较大的存储空间:需要同时维护RDB文件和AOF文件,可能占用较多的磁盘空间。

5.3 混合持久化应用场景

混合持久化适用于对数据安全性和性能要求较高的场景,尤其是在以下情况:

  1. 需要确保数据完整性,不能容忍数据丢失。
  2. 需要快速恢复数据,以减少故障恢复时间。
  3. 需要提高主从同步效率,以保证高可用性和负载均衡。

6. 持久化方案选择

6.1 持久化方案对比

持久化方式 RDB AOF
原理 通过定期生成数据快照实现持久化 通过记录所有写操作命令实现持久化
数据安全性 可能会丢失最近一次快照以来的数据 更高,可通过配置同步策略降低数据丢失风险
恢复速度 较快,因为RDB文件是一个数据快照 较慢,需要逐条执行AOF文件中的命令
存储空间 一般较小,因为RDB文件经过压缩 一般较大,但可以通过AOF重写减小文件大小
性能影响 较小,因为快照生成过程较短 可能较大,但可通过配置同步策略降低性能影响
主从同步 使用RDB文件进行同步,同步速度较快 使用AOF文件进行同步,同步速度可能较慢
应用场景 适用于对数据安全性要求较低、恢复速度要求较高的场景 适用于对数据安全性要求较高、可接受较慢恢复速度的场景

如果同时开启了RDB和AOF持久化,Redis优先使用AOF持久化,因为AOF持久化可以保证更高的数据安全性和灵活性,而RDB持久化适用于数据恢复的场景。

6.2 持久化方案选择

在选择Redis持久化方案时,需要根据实际业务需求和场景权衡各个方案的优缺点。

  1. 数据安全性要求:如果你的业务对数据安全性要求较高,建议使用AOF持久化或混合持久化。AOF持久化可以通过设置同步策略来保证不同程度的数据安全性。
  2. 数据恢复速度:如果你的业务需要快速恢复数据,以减少故障恢复时间,建议使用RDB持久化或混合持久化。RDB文件包含某一时刻的完整数据快照,可以快速恢复数据。
  3. 存储空间考虑:如果磁盘空间有限,可以考虑使用RDB持久化,因为RDB文件经过压缩,占用较小的磁盘空间。然而,如果数据安全性要求较高,可以考虑使用混合持久化,尽管这会增加存储空间的占用。
  4. 主从同步效率:如果你使用了Redis主从架构,需要考虑主从同步效率。混合持久化可以利用RDB文件进行快速同步,提高从节点的同步效率。
  5. 性能考虑:RDB持久化和混合持久化可以在很大程度上保持Redis的高性能。如果选择AOF持久化,请选择合适的同步策略以平衡性能和数据安全性。

7. 总结

本文介绍了Redis的三种持久化机制:RDB持久化、AOF持久化和混合持久化。

RDB持久化通过定期生成数据快照实现持久化,具有快速恢复和更小的存储空间等优点,但可能存在数据丢失和子进程占用内存等缺点。

AOF持久化通过记录所有写操作命令实现持久化,具有更高的数据安全性和更好的容错性等优点,但可能存在较大的存储空间和数据加载速度较慢等缺点。

混合持久化结合了RDB持久化和AOF持久化的优点,适用于对数据安全性和性能要求较高的场景。

在选择Redis持久化方案时,需要根据实际业务需求和场景权衡各个方案的优缺点。

我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

彻底搞懂Redis持久化机制,轻松应对工作面试的更多相关文章

  1. 浅谈:Redis持久化机制(一)RDB篇

    浅谈:Redis持久化机制(一)RDB篇 ​ 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...

  2. 浅谈:Redis持久化机制(二)AOF篇

    浅谈:Redis持久化机制(二)AOF篇 ​ 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...

  3. 北京大公司二面:了解Redis持久化机制吗?

    今日总结 Redis持久化机制:RDB和AOF RDB持久化:定时任务,BGSAVE命令 fork一个子进程生成RDB文件(二进制) AOF持久化:根据配置将写命令存储至日志文件中,顺序写&& ...

  4. 一文搞懂Flink Window机制

    Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算. 窗口化的Flink程序的结构通常如下,有分组流(keyed streams)和无分组流(non ...

  5. 搞懂Redis RDB和AOF持久化及工作原理

    前言 因为Redis的数据都储存在内存中,当进程退出时,所有数据都将丢失.为了保证数据安全,Redis支持RDB和AOF两种持久化机制有效避免数据丢失问题.RDB可以看作在某一时刻Redis的快照(s ...

  6. 源码级别理解 Redis 持久化机制

    文章首发于公众号"蘑菇睡不着",欢迎来访~ 前言 大家都知道 Redis 是一个内存数据库,数据都存储在内存中,这也是 Redis 非常快的原因之一.虽然速度提上来了,但是如果数据 ...

  7. redis持久化机制【十三】

    一.Redis提供了哪些持久化机制: redis的高性能是因为其所有数据都存在了内存中 ,为了使redis在重启之后数据仍然不丢失,需要将数据同步到硬盘中,这一过程就是持久化. redis支持两种方式 ...

  8. redis持久化机制

    redis持久化 redis的数据存在内存中,所以存取性能好.但是存在内存中的数据存在一个问题,一旦机器重启,内存数据消失.为了解决这个问题,redis支持持久化.持久化就是为了解决内存数据丢失时恢复 ...

  9. Redis 持久化机制

    1.背景 之前在使用redis 时候,没有过多的考虑持久化! 但是这样即使你用了redis 也是徒劳,表面上你是用上了redis 进行缓存数据,感觉已经给自己的架构添加了一个道QPS 防护墙! 哈哈, ...

  10. 细说Redis持久化机制

    概述 Redis不仅能够作为缓存来使用,也能够作为内存数据库. Redis作为内存数据库使用时.必需要解决一个问题:数据的持久性.有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上 ...

随机推荐

  1. K8S中Pod概念

    一.资源限制 Pod 是 kubernetes 中最小的资源管理组件,Pod 也是最小化运行容器化应用的资源对象.一个 Pod 代表着集群中运行的一个进程.kubernetes 中其他大多数组件都是围 ...

  2. JAVA 学习打卡 day1

    2022-04-21 21:03:26 1.java程序的注释 (1)单行注释,就是在注释内容前面加双斜线(//) (2)多行注释,就是在注释内容前面以单斜线加一个星形标记(/*)开头,并在注释内容末 ...

  3. ASP.NET WEBAPI 获取微信ticket

    public static string GetTicket(string AccessToken) { //类型 string Type = "jsapi"; string st ...

  4. K8S多节点部署

    一.k8s多节点部署(接上篇博客) 1.环境准备 服务器 ip 组件 k8s集群master01 192.168.142.3 kube-apiserver.kube-controller-manage ...

  5. wmware桥接模式

    配置思路(桥接模式) 准备一个与PC机同网段且未被占用的IP地址 将虚拟机的网络模式修改为桥接模式(默认为NAT模式) 修改网卡配置文件,配置为准备好的IP地址,并重启网络服务. 配置DNS解析服务器 ...

  6. SAN证书(转载)

    日常在周末更新相关容器,更新 potainer 2.6.3 后发现所有远程 docker 节点都无法连接了,看了下日志报错是这样的: background schedule error (endpoi ...

  7. Linux部分文件管理类命令

    1.创建空文件和刷新时间 touch命令可以用来创建空文件或刷新文件的时间 touch [OPTION]... FILE... 选项: -a 仅改变atime和ctime -m 仅改变mtime和ct ...

  8. 【LeetCode回溯算法#08】递增子序列,巩固回溯算法中的去重问题

    递增子序列 力扣题目链接(opens new window) 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例 1: 输入:nums = [4,6,7,7] ...

  9. SpringBoot笔记--Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.报错的解决

    问题描述 写了SpringBoot代码之后,运行不出来结果,报出这样的一个错误:Failed to configure a DataSource: 'url' attribute is not spe ...

  10. Android笔记--报错AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY in "create table if not exists user_info(导致APP闪退)

    问题描述 每次一运行,APP程序必定闪退,百度了发现,闪退问题绝大多数就跟sql语句有关: 看到控制台报出这样的错误: 百度发现,我忘记了最初的知识点: 在表里面,自动递增是在数据类型为Integer ...