Redis从磁盘读取数据机制是怎么样的?数据持久化与恢复策略怎么实现?

文章导读
Redis 从磁盘读取数据主要发生在服务器启动阶段,通过加载持久化文件恢复内存状态。若开启 AOF 则优先重放 AOF 日志,否则加载 RDB 快照。数据持久化通过 RDB 快照或 AOF 日志将内存数据写入磁盘,恢复策略依赖于配置文件设定的优先级,确保宕机后数据能最大程度还原,其中 RDB 适合备份,AOF 适合数据完整性保护。持久化机制可以防止重要的数据在突发情况下遭受损失,这对于业务的连续性
📋 目录
  1. Redis 学习笔记 (四)RDB 和 AOF 持久化机制
  2. 一文深度揭秘 Redis 的磁盘持久化机制
  3. Redis 详解 (3) 数据持久化机制
  4. Redis 中的数据持久化策略 (RDB)
  5. FAQ
A A

Redis 从磁盘读取数据主要发生在服务器启动阶段,通过加载持久化文件恢复内存状态。若开启 AOF 则优先重放 AOF 日志,否则加载 RDB 快照。数据持久化通过 RDB 快照或 AOF 日志将内存数据写入磁盘,恢复策略依赖于配置文件设定的优先级,确保宕机后数据能最大程度还原,其中 RDB 适合备份,AOF 适合数据完整性保护。持久化机制可以防止重要的数据在突发情况下遭受损失,这对于业务的连续性和可用性非常重要。

Redis 学习笔记 (四)RDB 和 AOF 持久化机制

一、Redis 持久化简介 Redis 的持久化功能是区别于 Memcached 显著特性,数据持久化可以保证系统在发生宕机和重启后数据不会丢失,对于 redis 这种存储在内存中的数据库显得尤为重要。在 Redis 4.0 以前数据持久化的方式主要有两种 RDB(Redis DataBase) 快照方式:它是将某一时刻的内存数据以二进制的方式写入磁盘,默认保存文件为 dump.rdb AOF(Append Only File) 文件追加方式:它是指将所有的操作命令,以文本的形式追加到文件中。默认保存文件是 appendonly.aof 二、RDB 持久化机制 RDB 是将内存中的数据在某一时刻的状态记录下来以二进制的方式存储到磁盘中,通过生成一个经过压缩的二进制文件来实现数据库状态的复原。默认是 dump.rdb 文件,它的优点是以二进制存储,占用空间更小,数据存储更紧凑。因为 RDB 文件是保存在磁盘中,哪怕 Redis 服务器宕机,Redis 服务器就可以通过该文件来还原数据库状态。2.1 RDB 触发方式 触发 RDB 持久化既可以通过手动执行,也可以根据服务器配置选项定期执行。主要分为手动触发和自动触发两种方式。2.1.1 手动触发 手动触发主要是通过 save 和 bgsave 两个命令来生成 RDB 文件 save 命令 **会阻塞当前 Redis 服务器,然后直到 RDB 文件创建完毕为止 **。对于内存较大的实例会造成长时间阻塞。bgsave 命令 该命令会派生 fork 出一个子进程,由子进程负责创建 RDB 文件,服务器 (父线程) 继续处理命令请求。RDB 持久化过程由子进程负责,完成后自动结束,阻塞阶段只发生在 fork 阶段,阻塞时间较短。所以大多数情况使用 bgsave 命令生成 RDB 文件 2.1.2 自动触发 自动触发主要是通过 redis.conf 配置文件来完成。

一文深度揭秘 Redis 的磁盘持久化机制

