当前位置: 首页 > news >正文

如何保障 MySQL 和 Redis 的数据一致性

在现代分布式系统中,确保不同数据存储(如 MySQL 和 Redis)之间的一致性是一个常见的挑战。MySQL 是一种关系型数据库管理系统,而 Redis 是一种内存中的键值存储系统,通常用于缓存和快速访问数据。本文将详细介绍几种保障 MySQL 和 Redis 数据一致性的方法,并分析它们的优缺点,特别是关于先更新数据库,再更新缓存先删除缓存,再更新数据库的选择。

1. 双写模式 (Double Write Pattern)

原理

每次更新 MySQL 数据时,同时更新 Redis 中的数据。

实现步骤
  1. 在应用程序中,每当有数据更新操作时,首先更新 MySQL 数据库。
  2. 然后,立即更新 Redis 缓存中的对应数据。
  3. 如果 Redis 更新失败,可以选择重试机制或记录日志以便后续处理。
示例代码
public class DoubleWriteService {private final JdbcTemplate jdbcTemplate;private final Jedis jedis;public DoubleWriteService(JdbcTemplate jdbcTemplate, Jedis jedis) {this.jdbcTemplate = jdbcTemplate;this.jedis = jedis;}public void updateData(int dataId, String newValue) {// 更新 MySQL 数据库String sql = "UPDATE my_table SET value = ? WHERE id = ?";jdbcTemplate.update(sql, newValue, dataId);// 更新 Redis 缓存try {jedis.set("data:" + dataId, newValue);} catch (Exception e) {// 处理 Redis 更新失败的情况log.error("Failed to update Redis cache", e);}}
}
优点
  • 实现简单,逻辑清晰。
缺点
  • 可能出现数据不一致的情况,例如 MySQL 更新成功但 Redis 更新失败。
  • 需要额外的代码来处理并发问题和异常情况。

改进措施

  • 使用事务或分布式事务(如 XA 事务)来保证 MySQL 和 Redis 的原子性操作。
  • 引入消息队列(如 Kafka、RabbitMQ),将更新操作异步化,并通过消息队列确保最终一致性。

2. Cache Aside Pattern (旁路缓存模式)

原理

应用程序先查询缓存,如果缓存未命中,则查询数据库并将结果写入缓存。

实现步骤
  1. 查询数据时,首先检查 Redis 缓存。
  2. 如果缓存中没有所需数据,则从 MySQL 数据库中获取数据,并将其写入 Redis 缓存。
  3. 更新数据时,首先更新 MySQL 数据库,然后删除 Redis 中对应的缓存项(而不是直接更新)。
示例代码
public class CacheAsideService {private final JdbcTemplate jdbcTemplate;private final Jedis jedis;public CacheAsideService(JdbcTemplate jdbcTemplate, Jedis jedis) {this.jdbcTemplate = jdbcTemplate;this.jedis = jedis;}public String getData(int dataId) {String key = "data:" + dataId;// 查询 Redis 缓存String cachedValue = jedis.get(key);if (cachedValue != null) {return cachedValue;}// 如果缓存未命中,查询 MySQL 数据库String sql = "SELECT value FROM my_table WHERE id = ?";String dbValue = jdbcTemplate.queryForObject(sql, new Object[]{dataId}, String.class);// 将查询到的数据写入 Redis 缓存jedis.set(key, dbValue);return dbValue;}public void updateData(int dataId, String newValue) {// 更新 MySQL 数据库String sql = "UPDATE my_table SET value = ? WHERE id = ?";jdbcTemplate.update(sql, newValue, dataId);// 删除 Redis 缓存jedis.del("data:" + dataId);}
}
优点
  • 减少了数据不一致的风险,因为每次更新都删除缓存,下次查询时会重新加载最新数据。
缺点
  • 可能导致缓存穿透(频繁查询不存在的数据),需要引入布隆过滤器等机制来缓解。
  • 存在一个短暂的时间窗口,在删除缓存和下一次查询之间,可能会有旧数据被读取。

改进措施

