应对数据库不断膨胀的数据:缓存和队列中间件

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 【6月更文挑战第5天】该文探讨了优化数据库使用以提升应用系统性能的策略。文中建议利用Redis缓存和MQ消息队列作为辅助工具,以进一步优化性能和减少资源消耗。

1 简介

大厂的应用,服务器和数据库的压力基本持平,中小型软件,服务器压力没有数据库压力大。

将一部分推拉数据功能模块转化为通过服务器缓存或计算去完成,从而将数据库压力转移到服务器。

本文讨论的主要内容包括:

   1)通过服务器缓存和计算转移部分数据库压力;
   2)创建索引提高检索效率,但注意避免影响更新速度; 
   3)减少不必要的数据库交互,利用缓存和计算来减轻数据库负载;
   4)采用数据库分库分表和主从读写分离架构来提升数据库性能,应对高并发;
   5)使用集中式协调器处理分布式事务。 

以上方案也无法降低数据库压力时,还可以凭借分布式数据库,主从读写分离数据库支持横向扩展能力,提升数据库性能,理论上横向扩展数据库性能可以无上限提高数据库承压能力。

创世卵CosmicEgg1.png

因此从代码层,中间层,分布式三个分析分析如何优化数据库使用,提升应用系统性能。

2 在代码层面消化数据库压力

  • 索引

索引是MySQL和Oracle等数据库本身提供的功能,合理创建索引可以提高数据的检索效率,降低数据库服务器IO和CPU的消耗。

但由于索引也会降低更新表的速度,经常增删改的表或字段不适合创建索引.

所以在开发初期,我们就应该根据数据库模型表和字段的作用来决定是否为该表建立索引,为数据记录较多的表中,频繁作为查询条件的字段建立索引。

        class Article(models.Model):
            "article model"
            title = models.CharField('title',max_length=200,)
            class Meta:
                indexes = [models.Index(fields=['title']),]

3 转移压力

在代码层把数据库压力转移到服务器上,要求我们在编写代码的时候,时刻留意代码中是否有过多与数据库进行交互的行为,是否可以通过缓存或计算,来减少与数据库交互的次数。

如一个功能模块的代码写下来,发现多次连接数据库,可以调整为一次性取出所有需要的数据,减少对数据库的查询次数。

又如模块中的某一个值,既可以通过逻辑运算得出,也可以通过数据库读取,在为减轻数据库压力的场景下,我们会选择前者。

4 数据库分库分表

上面几种方法是在应用系统的软实力上做文章,达到为数据库减压的目的,但面对真正庞大的流量袭来时,还是得下硬功夫——提升数据库自身的读写性能。

纵向提高数据库配置,加CPU、加内存,对性能的提升是有限的,幸运的是,目前大部分数据库都支持分布式架构,或主从读写分离架构。

分布式架构数据库由多个计算机系统设备共同组成一个数据库,提供完整的数据库服务,

例如Oracle、MongoDB、TDSQL等,增加计算机系统的数量,就能提升整体数据库性能,理论上分布式架构数据库的性能可以无限提高,这就是为什么大型电商能承受几十亿并发压力的原因之一。

5 主从读写分离架构

主从读写分离架构是专门一个主数据库用来写入数据,另外搭建几个从数据库用于读取数据.

主数据库会把数据的变更同步给几个从数据库,这样就能将数据库的读取压力分散到多台从数据库中,从而实现数据库的减压。

相比于前面几种方案,横向提高数据库性能的成本高昂,并且主库的能力到位了,分库才更能体现价值,产品优化到位了,分布式架构横向扩展的性价比才高,“软实力”和“硬功夫”两者需要有机结合。

6 集中协调器

分布式事务访问一个或多个分区中的数据,这需要昂贵的协调。

集中式协调器充当协调所有行为的全局“警察”。

  • 中间件
    集中式协调器可用作中间件,接受查询请求并将查询路由到正确的分区。

  • 权力下放协调员

在去中心化方法中,节点自行组织。客户端直接将查询发送到其中一个分区。

此主分区会将结果发送回客户端。具体分区负责与其他分区通信并相应地提交。

集中式方法让位于多个客户端尝试获取锁的瓶颈在相同的分区上。

对于分布式 2PL 来说可能更好,因为它具有锁的中央视图并且可以处理死锁更快。
对于分散的方法来说,这并非易事。

7 使用辅助工具

能否合理使用中间件和辅助工具,是考量一个技术经理能力的标准之一,选择和利用各种合适中间件的优势,可以有效提高产品性能,减少资源消耗。在数据读取压力较大的场景中,往往会引入Redis和MQ中间件。

  • 缓存redis

    Redis缓存数据库是将数据以键值对的形式缓存在内存中的高效数据库。

    在开发中,我们可以将一些频繁读取的数据临时存放到Redis,例如中签公告、人员名单、产品清单等,用户在访问这些数据的时候,如果发现缓存中有数据,则无需调用数据库,直接从Redis获取。

    同时,由于内存的读写速率是普通机械硬盘的几百倍,使用Redis作为数据缓存不仅减轻了数据库的压力,数据的存取速度还特别快,可以有效提高数据的调取速率。

    • 队列MQ的使用

    MQ消息队列中间件常用于流量消峰和消息分发。

    利用MQ将同一时刻的大量请求分散成一段时间来处理,可以有效减轻数据库负担;

    另外把消息发布到MQ中供多个客户端监听,也能达到减少数据查询次数的效果。

目录
相关文章
|
8月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
642 57
|
10月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
5月前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
284 3
|
6月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1091 5
|
7月前
|
存储 缓存 监控
一次缓存引发的文件系统数据不一致问题排查与深度解析
本文详述了一次由自研分布式文件系统客户端 EFC 的缓存架构更新所引发的严重数据不一致问题的完整排查过程。
一次缓存引发的文件系统数据不一致问题排查与深度解析
|
10月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
318 32
|
12月前
|
机器学习/深度学习 人工智能 缓存
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
MHA2MLA是复旦大学、华东师范大学、上海AI Lab等机构联合推出的数据高效微调方法,通过引入多头潜在注意力机制(MLA),显著优化基于Transformer的LLM推理效率,降低推理成本。
452 1
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
379 19
|
12月前
|
缓存 NoSQL 关系型数据库
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
248 1
|
12月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)