1. Redis 数据库结构 一个单机的 Redis 服务器默认情况下有 16 个数据库 (0-15 号),数据库的个数是可配置的。Redis 默认使用的是 0 号数据库,可以使用 SELECT 命令切换数据库。Redis 中的每个数据库都由一个 redis.h/redisDb 结构表示,它记录了单个 Redis 数据库的键空间、所有键的过期时间、处于阻塞状态和就绪状态的键、数据库编号等等。代码语言:javascript AI 代码解释 typedef struct redisDb {// 数据库键空间,保存着数据库中的所有键值对 dict *dict;// 键的过期时间,字典的键为键,字典的值为过期事件 UNIX 时间戳 dict *expires;// 正处于阻塞状态的键 dict *blocking_keys;// 可以解除阻塞的键 dict *ready_keys;// 正在被 WATCH 命令监视的键 dict *watched_keys;struct evictionPoolEntry *eviction_pool;// 数据库编号 int id;// 数据库的键的平均 TTL,统计信息 long long avg_ttl;}redisDb; 由于 Redis 是一个键值对数据库 (key-value pairs database), 所以它的数据库本身也是一个字典,对应的结构正是 redisDb。其中,dict 指向的是一个记录键值对数据的字典,它的键是一个字符串对象,它的值则可以是字符串、列表、哈希表、集合和有序集合在内的任意一种 Redis 类型对象。expires 指向的是一个用于记录键的过期时间的字典,它的键为 dict 中的数据库键,它的值为这个数据库键的过期时间戳,这个值以 long long 类型表示。2. RDB 持久化 RDB 持久化 (也称作快照持久化) 是指将内存中的数据生成快照保存到磁盘里面,保存的文件后缀是 .rdb。rdb 文件是一个经过压缩的二进制文件,当 Redis 重新启动时,可以读取 rdb 快照文件恢复数据。RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数,前者用于生成 RDB 文件并保存到磁盘,而后者则用于将 RDB 文件中的数据重新载入到内存中。

Redis 详解 (3) 数据持久化机制

一、Redis 持久化方式 Redis 由于支持非常丰富的内存数据结构类型,如何把这些复杂的内存组织方式持久化到磁盘上是一个难题,所以 Redis 的持久化方式与传统数据库的方式有比较多的差别,Redis 一共支持四种持久化方式,分别是:RDB 定时快照方式 (snapshot): RDB 将数据库的快照 (snapshot) 以二进制的方式保存到磁盘中。AOF 基于语句追加文件的方式:则以协议文本的方式,将所有对数据库进行过写入的命令 (及其参数) 记录到 AOF 文件,以此达到记录数据库状态的目的。虚拟内存 (vm) (被废弃) Diskstore 方式 (被废弃) 在设计思路上,前两种是基于全部数据都在内存中,即小数据量下提供磁盘落地功能,而后两种方式则是作者在尝试存储数据超过物理内存时,即大数据量的数据存储,截止到本文,后两种持久化方式仍然是在实验阶段,并且 vm 方式基本已经被作者放弃,所以实际能在生产环境用的只有前两种,换句话说 Redis 目前还只能作为小数据量存储 (全部数据能够加载在内存中),海量数据存储方面并不是 Redis 所擅长的领域。很多人开始会想象两者是互相结合的,即 dump 出一个 snapshot 到 RDB 文件,然后在此基础上记录变化日志到 AOF 文件。实际上两者毫无关系,完全独立运行,因为作者认为简单才不会出错。如果使用了 AOF,重启时只会从 AOF 文件载入数据,不会再管 RDB 文件。正确关闭服务器:redis-cli shutdown 或者 kill,都会 graceful shutdown,保证写 RDB 文件以及将 AOF 文件 fsync 到磁盘,不会丢失数据。如果是粗暴的 Ctrl+C,或者 kill -9 就可能丢失。下面分别介绍下这几种持久化方式:二、RDB 定时快照方式 (snapshot) RDB 持久化的触发分为手动触发和自动触发两种。1、手动触发 通过 redis 的 save 命令和 bgsave 命令,都可以生成 RDB 文件。一,save 保存数据到磁盘的方式:Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照 (snapshot) 以 RDB 文件的形式保存到硬盘。语法:redis 127.0.0.1:6379> SAVE 返回值:保存成功时返回 OK。二,BGSAVE 保存数据到磁盘的方式:BGSAVE 命令执行之后立即返回 OK,然后 Redis fork 出一个新子进程,原来的 Redis 进程 (父进程) 继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。bgsave 命令执行过程中,只有 fork 子进程时会阻塞服务器,而对于 save 命令,整个过程都会阻塞服务器,因此 save 已基本被废弃,线上环境要杜绝 save 的使用;后文中也将只介绍 bgsave 命令。

Redis从磁盘读取数据机制是怎么样的?数据持久化与恢复策略怎么实现?

Redis 中的数据持久化策略 (RDB)

Redis 是一个内存数据库,所有的数据都直接保存在内存中,那么,一旦 Redis 进程异常退出,或服务器本身异常宕机,我们存储在 Redis 中的数据就凭空消失,再也找不到了。Redis 作为一个优秀的数据中间件,必定是拥有自己的持久化数据备份机制的,redis 中主要有两种持久化策略,用于将存储在内存中的数据备份到磁盘上,并且在服务器重启时进行备份文件重载。RDB 和 AOF 是 Redis 内部的两种数据持久化策略,这是两种不同的持久化策略,一种是基于内存快照,一种是基于操作日志,那么本篇就先来讲讲 RDB 这种基于内存快照的持久化策略。RDB(redis database),快照持久化策略。RDB 是 redis 默认的持久化策略,你可以打开 redis.conf,默认会看到这三条配置。save9001900 秒内执行一次 set 操作 则持久化 1 次 save30010300 秒内执行 10 次 set 操作,则持久化 1 次 save601000060 秒内执行 10000 次 set 操作,则持久化 1 次 RDB 又分为两种,一种是同步的,调用 save 命令即可触发 redis 进行 RDB 文件生成备份,但是这是一个同步命令,在备份完成之前,redis 服务器不响应客户端任何请求。另一种是异步的,调用 bgsave 命令,redis 服务器 fork 一个子进程进行 RDB 文件备份生成,与此同时,主进程依然可以响应客户端请求。显然,异步的 RDB 生成策略才是主流,除了某些特殊情况,相信不会有人会在生产环境中用 save 命令阻塞 redis 服务来生成 RDB 文件的。save 配置是一个非常重要的配置,它配置了 redis 服务器在什么情况下自动触发 bgsave 异步 RDB 备份文件生成。当 redis 数据库在 秒内,数据库中的 keys 发生了 次变化,那么就会触发 bgsave 命令的调用。dbfilename 配置项决定了生成的 RDB 文件名称,默认配置为 dump.rdb。AI 代码解释 dbfilename dump.rdb rdbcompression 配置的是 rdb 文件中压缩启用配置,基本语法格式:如果 rdbcompression 配置为 yes,那么即代表 redis 进行 RDB 文件生成中,如果遇到字符串对象并且其中的字符串值占用超过 20 个字节,那么就会对字符串进行 LZF 算法进行压缩。

FAQ

Redis 重启时优先加载哪个文件?

如果开启了 AOF 持久化,重启时只会从 AOF 文件载入数据,不会再管 RDB 文件。如果未开启 AOF,则加载 RDB 文件。

save 和 bgsave 命令有什么区别?

Redis从磁盘读取数据机制是怎么样的?数据持久化与恢复策略怎么实现?

save 命令会阻塞当前 Redis 服务器,直到 RDB 文件创建完毕。bgsave 命令会派生出一个子进程负责创建 RDB 文件,服务器主进程继续处理命令请求,阻塞时间较短。

RDB 文件默认名称是什么?

默认配置为 dump.rdb,可以通过 dbfilename 配置项决定生成的 RDB 文件名称。