Redis持久化——RDB机制详解

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis提供了RDB和AOF的持久化选项。本文主要介绍RDB的核心概念、触发方式、文件结构及优缺点。RDB(Redis DataBase) ,意为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程

在运行情况下,Redis 以数据结构的形式将数据维持在内存中,为了让这些数据在 Redis 重启之后仍然可用,需要将数据写入持久存储

持久化是指将数据写入持久存储,例如固态磁盘(SSD)

Redis 提供了一系列持久化选项。这些包括:

  • RDB(Redis Database):RDB 持久化以指定的时间间隔执行数据集的时间点快照。
  • AOF(Append Only File):AOF 持久化记录服务器收到的每一个写操作。然后可以在服务器启动时再次重放这些操作,重建原始数据集。使用与 Redis 协议本身相同的格式记录命令。
  • RDB + AOF:RDB和AOF混合方式(4.0版本)

RDB和AOF的优缺点详见Redis持久化

RDB

RDB(Redis DataBase) ,意为快照/内存快照,RDB持久化是把当前进程数据生成快照保存到磁盘上的过程

由于是某一时刻的快照,那么快照中的值要早于或者等于内存中的值

RDB 功能最核心的是rdbSaverdbLoad两个函数, 前者用于生成 RDB 文件到磁盘, 而后者则用于将 RDB 文件中的数据重新载入到内存中

RDB核心函数

RDB触发方式

触发rdb持久化的方式有2种,分别是手动触发和自动触发

手动触发

手动触发分别对应SAVEBGSAVE命令。

  • SAVE命令直接调用rdbSave,阻塞Redis主进程
  • BGSAVE用子进程调用rdbSave,主进程仍可继续处理命令请求

为了避免产生竞争条件,BGSAVE执行时,SAVE命令不能执行

bgsave流程图

  1. redis客户端执行bgsave命令或者自动触发bgsave命令
  2. 主进程判断当前是否已经存在正在执行的子进程,如果存在,那么主进程直接返回
  3. 如果不存在正在执行的子进程,那么就fork一个新的子进程进行持久化数据,fork过程是阻塞的,fork操作完成后主进程即可执行其他操作
  4. 子进程先将数据写入到临时的rdb文件中,待快照数据写入完成后再原子替换旧的rdb文件
  5. 同时发送信号给主进程,通知主进程rdb持久化完成,主进程更新相关的统计信息(info Persitence下的rdb_*相关选项)

自动触发

  • redis.conf中配置save m n,即在m秒内有n次修改时,自动触发bgsave生成rdb文件
  • 主从复制时,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点
  • 执行debug reload命令重新加载redis时也会触发bgsave操作
  • 默认情况下执行shutdown命令时,如果没有开启aof持久化,那么也会触发bgsave操作

redis.conf中配置RDB快照周期:内存快照虽然可以通过技术人员手动执行SAVE或BGSAVE命令来进行,但生产环境下多数情况都会设置其周期性执行条件。

# 周期性执行条件的设置格式为
save <seconds> <changes>

# 默认的设置为:
# 如果900秒内有1条Key信息发生变化,则进行快照
save 900 1
# 如果300秒内有10条Key信息发生变化,则进行快照
save 300 10
# 如果60秒内有10000条Key信息发生变化,则进行快照
save 60 10000

# 以下设置方式为关闭RDB快照功能
save ""

RDB文件结构

此段文章修改自Redis 设计与实现,详细见原文

RDB 文件可以分为以下几个部分:

+-------+-------------+-----------+-----------------+-----+-----------+
| REDIS | RDB-VERSION | SELECT-DB | KEY-VALUE-PAIRS | EOF | CHECK-SUM |
+-------+-------------+-----------+-----------------+-----+-----------+

                      |<-------- DB-DATA ---------->|
  • REDIS:文件的最开头保存着 REDIS 五个字符,标识着一个 RDB 文件的开始
  • RDB-VERSION:一个四字节长的以字符表示的整数,记录了该文件所使用的 RDB 版本号
  • DB-DATA:这个部分在一个 RDB 文件中会出现任意多次,每个 DB-DATA 部分保存着服务器上一个非空数据库的所有数据
  • SELECT-DB:这域保存着跟在后面的键值对所属的数据库号码
  • KEY-VALUE-PAIRS:因为空的数据库不会被保存到 RDB 文件,所以这个部分至少会包含一个键值对的数据
  • EOF:标志着数据库内容的结尾(不是文件的结尾),值为rdb.h/EDIS_RDB_OPCODE_EOF(255)
  • CHECK-SUM:RDB 文件所有内容的校验和, 一个uint_64t类型值

KEY-VALUE-PAIRS每个键值对的数据使用以下结构来保存:

+----------------------+---------------+-----+-------+
| OPTIONAL-EXPIRE-TIME | TYPE-OF-VALUE | KEY | VALUE |
+----------------------+---------------+-----+-------+
  • OPTIONAL-EXPIRE-TIME域是可选的,如果键没有设置过期时间,那么这个域就不会出现;反之,如果这个域出现的话,那么它记录着键的过期时间,在当前版本的 RDB中,过期时间是一个以毫秒为单位的 UNIX 时间戳。
  • KEY域保存着键,格式和 REDIS_ENCODING_RAW 编码的字符串对象一样(见下文)。
  • TYPE-OF-VALUE域记录着VALUE域的值所使用的编码,根据这个域的指示,程序会使用不同的方式来保存和读取VALUE的值

RDB优缺点

  • 优点
    • RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景
    • Redis加载RDB文件恢复数据要远远快于AOF方式
  • 缺点
    • RDB方式实时性不够,无法做到秒级的持久化
    • 每次调用bgsave都需要fork子进程,fork子进程属于重量级操作,频繁执行成本较高
    • RDB文件是二进制的,没有可读性,AOF文件在了解其结构的情况下可以手动修改或者补全
    • 版本兼容RDB文件问题

针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决


参考资料:

  1. Redis persistence
  2. Redis 设计与实现
  3. Redis持久化详解
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
15天前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
15天前
|
存储 监控 NoSQL
【赵渝强老师】Redis的RDB数据持久化
Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。
|
1月前
|
存储 缓存 NoSQL
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
41 2
大数据-45 Redis 持久化概念 RDB AOF机制 持久化原因和对比
|
1月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
40 2
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
60 1
|
6月前
|
NoSQL Redis
03- Redis的数据持久化策略有哪些 ?
Redis的数据持久化包括两种策略:RDB(全量快照)和AOF(增量日志)。RDB在指定时间间隔将内存数据集保存到磁盘,而AOF记录所有写操作形成日志。从Redis 4.0开始,支持RDB和AOF的混合持久化,通过设置`aof-use-rdb-preamble yes`。
57 1
|
4月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
5月前
|
存储 缓存 JSON
Redis-持久化-淘汰机制-IO策略
Redis-持久化-淘汰机制-IO策略
|
6月前
|
存储 NoSQL 关系型数据库
Redis持久化策略AOF、RDB详解及源码分析
Redis持久化策略AOF、RDB详解及源码分析
|
存储 NoSQL 关系型数据库
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
Redis的持久化策略(RDB、AOF、RDB-AOF混合持久化)
164 0
下一篇
无影云桌面