假设数据库成为了性能瓶颈点,动态数据查询如何提升效率?

MySQL数据库成为瓶颈后,动态数据查询要如何加速? 缓存,一种存储数据的组件,让对数据的请求更快返回。经常会把缓存放在内存, 所以有人就以为内存=缓存,这是外行见解。某些场景下可能还会使用SSD作为冷数据的缓存。比如说360开源的Pika就是使用SSD存储数据解决Redis的容量瓶颈的。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存。常见硬件组件的延时情况是什么样的了,这样在做方案的时候可以对延迟有更直观的印象。做一次内存寻址大概需要100ns,而做一次磁盘的查找则需要10ms。... 阅读详情

假设我们有一个这样的电商系统,并且这个系统完成了对数据库的主从分离和分库分表之后,已经可以支撑十几万 DAU 了,整体系统的架构如下:

从整体上看,数据库分成了主库和从库,数据也被切分到多个数据库节点上。但随着并发的增加,存储数据量的增多,数据库的磁盘 IO 逐渐成了系统的瓶颈,我们需要一种访问更快的组件来降低请求响应时间,提升整体系统性能。这时我们就会使用缓存。那么什么是缓存,我们又该如何将它的优势最大化呢?

由于篇幅限制,只能给大家展示小部分内容,

全套面试笔记及答案【点击此处】即可免费获取

31.1 什么是缓存

缓存,是一种存储数据的组件,它的作用是让对数据的请求更快地返回。

我们经常会把缓存放在内存中来存储, 所以有人就把内存和缓存画上了等号,这完全是外行人的见解。作为业内人士,你要知道在某些场景下我们可能还会使用 SSD 作为冷数据的缓存。比如说 360 开源的 Pika 就是使用 SSD 存储数据解决 Redis 的容量瓶颈的。

实际上,凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存。那么说到这儿我们就需要知道常见硬件组件的延时情况是什么样的了,这样在做方案的时候可以对延迟有更直观的印象。幸运的是,业内已经有人帮我们总结出这些数据了,我将这些数据整理了一下,你可以看一下。

从这些数据中,你可以看到,做一次内存寻址大概需要 100ns,而做一次磁盘的查找则需要 10ms。如果我们将做一次内存寻址的时间类比为一个课间,那么做一次磁盘查找相当于度过了大学的一个学期。可见,我们使用内存作为缓存的存储介质相比于以磁盘作为主要存储介质的数据库来说,性能上会提高多个数量级,同时也能够支撑更高的并发量。所以,内存是最常见的一种缓存数据的介质。

缓存作为一种常见的空间换时间的性能优化手段,在很多地方都有应用,我们先来看几个例子,相信你一定不会陌生。

31.2 缓存案例

Linux 内存管理是通过一个叫做 MMU(Memory Management Unit)的硬件,来实现从虚拟地址到物理地址的转换的,但是如果每次转换都要做这么复杂计算的话,无疑会造成性能的损耗,所以我们会借助一个叫做 TLB(Translation Lookaside Buffer)的组件来缓存最近转换过的虚拟地址,和物理地址的映射。TLB 就是一种缓存组件,缓存复杂运算的结果,就好比你做一碗色香味俱全的面条可能比较复杂,那么我们把做好的面条油炸处理一下做成方便面,你做方便面的话就简单多了,也快速多了。这个缓存组件比较底层,这里你只需要了解一下就可以了。

在大部分的笔记本,桌面电脑和服务器上都会有一个或者多个 TLB 组件,在不经意间帮助我们加快地址转换的速度。

再想一下你平时经常刷的抖音。平台上的短视频实际上是使用内置的网络播放器来完成的。网络播放器接收的是数据流,将数据下载下来之后经过分离音视频流,解码等流程后输出到外设设备上播放。

如果我们在打开一个视频的时候才开始下载数据的话,无疑会增加视频的打开速度(我们叫首播时间),并且播放过程中会有卡顿。所以我们的播放器中通常会设计一些缓存的组件,在未打开视频时缓存一部分视频数据,比如我们打开抖音,服务端可能一次会返回三个视频信息,我们在播放第一个视频的时候,播放器已经帮我们缓存了第二、三个视频的部分数据,这样在看第二个视频的时候就可以给用户“秒开”的感觉。