  • 使用延迟删除策略,即在更新数据库后,延迟一段时间再删除缓存,以减少并发场景下的数据不一致问题。
  • 引入版本号机制,确保缓存中的数据是最新的。

3. 先更新数据库,再更新缓存 vs 先删除缓存,再更新数据库

在讨论如何保障数据一致性时,我们常常面临两种选择:先更新数据库,再更新缓存先删除缓存,再更新数据库。下面我们详细分析这两种方法的优缺点。

1. 先更新数据库,再更新缓存

实现步骤
  1. 更新 MySQL 数据库中的数据。
  2. 更新 Redis 缓存中的对应数据。
示例代码
public void updateData(int dataId, String newValue) {// 更新 MySQL 数据库String sql = "UPDATE my_table SET value = ? WHERE id = ?";jdbcTemplate.update(sql, newValue, dataId);// 更新 Redis 缓存try {jedis.set("data:" + dataId, newValue);} catch (Exception e) {// 处理 Redis 更新失败的情况log.error("Failed to update Redis cache", e);}
}
优点
  • 实现简单,符合直观思维。
  • 如果 Redis 更新失败,可以通过重试机制或其他手段进行补救。
缺点
  • 并发问题: 如果在更新 MySQL 后,但在更新 Redis 之前,另一个线程查询了 Redis 并得到了旧数据,会导致数据不一致。
  • 复杂性增加: 需要处理 Redis 更新失败的情况,增加了系统的复杂性。

2. 先删除缓存,再更新数据库

实现步骤
  1. 删除 Redis 缓存中的对应数据。
  2. 更新 MySQL 数据库中的数据。
示例代码
public void updateData(int dataId, String newValue) {// 删除 Redis 缓存jedis.del("data:" + dataId);// 更新 MySQL 数据库String sql = "UPDATE my_table SET value = ? WHERE id = ?";jdbcTemplate.update(sql, newValue, dataId);
}
优点
  • 避免并发问题: 删除缓存后再更新数据库,可以避免并发情况下读取到旧数据的问题。
  • 简化实现: 不需要处理 Redis 更新失败的情况,只需要确保缓存被正确删除。
缺点
  • 短暂不一致: 在删除缓存和更新数据库之间,可能会有短暂的时间窗口,读请求会再次从数据库中获取数据并重新写入缓存。
  • 额外查询: 如果缓存被删除,后续的读请求会直接从数据库中获取数据,增加了数据库的压力。

对比与选择

特性先更新数据库,再更新缓存先删除缓存,再更新数据库
实现复杂度较高较低
并发问题可能存在几乎不存在
短暂不一致几乎不存在存在
数据库压力较小较大
适用场景对一致性要求较高的场景对性能要求较高的场景

改进建议

  • 延迟删除策略: 在更新数据库后,延迟一段时间再删除缓存,以减少并发场景下的数据不一致问题。
  • 版本号机制: 引入版本号机制,确保缓存中的数据是最新的。
  • 消息队列: 使用消息队列来异步处理缓存更新操作,确保数据一致性。

总结

不同的方法适用于不同的场景和需求。以下是选择方法时的一些考虑因素:

