Redis RDB 持久化问题
前言
Redis 是内存数据库,它将自己的数据储存在内存里面,如果不想办法将储存在内存中的数据保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据也就没了。
因此,Redis 提供了 RDB 持久化功能,这个功能可以将 Redis 在内存中的数据保存到磁盘里面,避免丢失。
问题描述
有两台计算机,分别为 A、B(A 是本机,B 是云服务器)。两台计算机操作系统版本,Redis 版本完全相同。
我有一些数据储存在 A 的 Redis 中(B 无法直接获取这些数据),我想把这些数据保存到 B 中。于是在 A 中调用 SAVE 命令生成 rdb 文件,将 rdb 文件拷贝到 B,想让 B 加载这个 rdb 文件。
rdb 文件的加载工作是在服务器启动时自动执行的,于是我在 B 执行以下命令:
sudo systemctl restart redis
可是,B 的 Redis 中并没有我预期的数据,还是 B 之前的数据。只要重启后,我拷贝到 B 的 dump.rdb 文件就没了,就又被替换成之前的文件了。
经过排查,B 并没有开启 AOF 持久化,redis.conf 配置的 dump.rdb 文件名和路径都没有问题。排查日志发现 rdb 文件加载正常,并没有打印错误信息。
问题解决
经过重重排查,终于发现了问题,问题出在 Redis 关闭的时候。
server.c/prepareForShutdown 函数的片段如下:
int prepareForShutdown(int flags) {int save = flags & SHUTDOWN_SAVE;int nosave = flags & SHUTDOWN_NOSAVE;/* Create a new RDB file before exiting. */if ((server.saveparamslen > 0 && !nosave) || save) {serverLog(LL_NOTICE,"Saving the final RDB snapshot before exiting.");/* Snapshotting. Perform a SYNC SAVE and exit */rdbSaveInfo rsi, *rsiptr;rsiptr = rdbPopulateSaveInfo(&rsi);if (rdbSave(server.rdb_filename,rsiptr) != C_OK) {serverLog(LL_WARNING,"Error trying to save the DB, can't exit.");return C_ERR;}}
}
准备关闭的时候,在 server.saveparamslen > 0 时,有可能会调用 rdbSave(server.rdb_filename,rsiptr) 生成 rdb 文件。
我们可以在 redis.conf 中设置一些条件让 Redis 自动执行 BGSAVE 命令,例如:
save 900 1
save 300 10
save 60 10000
server.saveparamslen 就是我们设置的 BGSAVE 保存条件数组的长度,在这个例子中为 3。
于是问题就很清晰了,在 Redis 关闭的时候,它生成了一分 rdb 文件,替换了我拷贝到 B 的 rdb 文件,于是启动的时候加载的也是它刚生成的这份。
只要我先关闭 Redis,再将 dump.rdb 拷贝到 B,再在 B 启动 Redis 就可以解决了。
参考资料
- 《Redis 设计与实现》
- Redis 5.0.8 server.c/prepareForShutdown
相关文章:
Redis RDB 持久化问题
前言 Redis 是内存数据库,它将自己的数据储存在内存里面,如果不想办法将储存在内存中的数据保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据也就没了。 因此,Redis 提供了 RDB 持久化功能,这个功能…...
windows 下nginx常用命令
1、启动,目录cmd,后 start nginx.exe 2.重新加载 nginx -s reload 3.查看状态 tasklist /fi “imagename eq nginx.exe” 4.关闭 nginx -s quit...
xjoi题库一级1-10段题解(c语言版)
xjoi题库一级一段 xjoi题库一级二段 xjoi题库一级三段 xjoi题库一级四段 xjoi题库一级五段...

1.int 与 Integer 的简单区别
蓝桥杯刷题从此开始: 第一题就是两个数的和,个人看来主要考察 int与integer 的区别; 这是我提交的答案,竟然会报错: import java.util.*; //输入A、B,输出AB。 class add {public static void main(String …...

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)
目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元(ALU) 3.1.2 累加器A 3.1.3 程序状态字寄存器(PSW)…...

某方protobuf闲谈
问题 当我们去看某方的时候,搜索了关键词svm,然后通过抓包查看,请求的Request Payload是一串看不懂的乱码,并且返回的数据也大部分是乱码 观察请求的Content-Type是application/grpc-web+proto,没错数据的传输是protobuf的形式了 protobuf的相关概念和原理,网上有很多教…...