除此之外,我们熟知的 HTTP 协议也是有缓存机制的。当我们第一次请求静态的资源时,比如一张图片,服务端除了返回图片信息,在响应头里面还有一个“Etag”的字段。浏览器会缓存图片信息以及这个字段的值。当下一次再请求这个图片的时候,浏览器发起的请求头里面会有一个“If-None-Match”的字段,并且把缓存的“Etag”的值写进去发给服务端。服务端比对图片信息是否有变化,如果没有,则返回浏览器一个 304 的状态码,浏览器会继续使用缓存的图片信息。通过这种缓存协商的方式,可以减少网络传输的数据大小,从而提升页面展示的性能。

31.3 缓存与缓冲

讲了这么多缓存案例,想必你对缓存已经有了一个直观并且形象的了解了。除了缓存,我们在日常开发过程中还会经常听见一个相似的名词——缓冲区,那么,什么是缓冲区呢?缓冲和缓存只有一字之差,它们有什么区别呢?

我们知道,缓存可以提高低速设备的访问速度,或者减少复杂耗时的计算带来的性能问题。理论上说,我们可以通过缓存解决所有关于“慢”的问题,比如从磁盘随机读取数据慢,从数据库查询数据慢,只是不同的场景消耗的存储成本不同。

缓冲区则是一块临时存储数据的区域,这些数据后面会被传输到其他设备上。缓冲区更像“消息队列篇”中即将提到的消息队列,用以弥补高速设备和低速设备通信时的速度差。比如,我们将数据写入磁盘时并不是直接刷盘,而是写到一块缓冲区里面,内核会标识这个缓冲区为脏。当经过一定时间或者脏缓冲区比例到达一定阈值时,由单独的线程把脏块刷新到硬盘上。这样避免了每次写数据都要刷盘带来的性能问题。

以上就是缓冲区和缓存的区别,从这个区别来看,上面提到的 TLB 的命名是有问题的,它应该是缓存而不是缓冲区。

现在你已经了解了缓存的含义,那么我们经常使用的缓存都有哪些?我们又该如何使用缓存,将它的优势最大化呢?

31.4 缓存分类

在我们日常开发中,常见的缓存主要就是静态缓存、分布式缓存和热点本地缓存这三种。

静态缓存在 Web 1.0 时期是非常著名的,它一般通过生成 Velocity 模板或者静态 HTML 文件来实现静态缓存,在 Nginx 上部署静态缓存可以减少对于后台应用服务器的压力。例如,我们在做一些内容管理系统的时候,后台会录入很多的文章,前台在网站上展示文章内容,就像新浪,网易这种门户网站一样。

当然,我们也可以把文章录入到数据库里面,然后前端展示的时候穿透查询数据库来获取数据,但是这样会对数据库造成很大的压力。虽然我们使用分布式缓存来挡读请求,但是对于像日均 PV 几十亿的大型门户网站来说,基于成本考虑仍然是不划算的。

所以解决思路是每篇文章在录入的时候渲染成静态页面,放置在所有的前端 Nginx 或者 Squid 等 Web 服务器上,这样用户在访问的时候会优先访问 Web 服务器上的静态页面,在对旧的文章执行一定的清理策略后,依然可以保证 99% 以上的缓存命中率。

这种缓存只能针对静态数据来缓存,对于动态请求就无能为力了。那么我们如何针对动态请求做缓存呢?这时就需要分布式缓存了。

分布式缓存的大名可谓是如雷贯耳了,我们平时耳熟能详的 Memcached、Redis 就是分布式缓存的典型例子。它们性能强劲,通过一些分布式的方案组成集群可以突破单机的限制。所以在整体架构中,分布式缓存承担着非常重要的角色(接下来的课程会专门针对分布式缓存,了解分布式缓存的使用技巧以及高可用的方案,让你能在工作中对分布式缓存运用自如)。