  • 强一致性 vs 最终一致性: 如果需要强一致性,可以选择双写模式或分布式事务;如果可以接受最终一致性,可以使用 Cache Aside Pattern 或 Read/Write Behind Pattern。
  • 性能 vs 复杂性: 直写模式和读后写模式可以提高性能,但实现复杂度较高;Cache Aside Pattern 实现简单,但可能引入短暂的数据不一致。
  • 系统可靠性: 定期数据同步适合对一致性要求不高的场景,但在高并发环境下可能表现不佳。

根据具体的应用场景和需求,选择合适的方案来保障 MySQL 和 Redis 之间的数据一致性。希望这篇博客能帮助你更好地理解和选择适合你的数据一致性方案。

相关文章:

如何保障 MySQL 和 Redis 的数据一致性

在现代分布式系统中,确保不同数据存储(如 MySQL 和 Redis)之间的一致性是一个常见的挑战。MySQL 是一种关系型数据库管理系统,而 Redis 是一种内存中的键值存储系统,通常用于缓存和快速访问数据。本文将详细介绍几种保…...

【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串

子串 1. 和为 k 的子数组题目描述解题思路主要思路步骤 时间复杂度与空间复杂度代码实现 2. 滑动窗口最大值题目描述解题思路双端队列的原理:优化步骤: Java实现 3. 最小覆盖子串题目描述解题思路滑动窗口的基本思路:具体步骤:算法…...

【CLIP系列】4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来,作者是把CLIP模型当成一个Teacher,去蒸馏他自己的网络,从而能Zero Shot去…...

vue-谷歌浏览器安装vue-devtools插件

文章目录 一、谷歌浏览器安装vue-devtools1.1、方式一:直接下载crx并安装 本文讲解谷歌浏览器安装vue-devtools插件的步骤。 注意:以下vue-devtools插件都是vue2版本的。 一、谷歌浏览器安装vue-devtools 1.1、方式一:直接下载crx并安装 …...

【安全测试】0基础新手学Web安全测试笔记(一)

文章目录 一、关于账号密码的漏洞二、关于验证码的漏洞三、Burp工具的使用四、渗透测试1. 渗透测试类型2. 脆弱性评估 五、常见的应用安全风险1. 注入2. 失效的身份认证3. 敏感数据泄露4. XML外部实体(XXE)5. 失效的访问控制6. 安全配置错误7. 跨站脚本:(XSS)8. 不安全的反序列…...

初窥强大,AI识别技术实现图像转文字(OCR技术)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作,主要擅长领域有:python…...

JDK 14,15,17的一些新特性(部分常用)

1:instanceof(后,使用不再需要墙转) 2:switch语句增强 1:支持lmbda,自动防击穿,有返回值 2:支持case多个值,复杂逻辑结果支持yield返回 3:字符串…...

架构设计系列(二):CI/CD

一、概述 CI/CD 是 持续集成(Continuous Integration) 和 持续交付/持续部署(Continuous Delivery/Continuous Deployment) 的缩写,是现代软件开发中的一套核心实践和工具链,旨在提高软件交付的效率、质量…...

二十六、使用docsify搭建文档管理平台

特性 无需构建,写完文档直接发布容易使用并且轻量 (~19kB gzipped)智能的全文搜索提供多套主题丰富的 API...

SpringMVC学习使用

一、SpringMVC简单理解 1.1 Spring与Web环境集成 1.1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(sp…...

MySQL | MySQL安装教程

MySQL | MySQL安装教程(压缩包(ZIP)安装-详细版) 🪄个人博客:https://vite.xingji.fun MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,MySQL AB公司被Sun公司收购,Sun公…...

Vite入门指南

一、什么是Vite? Vite(法语意为"快速")是由Vue作者尤雨溪开发的新型前端构建工具。它基于原生ES模块(ESM)实现,具有以下核心优势: 极速启动:冷启动时间比Webpack快10-10…...

DeepSeek 助力 Vue 开发:打造丝滑的进度条

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

左移架构 -- 从攒批,湖仓到使用数据流的实时数据产品

编辑导读: 这篇文章翻译自 Kai Waehner的 《The Shift Left Architecture – From Batch and Lakehouse to Real-Time Data Products with Data Streaming》。文章通过数据产品的概念引出了如何创建可重复使用的数据产品使企业能够从当前和未来的数据中获得价值。基于构建数据产…...

用java实现word(docx)转换为pdf格式文档(简单版)

导入依赖 <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j-local</artifactId> <version>1.0.3</version> </dependency> <dependency>…...

【云安全】云原生- K8S etcd 未授权访问

什么是etcd&#xff1f; etcd 是一个开源的分布式键值存储系统&#xff0c;主要用于存储和管理配置信息、状态数据以及服务发现信息。它采用 Raft 共识算法&#xff0c;确保数据的一致性和高可用性&#xff0c;能够在多个节点上运行&#xff0c;保证在部分节点故障时仍能继续提…...

【Elasticsearch】字符过滤器Character Filters

在 Elasticsearch 中&#xff0c;字符过滤器&#xff08;Character Filters&#xff09;是文本分析器的重要组成部分&#xff0c;用于在分词之前对原始文本进行预处理。它们可以对字符流进行转换&#xff0c;例如添加、删除或更改字符。Elasticsearch 提供了三种内置的字符过滤…...

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…...

浏览器网络请求全流程深度解析

一、核心流程概述 现代浏览器的网络请求过程是一个分层协作的精密系统&#xff0c;涉及应用层协议、传输层协议、操作系统内核及网络基础设施的协同工作。整个过程可抽象为以下关键阶段&#xff1a; 请求构建与初始化DNS解析与寻址TCP连接建立HTTP协议交互响应处理与资源解析…...

arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)

参考&#xff1a;表情机器人中使用22个舵机的案例 引言 在电子制作与自动化控制领域&#xff0c;Arduino 凭借其易用性和强大的扩展性备受青睐。Arduino Mega 作为其中功能较为强大的一款开发板&#xff0c;具备丰富的引脚资源&#xff0c;能够实现复杂的控制任务。舵机作为常…...

时间盲注,Boolean盲注

什么是SQL注入&#xff08;SQL Injection&#xff09; SQL注入是指攻击者通过构造恶意SQL语句来操控数据库&#xff0c;通常发生在Web应用程序未对用户输入进行充分验证的情况下。 什么是盲注&#xff08;Blind SQL Injection&#xff09; 盲注就是通过使用巧妙的SQL语句&am…...

小程序canvas2d实现横版全屏和竖版逐字的签名组件(字帖式米字格签名组件)

文章标题 01 功能说明02 效果预览2.1 横版2.2 竖版 03 使用方式04 横向签名组件源码4.1 html 代码4.2 业务 Js4.3 样式 Css 05 竖向签名组件源码5.1 布局 Html5.2 业务 Js5.3 样式 Css 01 功能说明 技术栈&#xff1a;uniapp、vue、canvas 2d 需求&#xff1a; 实现横版的全…...

wireshark网络抓包

由于图片和格式解析问题&#xff0c;可前往 阅读原文 到这里已经讲了两个抓包工具的使用了&#xff0c;大家应该对抓包不是很陌生了。而wireshark相对于fiddler和charles更加偏向于网络层面的抓包或者说是一个网络封包分析工具。使用对象更适合于网络相关人员(网络管理员/相关运…...

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…...

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…...

Kimi杨植麟该为“重投放”反思吗?

Kimi原本验证的市场规律被撕裂了。 作者|文昌龙 编辑|杨舟 “没有人提杨植麟了&#xff0c;Kimi花了这么多钱买用户也买不过豆包&#xff0c;到头来都敌不过界面简陋、功能单一的DeepSeek。还是应该把精力和资源集中在做出更好的基础模型才是王道。” 这番话&#xff0c;来自…...

25农村发展研究生复试面试问题汇总 农村发展专业知识问题很全! 农村发展复试全流程攻略 农村发展考研复试真题汇总

农村发展复试当然有好的建议&#xff01;前提是复试重点面试题背好&#xff01; 你是不是也在为农村发展考研复试发愁&#xff1f;担心自己准备不充分、表现不好&#xff1f;别急&#xff01;今天&#xff0c;学姐——复试面试拿下90分成功上岸的学姐&#xff0c;来给大家分享…...

JavaScript函数与方法详解

目录 一、函数的定义 1. 函数声明 2. 函数表达式 3. 箭头函数 二、函数的调用 1. 调用方式 2. 参数数量的灵活性 三、arguments 对象 1. 基本概念 2. 属性 3. 应用场景 4. 转换为真数组 5. 总结 四、Rest参数 1. 基本概念 2. 特点 3. 应用场景 4. 总结 五、变…...

AI 网关对决:Higress 与 OneAPI 的功能对比

什么是 AI 网关&#xff1f; AI 网关旨在统一管理与各种大型语言模型&#xff08;LLMs&#xff09;的交互。通过提供单一入口点&#xff0c;它解决了使用来自不同供应商的多个 AI 模型所带来的复杂性问题。这不仅简化了访问流程&#xff0c;提高了系统稳定性&#xff0c;还降低…...

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…...

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…...

DeepSeek能做分析吗?从需求规约到分析类图的实验

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 今天我们来尝试DeepSeek能不能帮我们从需求转到分析。 给定一个用例规约&#xff0c;我们让它按照面向对象分析设计方法&#xff0c;出一个分析类图。过程如下&#xff1a; 可以帮助提…...

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库已难以满足高可用性、扩展性和…...

RNN复兴!性能反超Transformer,训练速度提升1300倍!

在最新的顶会论文中&#xff0c;RNN的改进创新更是层出不穷。Bengio团队提出的minLSTM和minGRU&#xff0c;通过去除隐藏状态的依赖和简化门控机制&#xff0c;显著减少了参数量和计算量。这些模型可以使用并行扫描算法进行训练&#xff0c;大大加快了训练速度。例如&#xff0…...

C语言第18节:自定义类型——联合和枚举

1. 联合体 C语言中的联合体&#xff08;Union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同类型的数据。不同于结构体&#xff08;struct&#xff09;&#xff0c;结构体的成员各自占有独立的内存空间&#xff0c;而联合体的所有成员共享同一块内存区域…...

2025年二级建造师报名流程图解

2025年二级建造师报名时间&#xff01;附报名流程&#xff01; ⏰️已公布25年二建考试时间的省份如下&#xff1a; ️4月19日、20日考试的城市有&#xff1a;贵州 ️5月10日、11日考试的城市有&#xff1a;湖北、陕西、宁夏、甘肃、福建、浙江、江西、黑龙江、河南、湖南、…...

AWTK fscript 中的 TCP/UDP 客户端扩展函数

fscript 是 AWTK 内置的脚本引擎&#xff0c;开发者可以在 UI XML 文件中直接嵌入 fscript 脚本&#xff0c;提高开发效率。本文介绍一下 fscript 中的 TCP/UDP 客户端扩展函数。 1.iostream_tcp_create 创建 TCP 客户端输入输出流对象。 原型 iostream_tcp_create(host, por…...

用php tp6对接钉钉审批流的 table 表格 明细控件 旧版sdk

核心代码 foreach ($flows[product_list] as $k>$gift) {$items_list[] [[name > 商品名称, value > $gift[product_name] ?? ],[name > 规格, value > $gift[product_name] ?? ],[name > 数量, value > $gift[quantity] ?? ],[name > 单位, v…...

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…...

前缀和算法篇:解决子数组累加和问题

前缀和算法篇&#xff1a;解决子数组累加和问题 1.前缀和原理 那么在介绍前缀和的原理之前&#xff0c;那么我们先来说下前缀和最基本的一个应用场景&#xff0c;那么就是如我们标题所说的子数组累加和问题&#xff0c;那么假设我们现在有一个区间为[L,R]的数组&#xff0c;那…...

大语言模型多代理协作(MACNET)

大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…...

vue项目使用vite和vue-router实现history路由模式空白页以及404问题

开发项目的时候&#xff0c;我们一般都会使用路由&#xff0c;但是使用hash路由还是history路由成为了两种选择&#xff0c;因为hash路由在url中带有#号&#xff0c;history没有带#号&#xff0c;看起来更加自然美观。但是hash速度更快而且更通用&#xff0c;history需要配置很…...

【Linux】从一台windows电脑访问局域网下另一台linux电脑详细操作步骤

以下是在Windows电脑B上访问Linux电脑A的文件并使用bash终端的详细步骤&#xff1a; 一、在Linux电脑A上配置SSH服务&#xff08;用于终端操作&#xff09; 安装SSH服务 sudo apt update && sudo apt install openssh-server启动SSH服务并设置开机自启 sudo systemctl …...

Makefile的用法及算法应用

编译的过程 算法&#xff1a;解决特定问题的求解步骤 算法的设计 1.正确性 语法正确合法的输入能得到合理的结果对非法的输入&#xff0c;给出满足要求的规格说明对精心选择&#xff0c;甚至刁难的测试都能正常运行&#xff0c;结果正确 2.可读性&#xff0c;便于交流&…...

Elasticsearch:15 年来致力于索引一切,找到重要内容

作者&#xff1a;来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了&#xff01;回顾过去 15 年的索引和搜索&#xff0c;并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章&#xff08;带有标志性的…...

MongoDB 扩缩容实战:涵盖节点配置、服务启动与移除操作

#作者&#xff1a;任少近 文章目录 一、扩容在245节点上配置配置config server&#xff1a;配置mongos启动config server安装工具mongosh添加245新节点到副本集配置分片副本集启动路由并分片 二、缩容Conf server上去掉server4shard上去掉server4mongos上去掉server4 一、扩容…...

Bitmap在数仓中的应用

一、背景 在数据仓库的日常工作中&#xff0c;我们经常需要面对海量数据的存储和高效查询问题。尤其是&#xff0c;当业务对性能的要求越来越高、数据量持续增长时&#xff0c;传统的处理方式往往显得笨拙而低效。而这时候&#xff0c;Bitmap&#xff08;位图&#xff09;作为…...

C++病毒(^_^|)(2)

第二期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…...

Linux 内核架构入门:从基础概念到面试指南*

1. 引言 Linux 内核是现代操作系统的核心&#xff0c;负责管理硬件资源、提供系统调用、处理进程调度等功能。对于初学者来说&#xff0c;理解 Linux 内核的架构是深入操作系统开发的第一步。本篇博文将详细介绍 Linux 内核的架构体系&#xff0c;结合硬件、子系统及软件支持的…...

leetcode-495.提莫攻击

leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …...