【赵渝强老师】Redis的RDB数据持久化

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。

b150.png


Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出会造成服务器中的数据库状态也会消失。所以 Redis 提供了数据持久化功能。Redis支持两种方式的持久化,一种是RDB方式;另一种是AOF(append-only-file)方式。两种持久化方式可以单独使用,也可以将这两种方式结合使用。


视频讲解如下:


这里重点讨论一下Redis的RDB数据持久化。RDB持久化是Redis默认的持久化方式。它是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后再替换之前的文件,并用二进制压缩存储。


视频讲解如下:


一、RDB持久化机制的工作流程


RDB执行快照的时机由以下参数决定:

# Save the DB to disk.
# save <seconds> <changes>
# Redis will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
# Snapshotting can be completely disabled with a single empty
# string argument as in following example:
# save ""
# Unless specified otherwise, by default Redis will save the DB:
# * After 3600 seconds (an hour) if at least 1 key changed
# * After 300 seconds (5 minutes) if at least 100 keys changed
# * After 60 seconds if at least 10000 keys changed
# You can set these explicitly by uncommenting the three following lines.
# save 3600 1
# save 300  100
# save 60   10000
提示:Redis执行RDB是通过save命令实现的。在默认情况下触发RDB的条件如下:
# save 3600   1   在3600秒内,如有1个Key发生了变化,则执行RDB。
# save 300    100   在300秒内,如有100个Key发生了变化,则执行RDB。
# save 60     10000 在60秒内,如有1万个Key发生了变化,则执行RDB。


RDB持久化机制的工作流程如下:

(1)Redis根据配置参数去生存rdb快照文件

(2)Redis将fork一个子进程出来。

(3)由子进程尝试将内存中的数据dump到临时的rdb文件中。

(4)完成rdb快照文件的生成之后,就会去替换旧的快照文件。


从RDB的工作流程可以看出,RDB具有以下的优点和缺点:

  • 适合大规模的数据恢复。
  • 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
  • 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
  • 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件,最后再将临时文件替换之前的备份文件。所以要考虑到大概两倍的数据膨胀性。


Redis监控RDB最直接的方法当然就是使用系统提供的info命令来做了。只需要执行下面一条命令,就能获得Redis关于RDB的状态报告。

bin/redis-cli info | grep rdb_

rdb_changes_since_last_save:0   RDB
rdb_bgsave_in_progress:0    RDB0
rdb_last_save_time:1650184060   RDB
rdb_last_bgsave_status:ok     RDB
rdb_last_bgsave_time_sec:-1   RDB
rdb_current_bgsave_time_sec:-1  RDB
rdb_last_cow_size:0       


二、剖析RDB持久化机制


在rdb.c文件中可以找到创建RDB文件的函数rdbSave(),函数定义如下:

/* Save the DB on disk. Return C_ERR on error, C_OK on success. */
int rdbSave(char *filename, rdbSaveInfo *rsi) {
    ......
    // 创建临时文件
    snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
    fp = fopen(tmpfile,"w");
    ......
    // 初始化I/O
    rioInitWithFile(&rdb,fp);
    // 开始执行RDB
    startSaving(RDBFLAGS_NONE);
    ......
    //如果持久化成功操作成功,则用临时文件替代旧的文件
    if (rename(tmpfile,filename) == -1) {
        char *cwdp = getcwd(cwd,MAXPATHLEN);
        serverLog(LL_WARNING,
        "Error moving temp DB file %s on the final "
        "destination %s (in server root dir %s): %s",
        tmpfile,
        filename,
        cwdp ? cwdp : "unknown",
        strerror(errno));
        unlink(tmpfile);
        stopSaving(0);
        return C_ERR;
    }
    serverLog(LL_NOTICE,"DB saved on disk");
    //持久化成功后,将计数器重置为0,并更新最近存储时间。
    server.dirty = 0;
    server.lastsave = time(NULL);
    server.lastbgsave_status = C_OK;
    stopSaving(1);
    return C_OK;
    ......
}



相关文章
|
6月前
|
NoSQL Redis 数据库
一文讲透彻Redis 持久化
一文讲透彻Redis 持久化
61 0
|
12月前
|
存储 缓存 NoSQL
【Redis 系列】redis 学习八,redis 持久化 RDB 和 AOF
【Redis 系列】redis 学习八,redis 持久化 RDB 和 AOF
|
13小时前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
6月前
|
存储 NoSQL Java
【Redis系列笔记】持久化
Redis的确是将数据存储在内存的,但是也会有相关的持久化机制将内存持久化备份到磁盘,以便于重启时数据能够重新恢复到内存中,避免数据丢失的风险。有三种持久化方式——RDB,AOF,混合持久化。RDB持久化是形成数据快照,把内存中的所有数据都记录到磁盘中,是全量持久化。AOF持久化是把Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件,是增量化持久。混合持久化则结合两者。
200 1
|
6月前
|
缓存 NoSQL 关系型数据库
深入浅出Redis(四):Redis基于RDB、AOF的持久化
深入浅出Redis(四):Redis基于RDB、AOF的持久化
|
6月前
|
NoSQL Redis 数据库
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
Redis的安全网:掌握RDB和AOF的持久化技术【redis第四部分】
216 0
|
NoSQL 安全 架构师
【大厂面试必问】Redis 的持久化 RDB
【大厂面试必问】Redis 的持久化 RDB
428 1
【大厂面试必问】Redis 的持久化 RDB
|
缓存 NoSQL Linux
Redis学习(七):Redis持久化(RDB和AOF)
Redis学习(七):Redis持久化(RDB和AOF)
179 0
Redis学习(七):Redis持久化(RDB和AOF)
|
存储 NoSQL Redis
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制(二)
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制(二)
341 0
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制(二)
|
存储 NoSQL Redis
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制(一)
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制
173 0
【Redis高手修炼之路】Redis的持久化——ROB和AOF持久化机制(一)