对于静态的资源的缓存你可以选择静态缓存,对于动态的请求你可以选择分布式缓存,那么什么时候要考虑热点本地缓存呢?

答案是当我们遇到极端的热点数据查询的时候。热点本地缓存主要部署在应用服务器的代码中,用于阻挡热点查询对于分布式缓存节点或者数据库的压力。

比如某一位明星在微博上有了热点话题,“吃瓜群众”会到他 (她) 的微博首页围观,这就会引发这个用户信息的热点查询。这些查询通常会命中某一个缓存节点或者某一个数据库分区,短时间内会形成极高的热点查询。

那么我们会在代码中使用一些本地缓存方案,如 HashMap,Guava Cache 或者是 Ehcache 等,它们和应用程序部署在同一个进程中,优势是不需要跨网络调度,速度极快,所以可以用来阻挡短时间内的热点查询。来看个例子。

比方说你的垂直电商系统的首页有一些推荐的商品,这些商品信息是由编辑在后台录入和变更。你分析编辑录入新的商品或者变更某个商品的信息后,在页面的展示是允许有一些延迟的,比如说 30 秒的延迟,并且首页请求量最大,即使使用分布式缓存也很难抗住,所以你决定使用 Guava Cache 来将所有的推荐商品的信息缓存起来,并且设置每隔 30 秒重新从数据库中加载最新的所有商品。

首先,我们初始化 Guava 的 Loading Cache:

CacheBuilder<String, List<Product>> cacheBuilder = CacheBuilder.newBuilder().maximumSize(maxSize).recordStats(); //设置缓存最大值
cacheBuilder = cacheBuilder.refreshAfterWrite(30, TimeUnit.Seconds); //设置刷新间隔
 
LoadingCache<String, List<Product>> cache = cacheBuilder.build(new CacheLoader<String, List<Product>>() {
    @Override
    public List<Product> load(String k) throws Exception {
        return productService.loadAll(); // 获取所有商品
    }
});

这样,你在获取所有商品信息的时候可以调用 Loading Cache 的 get 方法,就可以优先从本地缓存中获取商品信息,如果本地缓存不存在,会使用 CacheLoader 中的逻辑从数据库中加载所有的商品。

由于本地缓存是部署在应用服务器中,而我们应用服务器通常会部署多台,当数据更新时,我们不能确定哪台服务器本地中了缓存,更新或者删除所有服务器的缓存不是一个好的选择,所以我们通常会等待缓存过期。因此,这种缓存的有效期很短,通常为分钟或者秒级别,以避免返回前端脏数据。

 ……

数据库查询慢到崩溃?这7个优化技巧让系统快10倍! 数据库查询性能优化是一个永恒的话题,没有一劳永逸的解决方案。我们需要根据实际的业务场景和数据量,选择合适的优化策略。记住:性能优化是一个持续迭代的过程,需要不断地监控、分析和调整。最重要的是,始终把用户体验放在第一位。咱们下期见~ 阅读详情

相关推荐

Windows 本地 PostgreSQL 忘记 postgres 密码后,如何重置密码并给 root 用户最高权限

<think>我们只需要根据内容生成摘要,不超过150字。摘要应该简明扼要概括主要问题和解决步骤。注意是中文摘要。</think>在Windows本地开发中,因root数据库账号无CREATEDB权限且忘记postgres超级管理员密码,通过临时修改pg_hba.conf为trust认证重置密码,并重启PostgreSQL服务进行登录,最后授予root用户SUPERUSER等权限,完成数据库创建。

MZH 34

提升动态数据查询效率:应对数据库成为性能瓶颈的优化方案

索引优化:通过正确设计和使用索引来提高查询性能。缓存机制:引入缓存系统,减少数据库查询压力。分库分表:对大表进行拆分,减轻单库和单表的负载。SQL 优化:通过分析和优化 SQL 查询,减少查询时间。数据库连接池优化:提高数据库连接池的使用效率Java 应用层优化:通过合理的代码设计和多线程并发提升查询效率

lssffy的博客 2379

