前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【赵渝强老师】Redis的RDB数据持久化

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

原创
作者头像
赵渝强老师
发布2024-11-07 09:57:52
540
发布2024-11-07 09:57:52
举报
文章被收录于专栏:NoSQL数据库

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

视频讲解如下

视频内容

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

视频讲解如下:

视频内容

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

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

代码语言:shell
复制
# 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的状态报告。

代码语言:shell
复制
bin/redis-cli info | grep rdb_

输出的信息如下:
rdb_changes_since_last_save:0 	表明上次RDB保存以后改变的键的个数。
rdb_bgsave_in_progress:0 		表示当前是否在进行RDB操作,0表示没有进行。
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(),函数定义如下:

代码语言:c
复制
/* 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;
    ......
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、RDB持久化机制的工作流程
  • 二、剖析RDB持久化机制
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档