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

架构思维:查询分离 - 表数据量大查询缓慢的优化方案

文章目录

  • Pre
  • 引言
  • 案例
  • 何谓查询分离?
  • 何种场景下使用查询分离?
  • 查询分离实现思路
    • 1. 如何触发查询分离?
      • 方式一: 修改业务代码:在写入常规数据后,同步建立查询数据。
      • 方式二:修改业务代码:在写入常规数据后,异步建立查询数据。
      • 方式三: 监控数据库日志:如有数据变更,更新查询数据。
      • 方案对比
      • 适用场景
    • 2. 如何实现查询分离?
    • 3. 查询数据如何存储?
    • 4. 查询数据如何使用?
  • 整体方案
  • 历史数据迁移
  • 查询分离解决方案的不足

在这里插入图片描述

Pre

MySQL索引原理与优化指南:深入解析B+Tree与高效查询策略

MySQL - 事务隔离级别和锁的机制

MySQL - 读多写少场景下的优化数据查询方案

MySQL - 写多读少的场景下如何优化数据存储方案

MySQL - 冷热分离:表数据量大读写缓慢的优化方案


引言

MySQL - 冷热分离:表数据量大读写缓慢的优化方案中提到了冷热分离解决方案的性价比高,但它并不是一个最优的方案,仍然存在诸多不足,比如:查询冷数据慢、业务无法再修改冷数据、冷数据多到一定程度系统依旧扛不住,我们如果想把这些问题一一解决掉,可以用另外一种解决方案——查询分离。

在这里插入图片描述

注意:查询分离与读写分离还是有区别的


案例

某系统工单表中存放了几千万条数据,且查询工单表数据时需要关联十几个子表,每个子表的数据也是超亿条。

如此庞大的数据量,跟前面的冷热分离一样,每次查询数据时几十秒才能返回结果,即便使用了索引、SQL 等数据库优化技巧,效果依然不明显。

加上工单表中有些数据是几年前的,因业务原因,需要继续保持更新,因此无法将这些旧数据封存到别的地方,也就没法通过前面的冷热分离方案来解决。

最终采用了查询分离的解决方案,才得以将这个问题顺利解决:将更新的数据放在一个数据库里,而查询的数据放在另外一个系统里。因为数据的更新都是单表更新,不需要关联也没有外键,所以更新速度立马得到提升,数据的查询则通过一个专门处理大数据量的查询引擎来解决,也快速地满足了需求。

通过这种解决方案处理后,每次查询数据时,500ms 内就可得到返回结果。


何谓查询分离?

每次写数据时保存一份数据到另外的存储系统里,用户查询数据时直接从另外的存储系统里获取数据,示意图如下:

在这里插入图片描述

何种场景下使用查询分离?

当在实际业务中遇到以下情形,则可以考虑使用查询分离解决方案。

  • 数据量大;

  • 所有写数据的请求效率尚可;

  • 查询数据的请求效率很低;

  • 所有的数据任何时候都可能被修改;

  • 业务希望我们优化查询数据的功能。


查询分离实现思路

查询分离解决方案的实现思路如下:

  • 如何触发查询分离?

  • 如何实现查询分离?

  • 查询数据如何存储?

  • 查询数据如何使用?


1. 如何触发查询分离?

这个问题说明的是我们应该在什么时候保存一份数据到查询数据中,即什么时候触发查询分离这个动作。

一般来说,查询分离的触发逻辑分为 3 种。

方式一: 修改业务代码:在写入常规数据后,同步建立查询数据。

在这里插入图片描述


方式二:修改业务代码:在写入常规数据后,异步建立查询数据。

在这里插入图片描述


方式三: 监控数据库日志:如有数据变更,更新查询数据。

在这里插入图片描述

方案对比

在这里插入图片描述

适用场景

在这里插入图片描述


2. 如何实现查询分离?

以上共3 种触发逻辑,第 1 种是同步建立查询数据的过程比较简单,这里就不展开说明,接下来我们主要围绕第 2 种来展开。

关于第 2 种触发方案:修改业务代码异步建立查询数据,最基本的实现方式是单独起一个线程建立查询数据,不过这种做法会出现如下情况:

  • 写操作较多且线程太多,最终撑爆 JVM;

  • 建查询数据的线程出错了,如何自动重试;

  • 多线程并发时,很多并发场景需要解决。

面对以上三种情况,我们该如何处理?此时使用 MQ 管理这些线程即可解决。