基于深度学习的鸟类检测识别系统:YOLOv5 + YOLOv8 + YOLOv10 + UI界面 + 数据集

YOLOv5是当前目标检测领域非常流行的模型,具有良好的检测精度和实时推理速度。其网络结构相比前几代YOLO模型进行了优化,尤其是在检测精度和计算效率上有了显著提高。YOLOv5特高效性:能够在较低的硬件环境下进行实时检测。易于部署和使用:YOLOv5提供了简单的API接口,方便开发者快速集成和使用。优异的精度:在多个数据集上测试,表现出色。本文详细介绍了基于YOLOv5、YOLOv8和YOLOv10的鸟类检测识别系统的设计与实现。

YOLO 1097

系统优化:假设数据库成为性能瓶颈动态数据查询场景如何提升效率

通过 Etag 和 If-None-Match,浏览器可以缓存静态资源,减少网络传输,提高页面加载速度。用于存储不经常变化的静态数据,例如门户网站的文章、新闻列表等内容,用户访问时直接返回缓存的页面。在视频播放平台如抖音中,播放器会预先缓存后续的视频数据,以提升用户的首播速度并避免卡顿。用户查询不存在的数据,由于缓存没有命中,所有请求都会直接打到数据库,可能导致数据库崩溃。:制作面条的复杂过程可以看作地址转换,而 TLB 的缓存就像方便面,省时省力。在现代的电商系统中,数据库通常是性能优化的重要对象。

流楚丶格念的博客 921

假设数据库成为性能瓶颈动态数据查询如何提升效率

假设我们有一个这样的电商系统,并且这个系统完成了对数据库的主从分离和分库分表之后,已经可以支撑十几万 DAU 了,整体系统的架构如下:

wdj_yyds的博客 1067

Java场景面试题】假设数据库成为性能瓶颈动态数据查询如何提升效率

缓存,是一种存储数据的组件,它的作用是让对数据的请求更快地返回。我们经常会把缓存放在内存中来存储, 所以有人就把内存和缓存画上了等号,这完全是外行人的见解。作为业内人士,你要知道在某些场景下我们可能还会使用 SSD 作为冷数据的缓存。比如说 360 开源的 Pika 就是使用 SSD 存储数据解决 Redis 的容量瓶颈的。实际上,凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为缓存。

JAVA_aik的博客 942

数据库性能瓶颈优化策略

本文系统化地介绍了数据库性能优化的三个阶段。第一阶段聚焦低成本高收益方案:精细化索引优化、SQL语句优化和数据库配置调优;第二阶段引入应用架构优化:使用缓存、读写分离和消息队列等手段;第三阶段涉及高级架构方案:垂直分库和水平分片等数据拆分策略。特别针对动态数据查询场景,建议采用Elasticsearch等专用搜索系统或物化视图方案。整体优化应遵循"诊断先行、由浅入深"原则,从简单索引优化逐步过渡到复杂架构改造,最终实现性能提升

初心未改 617

数据库优化与分库分表策略:提升高并发应用的性能

在高并发、大数据量的场景下,数据库性能优化是后端开发中不可忽视的重要课题。分库分表作为一种有效的扩展策略,能够通过水平和垂直划分数据,减轻单库的压力,提升查询效率。然而,分库分表的设计与实现需要结合具体的业务场景,合理选择分库、分表的规则,并在应用层和数据库层做好相应的支持。通过分库分表以及其他数据库优化技术的结合使用,开发者能够有效应对大规模用户请求和数据存储的挑战,构建高效、可扩展的后端系统。

桂月二二博客 1403

电商搜索 API 的优化与性能提升:从瓶颈突破到体验升级

电商搜索API性能优化已成为提升用户留存与平台转化的关键。文章系统分析了电商搜索API的四大核心瓶颈:数据处理效率低、索引设计不合理、并发处理能力不足及个性化计算耗时。针对性提出"数据层-索引层-查询层-并发层-个性化层"全链路优化方案,包括分层存储、实时同步、复合索引设计、查询缓存、弹性扩容等策略。某头部电商实施后,搜索延迟下降75%,大促峰值响应稳定在200ms内,转化率提升12%。未来趋势将融合AI语义理解、Serverless架构和实时数据湖技术,推动搜索API向智能预判方向发展