专为汽车内容打造的智能剪辑解决方案
汽车内容创作已成为越来越多车主和汽车爱好者热衷的活动。然而,如何高效、便捷地将行车途中的精彩瞬间转化为高质量的视频作品,一直是困扰着广大用户的一大难题。美摄科技凭借其深厚的视频处理技术和智能分析能力,推出了专为汽车内容记录而生…...

【C语言】二叉树的实现
文章目录 前言⭐一、二叉树的定义🚲二、创建二叉树🎡三、二叉树的销毁🎉四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 🌲五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…...

在ubuntu22.04里网站源码连不上mysql数据库
在ubuntu22.04里网站源码连不上mysql数据库。后来找到了原因。 连不上的时候有报错信息: ERROR 1698 (28000): Access denied for user rootlocalhost 用在网上搜索该报错信息,找到了两篇有用的文章,用这两篇文章里的处理方法解决了问题。 …...

博客说明 5/12~5/24【个人】
博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…...
豆瓣电影后端设计
sql脚本 -- douban.tags_encode definitionCREATE TABLE tags_encode (id bigint NOT NULL AUTO_INCREMENT COMMENT 自增主键,tag varchar(100) NOT NULL COMMENT tag中文名,tag_encode varchar(100) NOT NULL COMMENT tag转encode,type varchar(100) NOT NULL DEFAULT movie …...

【深度学习】第1章
概论: 机器学习是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析,其基础主要是归纳和统计。 深度学习是一种实现机器学习的技术,是机器学习重要的分支。其源于人工神经网络的研究。深度学习的模型结构是一种含多隐层的神经…...

Vue3实战笔记(37)—粒子特效登录页面
文章目录 前言一、粒子特效登录页总结 前言 上头了,再来一个粒子特效登录页面。 一、粒子特效登录页 登录页: <template><div><vue-particles id"tsparticles" particles-loaded"particlesLoaded" :options"…...
解锁无限可能:JavaScript与【机器学习】的浪漫邂逅
解锁无限可能:JavaScript与机器学习的浪漫邂逅 在人工智能和大数据日益盛行的今天,机器学习已成为我们理解、分析和处理数据的强大工具。而JavaScript,作为前端开发的主流语言,其灵活的特性和广泛的应用场景也让我们对其充满了期…...
【Linux】$()中的内容与不加$()时有什么区别
$()中的内容与不加$()有什么区别,例如$(/usr/local/hadoop/bin/hadoop classpath)与/usr/local/hadoop/bin/hadoop classpath两者有何区别??? 关于这个问题,笔者建议可以参考如下文章: Linux—shell中$((…...

2024最新前端面试八股文【基础篇293题】
⼀、HTML、HTTP、web综合问题 1 前端需要注意哪些SEO 2 <img> 的 title 和 alt 有什么区别 3 HTTP的⼏种请求⽅法⽤途 4 从浏览器地址栏输⼊url到显示⻚⾯的步骤 5 如何进⾏⽹站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍⼀下你对浏览器内核的理解 9 …...

【NumPy】关于numpy.median()函数,看这一篇文章就够了
🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…...

起保停电路工作原理
一、电路组成 起保停电路由电源保护设备(空气开关)、交流接触器、启动按钮、停止按钮和用电设备组成。 起保停电路的组成部分通常可分为四个部分: 保护部分:(空气开关)在电流或电压超出一定范围时自动切断…...

【Vue】Vue2使用ElementUI
目录 Element UI介绍特点Vue2使用Element安装引入ElementUI组件库 使用ElementUI用户注册列表展示其他 mint-ui介绍特点安装组件引入组件Mint-ui相关组件 Element UI 介绍 官网(基于 Vue 2.x ):https://element.eleme.cn/#/zh-CN ElementUI 是一个基于 Vue.js 的桌面端组件库…...

设计模式在芯片验证中的应用——模板方法
一、模板方法 模板方法(Template Method)设计模式是一种行为设计模式, 它在父类中定义了一个功能的框架, 允许子类在不修改结构的情况下重写功能的特定步骤。也就是模板方法定义了一组有序执行的操作,将一些步骤的实现留给子类,同…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...