MQ 的具体操作思路为每次主数据写操作请求处理时,都会发一个通知给 MQ,MQ 收到通知后唤醒一个线程更新查询数据

在这里插入图片描述

了解了 MQ 的具体操作思路后,还应该考虑以下 5 大问题。

问题一:MQ 如何选型?

易用性和代码工作量角度考量即可。


问题二:MQ 宕机了怎么办?

如果 MQ 宕机了,我们只需要保证主流程正常进行,且 MQ 恢复后数据正常处理即可,具体方案分为三大步骤。

  • 每次写操作时,在主数据中加个标识:NeedUpdateQueryData=true,这样发到 MQ 的消息就很简单,只是一个简单的信号告知更新数据,并不包含更新的数据 id。

  • MQ 的消费者获取信号后,先批量查询待更新的主数据,然后批量更新查询数据,更新完后查询数据的主数据标识 NeedUpdateQueryData 就更新成 false 了。

  • 当然还存在多个消费者同时搬运动作的情况,这就涉及并发性的问题,因此问题冷热分离中的并发性处理逻辑类似。


问题三:更新查询数据的线程失败了怎么办?

如果更新的线程失败了,NeedUpdateQueryData 的标识就不会更新,后面的消费者会再次将有 NeedUpdateQueryData 标识的数据拿出来处理。但如果一直失败,我们可以在主数据中多添加一个尝试搬运次数,比如每次尝试搬运时 +1,成功后就清零,以此监控那些尝试搬运次数过多的数据。


问题四:消息的幂等消费

在编程中,一个幂等操作的特点是多次执行某个操作均与执行一次操作的影响相同。

举个例子,比如主数据的订单 A 更新后,我们在查询数据中插入了 A,可是此时系统出问题了,系统误以为查询数据没更新,又把订单 A 插入更新了一次。

所谓幂等,就是不管更新查询数据的逻辑执行几次,结果都是我们想要的结果。因此,考虑消费端并发性的问题时,我们需要保证更新查询数据幂等。


问题五:消息的时序性问题

比如某个订单 A 更新了 1 次数据变成 A1,线程甲将 A1 的数据搬到查询数据中。不一会儿,后台订单 A 又更新了 1 次数据变成 A2,线程乙也启动工作,将 A2 的数据搬到查询数据中。

所谓的时序性就是如果线程甲启动比乙早,但搬运数据动作比线程乙还晚完成,就有可能出现查询数据最终变成过期的 A1。如下图(动作前面的序号代表实际动作的先后顺序):

在这里插入图片描述

此时解决方案为主数据每次更新时,都更新上次更新时间 last_update_time,然后每个线程更新查询数据后,检查当前订单 A 的 last_update_time 是否跟线程刚开始获得的时间一样,且 NeedUpdateQueryData 是否等于 false,如果都满足的话,我们就将 NeedUpdateQueryData 改为 true,然后再做一次搬运。


MQ 在这里的作用只是一个触发信号的工具,如果不用 MQ 好像也没啥问题啊,但是MQ的作用不仅体现在这里,还有以下:

  • 服务的解耦: 这样主业务逻辑就不会依赖更新查询数据这个服务了。

  • 控制更新查询数据服务的并发量: 如果我们直接调用更新查询数据服务,因写操作速度快,更新查询数据速度慢,写操作一旦并发量高,会给更新查询数据服务造成超负荷压力。如果通过消息触发更新查询数据服务,我们就可以通过控制消息消费者的线程数来控制负载。


3. 查询数据如何存储?

我们应该使用什么技术存储查询数据呢?目前,市面上主要使用 Elasticsearch 实现大数据量的搜索查询,当然还可能会使用到 MongoDB、HBase 这些技术,这就需要我们对各种技术的特性了如指掌,再进行技术选型。

关于技术选型这个问题,很多时候我们不能单单只考虑业务功能的需求,还需要考虑组织结构。比如当初设计架构方案时,为什么选择用 Elasticsearch,除 ES 对查询的扩展性支持外,最关键的一点是团队对 Elasticsearch 很熟悉。


4. 查询数据如何使用?

因 ES 自带 API,所以使用查询数据时,我们在查询业务代码中直接调用 ES 的 API 就行。

不过,这个办法会出现一个问题:数据查询更新完前,查询数据不一致怎么办

2 种解决思路。

  • 在查询数据更新到最新前,不允许用户查询。(我们没用过这种设计,但我确实见过市面上有这样的设计。)

  • 给用户提示:您目前查询到的数据可能是 1 秒前的数据,如果发现数据不准确,可以尝试刷新一下,这种提示用户一般比较容易接受。