weixin_41943766的博客 1027

Java开源在线考试系统怎么选?从技术选型到落地部署的完整指南

Java开源在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java开源在线考试系统的选型要

麦塔在线考试培训系统 344

数据库迁移不翻车:golang-migrate 实战,143 个 DDL 有序执行(第97篇-E83)

上一篇 讲了 Agent 怎么测试。但还有一个更基础的问题:数据库 schema 怎么变? 手动跑 SQL 总有人忘了加列、忘了写 down、忘了更新 CI。版本号撞车。dirty 状态没人管。DeepFlux 的答案是:golang-migrate + embed.FS + CI 链守卫 + 哨兵探针。这篇拆解 143 个迁移(000001~000143)是怎么做到不翻车的。

leeyisoft的专栏 191

cpp选手秋招学习笔记 day18

幂等是指一次或多次执行同一个操作,得到的业务结果是相同的,比如对于扣费,客户端因为网络问题重新发出请求,服务端不会进行多次处理,解决方法是可以客户端携带一个独特的唯一的id,然后服务端执行完之后存储这个id,之后新的请求到来比对id。主要是由cpu的内存管理逻辑维护,然后运行时动态的传递给CUDA的kernel,使用的时候传递这个block table,放置在GPU的显存。移动是指把资源的所有者权限转移,原有的变量有效但是状态不确定,赋值是拷贝复制对象,原对象不变。1.什么是幂等,如何保证。

m0_57222081的博客 265

商超智能运营如何落地?从系统架构到实战避坑的完整技术路径

3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)和**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。

weixin_56812938的博客 460

Oracle迁移到PostgreSQL数据库-FGOracle2PG工具

FGOracle2PG 是一款高性能、高可靠的 Oracle 数据库到 PostgreSQL 数据库迁移工具。它由风哥基于多年数据库运维与迁移实战经验开发。工具采用纯 Python 实现,支持命令行(CLI)与可视化 Web 控制台两种操作方式,能够覆盖从开发测试到生产环境的全场景数据库迁移需求。

风哥oracle/mysql/pg技术教程 186

基于Python的爱奇艺视频数据可视化分析系统

长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。

qq_35928134的博客 236

windows版本oracle19c安装教程-新手教程

windows版本oracle19c安装教程-新手教程、oracle19c新手教程 、oracle19c新手安装教程、oracle19c安装教程 windows版本

qq_27076243的博客 178

电商推返模式的技术架构与系统落地实践

成功的电商推返模式系统,本质是。

weixin_42804741的博客 188

Django的手机数据分析与可视化

Django的手机数据分析与可视化系统 摘 要 本系统基于Django框架、HTML和MySQL数据库技术,构建了一个全面的手机数据分析与可视化平台。大屏内容丰富,包括品牌市场份额分布、手机价格区间分布、各维度评分分布、热门机型Top10、内存容量分布以及品牌评分与价格分析等多个模块。通过这些模块,用户可以直观地了解手机市场的整体趋势、各品牌的市场表现、手机价格分布情况、用户评分分布以及热门机型的详细信息。系统采用了先进的可视化技术,将复杂的数据以图表的形式呈现,使得数据更加易于理解和分析。 在管理功能方

weixin_41915110的博客 775

MySQL 數據庫導入

2. 查詢sql語句模式。

MyFreeIT 14

十五、SAP-物料需求计划(MRP)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1025

Huawei Fat&CloudAP7060DN-V200R019C00SPC926

Huawei Fat&CloudAP7060DN_V200R019C00SPC926,里面包含版本说明书和升级指导书,该版本支持哪些型号,支持哪些版本可以直接升级到当前版本,请参考版本说明书和升级指导书。

上一篇: 2025年最新Java面试题(场景题➕八股文)及答案汇总(精选100w字,赶紧刷起来!)
下一篇: 索引失效的问题是如何排查的,有哪些种情况?
Java阿福
博客等级 码龄1年 61粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值