整体方案

以上,我们已经把四个问题都讨论完了,我们再一起看下查询分离的整体方案,如下图所示:

在这里插入图片描述


历史数据迁移

新的架构方案上线后,旧的数据如何适用新的架构方案?这是实际业务中需要我们考虑的问题。

在这个方案里,我们只需要把所有的历史数据加上这个标识:NeedUpdateQueryData=true,程序就会自动处理了。


查询分离解决方案的不足

查询分离这个解决方案虽然能解决一些问题,但我们也要清醒地认识到它的不足。

不足一: 使用 Elasticsearch 存储查询数据时,注意事项是什么 ?

不足二: 主数据量越来越大后,写操作还是慢,到时还是会出问题。

不足三: 主数据和查询数据不一致时,假设业务逻辑需要查询数据保持一致性呢?

在这里插入图片描述

相关文章:

架构思维:查询分离 - 表数据量大查询缓慢的优化方案

文章目录 Pre引言案例何谓查询分离?何种场景下使用查询分离?查询分离实现思路1. 如何触发查询分离?方式一: 修改业务代码:在写入常规数据后,同步建立查询数据。方式二:修改业务代码:…...

A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议

A2DP(Advanced Audio Distribution Profile)是蓝牙协议栈中用于音频传输的一个标准化协议,主要用于高质量音频流的无线传输。以下是A2DP协议的详细信息: 定义 A2DP协议允许音源设备(Source,简称SRC&#…...

Redisson使用详解

一、Redisson 核心特性与适用场景 Redisson 是基于 Redis 的 Java 客户端,提供分布式对象、锁、集合和服务,简化分布式系统开发。 典型应用场景: 分布式锁:防止重复扣款、超卖控制(如秒杀库存)。数据共享…...

GraalVM 24 正式发布阿里巴巴贡献重要特性 —— 支持 Java Agent 插桩

作者:林子熠、饶子昊 2025 年 3 月 18 日 Oracle 双箭齐发,正式发布了 JDK 24 和 GraalVM 24,带来了众多新特性。 JDK 24 在性能和安全性方面均有改进(特性列表链接见下),其中较大的一处改动是在 JDK 中…...

游戏编程模式学习(编程质量提升之路)

文章目录 前言一、命令模式(Command Pattern)1.命令模式练习场景I.需求场景 2.解耦命令与执行者3.使用命令对玩家角色和AI的操作进行统一抽象4. 命令模式的撤销实现 二、享元模式1.应用场景2.目的3.实现方式 三、原型模式1.运用场景2.实现方式 四、状态模…...

计算机视觉五大技术——深度学习在图像处理中的应用

深度学习是利用“多层神经网络”实现人工智能的一种方式 计算机视觉:“对图像中的客观对象构建明确而有意义的描述”,识别图片中的含义进行处理 1.图像分类——“图里有狗” 判断整张图片属于哪个类别,判断图片是“猫”还是“狗” 思路&a…...

Mixed Content: The page at https://xxx was loaded over HTTPS

一、核心原因分析 Mixed Content 警告是由于 HTTPS 页面中引用了 HTTP 协议的资源(如脚本、图片、iframe 等),导致浏览器因安全策略阻止加载这些非加密内容。HTTP 资源可能被中间人攻击篡改,破坏 HTTPS 页面的整体安全性。 二、推荐解决方案 1. 强制资源升级为 HTTPS •…...

transforms-pytorch4

数据通常不会直接是机器学习算法可以使用的“最终格式”。我们使用转换(transforms)来对数据进行处理,使其适合训练。 所有的 TorchVision 数据集都提供了两个参数:transform 用于修改特征,target_transform 用于修改…...

Springboot----@Role注解的作用

Role(BeanDefinition.ROLE_INFRASTRUCTURE) 是 Spring 框架中的一个注解,用于显式标记 Bean 的角色,表明该 Bean 是 Spring 容器内部的基础设施组件(如后置处理器、工具类等),而非用户直接使用的业务 Bean。其核心作用…...

SpringBoot项目报错: 缺少 Validation

目录 为什么需要Validation?如何使用Validation? 缺少validation?这不过是代码的一个小小问题,就像被风带走的一片叶子,轻轻一吹就能解决啦! 在你的项目中,如果你发现自己需要进行数据验证&…...

MySQL vs MSSQL 对比

在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…...

预测分析(四):面向预测分析的神经网络简介

文章目录 面向预测分析的神经网络简介神经网络模型1. 基本概念2. 前馈神经网络3. 常见激活函数4. 循环神经网络(RNN)5. 卷积神经网络(CNN) MPL结构工作原理激活函数训练方法 基于神经网络的回归——以钻石为例构建预测钻石价格的M…...

实战交易策略 篇十四:江南神鹰捕捉热点和熊市生存交易策略

文章目录 系列文章捕捉热点是股市最大的掘金术市场温度不低于50是热点产生的必要条件题材的大小和新颖程度决定热点的持续时间和涨幅炒作热点的3个阶段捕捉热点的方法与步骤操作实战案例熊市生存术“熊市最好的做法是离开股市”的说法是一句空话熊市盈利模式:不轻言底部,超跌…...

去中心化衍生品(以Synthetix为例)

去中心化衍生品(以Synthetix为例) 核心概念 合成资产(Synths): 定义:链上追踪现实资产价值的代币化合约(如sXAU追踪黄金,iBTC反向追踪比特币)。 类型: 正…...

JavaScript重难点突破:事件循环

想了解事件循环,首先要了解js中线程的概念。 宿主环境 在浏览器环境中,js实际上包含了三个部分ECMAScript、DOM(文档对象模型)、BOM(浏览器对象模型),我们最熟悉的js代码指的是ECMAScript这一…...

Python每日一题(15)

Python每日一题2025.4.4 一、题目题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 二、分析三、源代码四、deepseek 一、题目 题目描述 您需要写一种数据结构,来维护一些数(都是绝对值 1 0 9 10^9 109 以内的数)的集合&#xff0c…...

#SVA语法滴水穿石# (003)关于 sequence 和 property 的区别和联系

在 SystemVerilog Assertions (SVA) 中,sequence 和 property 是两个核心概念,它们既有区别又紧密相关。对于初学者,可能不需要过多理解;但是要想写出复杂精美的断言,深刻理解两者十分重要。今天,我们汇总和学习一下该知识点。 1. 区别 特性sequenceproperty定义描述一系…...

有人DTU使用MQTT协议控制Modbus协议的下位机-含数据库

本文为备忘录,不做太多解释。 DTU型号:G780 服务器:win2018 一。DTU设置 正确设置波特率,进入配置状态,获取当前参数,修改参数,设置并保存所有参数。 1.通道1设置 2.Modbus轮询设置 二&am…...

Smart Link 技术全面解析

1.1 网络冗余技术的演进与需求 1.2 Smart Link 的核心价值与本文目标 第一章 Smart Link 技术概述 2.1 Smart Link 的应用场景与背景 2.2 Smart Link 的基本概念与组网角色 2.3 Smart Link 与传统技术的对比 第二章 Smart Link 工作原理 3.1 Smart Link 组的构成与运行机…...

【学Rust写CAD】30 Alpha256结构体补充方法(alpha256.rs)

源码 impl Alpha256 {#[inline]pub fn alpha_mul(&self, x: u32) -> u32 {let mask 0xFF00FF;let src_rb ((x & mask) * self.0) >> 8;let src_ag ((x >> 8) & mask) * self.0;(src_rb & mask) | (src_ag & !mask)} }代码分析 功能 输…...

提升 Web 性能:使用响应式图片优化体验

在现代 Web 开发中,图片通常占据页面加载的大部分带宽,如何高效管理图片资源直接影响用户体验和性能得分。Google 的 Lighthouse 工具在性能审计中特别强调“使用响应式图片”(Uses Responsive Images),旨在确保图片在…...

基于K8s的演示用单机ML服务部署

这是仅用一台机器(比如一台MacBook)模拟在k8s上部署一个机器学习服务的演示用实例。 项目地址:https://github.com/HarmoniaLeo/Local-K8s-ML-Demo 该实例分为以下几个部分: 使用KerasTensorflow搭建并训练神经网络&#xff0c…...

强化中小学人工智能教育:塑造未来社会的科技基石

在数字化浪潮席卷全球的今天,人工智能(AI)已成为推动社会进步与经济发展的核心力量。面对这一不可逆转的趋势,如何培养具备AI素养与创新能力的下一代,成为各国教育改革的重中之重。辽宁省教育厅近日发布的《关于加强中小学人工智能教育的实施方案》,无疑为我国中小学人工…...

音视频基础(视频的主要概念)

文章目录 **1. 视频码率(Bitrate)****概念****分类****码率对比** **2. 视频帧率(Frame Rate, FPS)****概念****常见帧率****帧率 vs. 观感** **3. 视频分辨率(Resolution)****概念****常见分辨率****分辨率…...

JWT与Session的实战选择-杂谈(1)

JWT与Session的实战选择:从原理到踩坑心得 作为在金融科技领域经历过多次认证方案迭代的开发者,我想分享一些实战经验。这两种方案适用场景各异,选型需慎重考量。 一、本质差异:状态管理方式 Session机制:服务端维护…...

SQL Server安装后 Reporting Services 配置失败

问题现象: 完成 SQL Server 2022 安装后,尝试配置 Reporting Services (SSRS) 时失败,错误提示 “报表服务器数据库配置无效” 或 “无法启动 Reporting Services 服务”(错误代码 0x80070005)。 快速诊断 检查服务状态…...

操作系统面经(一)

部分参考来自小林coding 线程、进程、协程 进程是操作系统分配资源(内存、文件等)的基本单位,每个进程独立运行,互相隔离,稳定性高但开销大;线程是CPU调度的基本单位,属于同一进程的多个线程共…...

Qt 中 findChild和findChildren绑定自定义控件

在 Qt 中,findChild 和 findChildren 是两个非常实用的方法,用于在对象树中查找特定类型的子对象。这两个方法是 QObject 类的成员函数,因此所有继承自 QObject 的类都可以使用它们。当您需要查找并绑定自定义控件时,可以按照以下…...

对模板方法模式的理解

对模板方法模式的理解 一、场景1、题目【[来源](https://kamacoder.com/problempage.php?pid1087)】1.1 题目描述1.2 输入描述1.3 输出描述1.4 输入示例1.5 输出示例 二、不采用模板方法模式1、代码2、问题 三、采用模板方法模式1、代码 四、总结 一、场景 1、题目【来源】 …...

SpringMVC+Spring+MyBatis知识点

目录 一、相关概念 1.关系 2.网页 3.架构 4.URL 5.http 6.https 7.服务器 8.Tomcat 9.Servelet 10.Javaweb作用域对象 11.JSP 二、相关操作 1.RequestDispatcher 2.sendRedirect 3.cookie 4.Session 5.Filter过滤器 6.Listener监听器 7.MVC模型 8.JDBC连接…...

程序化广告行业(58/89):系统架构与广告反作弊深度剖析

程序化广告行业(58/89):系统架构与广告反作弊深度剖析 大家好!在程序化广告这个充满挑战与机遇的领域,不断学习和探索是保持竞争力的关键。今天,我希望和大家一起学习进步,深入了解程序化广告行…...

一周学会Pandas2 Python数据处理与分析-NumPy简介

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩…...

第二十七章:Python-Aquarel库与多种主题库结合实现Matplotlib美化

资源绑定附上完整资料供读者参考学习! 一、库介绍与安装 1.1 Aquarel库 Aquarel是一个轻量级的Python库,用于简化Matplotlib的样式配置,使数据可视化更加美观和高效。 1.2 Catppuccin库 Catppuccin是一个社区驱动的粉彩主题库&#xff0…...

leetcode155.最小栈

思路源自 【力扣hot100】【LeetCode 155】最小栈 为了让检索时间达到o(1),采用空间换时间,维护两个栈,第一个栈实现正常的push、pop、top,另一个栈的栈顶每次都只放以一个栈中最小的元素 class MinStack …...

Mysql 中的 MyISAM 引擎

🧱 什么是 MyISAM? MyISAM 是 MySQL 早期的默认存储引擎,特点是结构简单、读取速度快,但不支持事务和行级锁。 它适合那些 读多写少、对事务安全要求不高 的场景,比如旧版博客系统、数据仓库等。 📦 MyISA…...

操作系统、虚拟化技术与云原生及云原生AI简述

目录 操作系统基础 操作系统定义 操作系统的组成 操作系统的分类 Linux操作系统特性 虚拟化技术 概述 CPU虚拟化 内存虚拟化 I/O虚拟化 虚拟化技术 虚拟化平台管理工具 容器 容器与云原生:详细介绍 容器的特点 什么是云原生? 云原生的特点 容器与云原生的…...

Java EE期末总结(第二章)

目录 一、JSP页面里的page指令 二、JSP脚本元素 1、全局声明<%!……%> 2、表达式<%……%> 3、脚本程序段<%……%> 三、文件包含指令include 四、引入标签库指令taglib 五、JSP动作标签 1、包含文件动作标签 2、请求转发动作标签 3、JavaBean动作标签 …...

FreeRTOS任务查询和信息统计API

下面例举几个常见的任务查询API&#xff08;其余可参考FreeRTOS开发手册&#xff09;&#xff1a; UBaseType_t Priority; Priority uxTaskPriorityGet(QUERYTask_Handler); printf("Task Pri %d \r\n",Priority); TaskStatus_t * TaskStatusArray; UBaseType_t …...

SQLark(百灵连接):一款面向信创应用开发者的数据库开发和管理工具

SQLark&#xff08;百灵连接&#xff09;是一款面向信创应用开发者的数据库开发和管理工具&#xff0c;用于快速查询、创建和管理不同类型的数据库系统。 目前可以支持达梦数据库、Oracle 以及 MySQL。 SQL 智能编辑器 基于语法语义解析实现代码补全能力&#xff0c;为你提供…...

Linux | 安装超级终端串口软件连接i.MX6ULL开发板(8)

01 它的安装步骤也非常简单,安装语言选择中文简体,点击确定,如下图所示。 点击下一步,如下图所示。 02...

Qt 事件系统负载测试:深入理解 Qt 事件处理机制

Qt 事件系统负载测试&#xff1a;深入理解 Qt 事件处理机制 文章目录 Qt 事件系统负载测试&#xff1a;深入理解 Qt 事件处理机制摘要引言实现原理1. 自定义事件类型2. 事件队列管理3. 性能指标监控4. 事件发送机制 性能监控实现1. 负载计算2. 内存监控3. 延迟计算 使用效果优化…...

如何评价Manus?

Manus是由Monica公司发布的全球首款通用型AI Agent产品,定位于一个性能强大的通用型助手,能够独立思考、规划并执行复杂任务,直接交付完整的任务成果。‌‌ Manus 这个名字灵感来源于拉丁格言 “Mens et Manus”(意为“头脑与双手”),寓意它既能动脑也能动手。 Manus的核…...

AI浪潮下的IT职业转型:医药流通行业传统IT顾问的深度思考

AI浪潮下的IT职业转型&#xff1a;医药流通行业传统IT顾问的深度思考 一、AI重构IT行业的技术逻辑与实践路径 1.1 医药流通领域的智能办公革命 在医药批发企业的日常运营中&#xff0c;传统IT工具正经历颠覆性变革。以订单处理系统为例&#xff0c;某医药集团引入AI智能客服…...

2011-2019年各省地方财政国土资源气象等事务支出决策数数据

2011-2019年各省地方财政国土资源气象等事务支出决策数数据 1、时间&#xff1a;2007-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政国土资源气象等事务支出决策数 4、范围&#xff1a;31省 5、指标说明&#x…...

《微服务概念进阶》精简版

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 什么是微服务&#xff08;进阶精简版&#x…...

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先&#xff0c;我们详细介绍了SSM框架&#xff0c;这是一种经典的Java Web开发框架&#xff0c;由Spring、SpringMVC和MyBatis三个开源项目整合而成&#xff0c;为开发企业级应用提供了高效、灵活、…...

栈回溯和离线断点

栈回溯和离线断点 栈回溯&#xff08;Stack Backtrace&#xff09; 栈回溯是一种重建函数调用链的技术&#xff0c;对于分析栈溢出的根本原因非常有价值。 实现方式 // 简单的栈回溯实现示例&#xff08;ARM Cortex-M架构&#xff09; void stack_backtrace(void) {uint32_…...

探索轻量高性能的 Rust HTTP 服务器框架 —— Hyperlane

探索轻量高性能的 Rust HTTP 服务器框架 —— Hyperlane 随着互联网应用对性能和实时性要求的不断提升&#xff0c;选择一个高效且易于扩展的 HTTP 服务器框架变得尤为重要。今天&#xff0c;我们将介绍一个专为 Rust 开发者设计的框架 —— Hyperlane。该框架不仅支持 HTTP 请…...

第四章 表单(3)- 表单验证

在Blazor中&#xff0c;表单的验证可以通过两种方式实现&#xff0c;一种是使用Blazor所提供表单验证特性&#xff0c;另一种是使用ValidationMessageStore进行验证。 表单验证的基础使用(内置特性) 一、内置特性表单验证的开启 Blazor中&#xff0c;使用表单组件<EditFo…...

手撕AVL树

引入&#xff1a;为何要有AVL树&#xff0c;二次搜索树有什么不足&#xff1f; 二叉搜索树有其自身的缺陷&#xff0c;假如往树中插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff0c;因此产生了AVL树&#xff0c…...