数据库优化:读写分离,并在SpringBoot项目中代码实现

news2024/11/17 19:03:04

什么要对数据库做读写分离优化。

存在下面两个问题,所以要进行数据库优化

  1. 单表不能太大:mysql官方说法:单表2000万数据,就到达瓶颈了。,所以说为了保证查询效率,得让每张表的大小得到控制。
  2. 查询压力大:在项目中往往是 查询使用的频率 》 增删改的使用的频率,也就是,读的频率》 写的频率

读的使用频率大,写的使用频率小,所以我们可以考虑 读用一个数据库,写用一个数据库

MySQL支持的两主架构通常指的是主从复制(Master-Slave Replication)和主主复制(Master-Master Replication),它们都是用来实现数据库的数据备份、负载均衡和高可用性的方案。

主主模式

        在主主复制中,有两个数据库充当主数据库,每个主数据库都可以处理写入和读取操作。这种架构常用于需要高可用性和负载均衡的场景。但是,主主复制需要更复杂的配置和处理冲突的机制,因为两个主数据库都可以同时进行写入操作,可能会导致数据冲突。 

实现方式

读数据的时候,从两个主数据库中任意一个去查询

写数据得时候

第一种:一个数据库有变更数据,就自动同步到另一个数据库

第二种:双写,写完一个数据库的时候,再把另一个数据库也写了。

主主复制的特点:

  • 高可用性:即使一个主数据库发生故障,另一个主数据库仍然可用。
  • 负载均衡:两个主数据库共同处理写操作,有助于分散负载。
  • 写入冲突:由于两个主数据库都可以写入数据,可能需要解决数据冲突问题

总结:因为它有可能会数据冲突,所以还是有缺陷,不推荐。

主从模式

 如上图所示,在主从复制中,有一个主数据库(Master)和一个或多个从数据库(Slave)。

主数据库负责处理写入操作(INSERT、UPDATE、DELETE等),而从数据库则复制主数据库的数据更改,通常用于读操作。

也就是 主数据库增删改的时候自动同步到从数据库

主从复制的特点:

  • 读写分离:主数据库处理写操作,从数据库处理读操作,从而分担负载。
  • 数据备份:从数据库可以用于灾难恢复和数据备份。
  • 负载均衡:通过将读流量分散到多个从数据库,可以实现负载均衡。
  • 自动晋升:在主数据库出现故障时,可以将一个从数据库提升为新的主数据库。

总结:只做到了缓解查询压力,但是没有解决数据库单表太大的问题,因为主库还是有全部的数据,没有其他库可以为它分担一些压力,所以还是不推荐。

多主多从

为了解决主从模式的问题,我们可以使用多主多重的模式。

将表拆开,拆成几个子表,然后分别使用主从模式,这样就解决了主从模式没有解决数据库单表太大的问题。

实现方式

具体怎么查分表?可以用取余的操作,如果你要拆分成3个子表,那就对3进行取余,余0一个表,余1一个表,余2一个表

程序在进行操作之前,先计算出来应该走哪个库

冷热分离

如果数据量再大,几亿的那种的时候,可以采取冷热分离的策略。

冷热分离(Hot-Cold Separation)是数据库优化中的一种策略,旨在通过将访问频率较低的数据(冷数据)和访问频率较高的数据(热数据)分开存储和管理,以提高数据库性能、降低成本,并优化查询效率。这种策略通常应用于大型数据库环境,其中数据集非常庞大且访问模式存在明显的变化。

  • 热数据是指经常被访问的数据,如最近的数据或常用的数据。
  • 冷数据则是相对不经常被访问的数据,比如历史数据或不常用的数据。

代码实现读写分离

mybatisPlus实现多数据源

多数据源 | MyBatis-Plus (baomidou.com)

1.引入dynamic-datasource-spring-boot-starter。

 

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

 2.配置数据源。

在yaml配置文件中配置,master 就是主数据库,slave_1就是一个从数据库,也就是一个项目引入了多个数据库

spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        slave_1:
          url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
        slave_2:
          url: ENC(xxxxx) # 内置加密,使用请查看详细文档
          username: ENC(xxxxx)
          password: ENC(xxxxx)
          driver-class-name: com.mysql.jdbc.Driver
       #......省略
       #以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

 

使用 @DS 切换数据源。

 

例如:不用的mapper可以通过注解连接不同的数据库

一个mapper连接master数据库

对应这配置文件中的

datasource:
        master:

 

 

方法1:手动加注解(不推荐)

直接用mybatisPlus的这个注解

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

我们就可以 让某个mapper里只有读操作给其加个注解,某个mapper里面只有增删改操作给其加个注解

或者直接查询方法上加注解走“查询库”,增删改的方法上加注解走“写库”

优点:

  1. 简单

缺点:

  1. 代码改动量太大了,很多地方都要加注解
  2. 用条件构造器的方法没办法指定

方法2:mybatis拦截器(不推荐)

通过拦截器来切换数据库,拦截所有的sql,出现insert、update、delete就走主库,出现select就走从库

优点:对代码侵入比较小

缺点:事务没办法保证

方法3:中间件

既能代码侵入小,又能保证事务,这样的最好

方案1:mycat

部署mycat,使用mycat进行数据源管理

MyCAT是一个强大的数据库中间件,不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。

适用于有专门团队维护的大型企业,或者大团队。

太麻烦了,还得部署这里不推荐。

方案2:sharding-jdbc(推荐)

是一个类似mybatis的东西,我们可以不用部署其他中间件,也不需要改代码。

Sharding-JDBC定位为轻量Java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。

Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。

适用于中小企业,或者中小团队。

具体的用sharding-jdbc 实现读写分离,请看下集讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/928628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源微服务如何选型?Spring Cloud、Dubbo、gRPC、Istio 详细对比

作者&#xff1a;刘军 不论您是一名开发者、架构师、CTO&#xff0c; 如果您曾深度参与在微服务开发中&#xff0c;那么相信您一定有过开源微服务框架或体系选型的疑问&#xff1a;Apache Dubbo、Spring Cloud、gRPC 以及 Service Mesh 体系产品如 Istio&#xff0c;到底应该选…

《扩散模型 从原理到实战》Hugging Face (一)

文章目录 前言第一章 扩散模型简介1.1 扩散模型的原理1.1.1 生成模型1.1.2 扩散过程 前言 Hugging Face最近出版了第一本中文书籍《扩散模型 从原理到实战》&#xff0c;其中内容关于扩散模型&#xff08;Diffusion Model&#xff09;&#xff0c;和AIGC相关的内容较多&#x…

Search Ads Toggle有效推广:结合IPIDEA代理IP的TikTok营销策略

TikTok 本月22日推出了一个搜索广告切换(Search Ads Toggle)的新功能&#xff0c;这个功能对于广告商来说&#xff0c;更容易触达有明确搜索意向的目标受众。谷歌有研究显示&#xff0c;现在的年轻用户群体更倾向于把Tik Tok这样的社交媒体软件当做搜索引擎来使用&#xff0c;比…

Redis问题集合(三)在Redis容器里设置键值对

前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录&#xff0c;方便后续查看 步骤 查看Redis容器的ID&#xff1a;docker ps -a 进入容器&#xff1a;docker exec -it 容器ID /bin/bash进入redis命令行&#xff1a;redis-cli输入密码&#xff1a;auth 配置密码 查看…

L1-033 出生年(Python实现) 测试点全过

题目 以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不…

使用EF Core更新与修改生产数据库

使用EF Core的Code First&#xff0c;在设计阶段&#xff0c;直接使用Database.EnsureCreated()和EnsureDeleted()可以快速删除、更新最新的数据结构。由于没有什么数据&#xff0c;删除的风险非常低。但是对于已经投入生产的数据库&#xff0c;这个方法就绝对不可行了。 考虑…

vue3学习源码笔记(小白入门系列)------ 组件是如何渲染成dom挂载到指定位置的?

文章目录 os准备组件如何被挂载到页面上第一步 createApp 做了哪些工作&#xff1f;ensureRendererbaseCreateRenderercreateAppAPImountrenderpatchprocessComponentprocessElement 总结 os 学习一下vue3 源码&#xff0c;顺便记录分享下 使用vitest 插件调试源码 辅助阅读 …

0825|C++day5 运算符重载+静态成员+类的基础【Xmind+实例】

一、运算符重载 实例&#xff1a;&#xff08;赋值运算符、自增自减运算符、插入提取运算符&#xff09; #include <iostream>using namespace std;class Person {friend Person & operator(Person &L,const Person &R);friend Person & operator(Perso…

RabbitMQ 集群

clustering 最开始我们介绍了如何安装及运行 RabbitMQ 服务&#xff0c;不过这些是单机版的&#xff0c;无法满足目前真实应用的要求。如果 RabbitMQ 服务器遇到内存崩溃、机器掉电或者主板故障等情况&#xff0c;该怎么办&#xff1f;单台 RabbitMQ服务器可以满足每秒 100…

DDR与PCIe:高性能SoC的双引擎

SoC芯片无处不在&#xff0c;小到家电控制的MCU&#xff0c;大到手机芯片&#xff0c;我们都会接触到。如今大部分芯片设计公司都在开发SoC芯片&#xff0c;一颗SoC芯片可以集成越来越多的功能&#xff0c;俨然它已成为IC设计业界的焦点。 高性能、高速、高带宽的互联和存储的…

SpringIoC基于注解配置

目录 一、Bean注解标记和扫描 (IoC) 二、组件&#xff08;Bean&#xff09;作用域和周期方法注解 三、Bean属性赋值&#xff1a;引用类型自动装配 (DI) 四、Bean属性赋值&#xff1a;基本类型属性赋值 (DI) 一、Bean注解标记和扫描 (IoC) 一、注解方式介绍 1.注解介绍 和…

不同版本.net引用同一个项目

项目文件.csproj文件内容如下&#xff1a; 重点是&#xff1a;不能有其他的 netstandard2;net40;net45;net46;net6 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>netstandard2;net40;net45;net46;net6</TargetFrame…

学习pytorch5 常用的transforms

常用的transforms 1. ToTensor()2. Normalize() 1. ToTensor() 2. Normalize() # 1. ToTensor 把PIL图片类型数据或ndarry numpy数据类型转换为tensor类型数据 from cv2 import imread from torchvision import transforms from torch.utils.tensorboard import SummaryWrit…

Java | IDEA中Netty运行多个client的方法

想要运行多个client但出现这种提示&#xff1a; 解决方法 1、打开IDEA&#xff0c;右上角找到下图&#xff0c;并点击 2、勾选

2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】

目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识&#xff08;GAN \ Diffusion&#xff09; 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D &#xff08;网课含PPT&#xff09; 2. sjtu生成模型课件 3. ge…

截止到目前全国全量在营企业数量有多少?

企业是现代经济社会中最重要的参与主体&#xff0c;它的每一项行为都直接或者间接地关联社会经济总量的变化。 企业数量有什么作用&#xff1f; 谈到企业数量&#xff0c;我们会想到相关行业发展&#xff0c;就业岗位&#xff0c;经济发展等方面的关联。但其实早在13年&#…

限时 180 天,微软为 RHEL 9 和 Ubuntu 22.04 推出 SQL Server 2022 预览评估版

导读近日消息&#xff0c;微软公司今天发布新闻稿&#xff0c;宣布面向 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;9 和 Ubuntu 22.04 两大发行版&#xff0c;以预览模式推出 SQL Server 2022 评估版。 近日消息&#xff0c;微软公司今天发布新闻稿&#xff0c;宣布…

迅镭激光高功率激光切割设备中标中国机械500强露笑集团!

近日&#xff0c;迅镭激光与中国机械500强、中国民营企业制造业500强露笑集团达成战略合作&#xff0c;成功签约10套激光切割设备&#xff0c;其中包括5套GK系列高功率光纤激光切割机、2套GI系列高功率光纤激光切割机、3套光纤激光切管机&#xff0c;这些设备将用于露笑集团全资…

CSS概念

1、CSS与HTML结合方式 1.1 第一种方式 内联/行内样式 就是在我们的HTML标签上通过style属性来引用CSS代码。 优点:简单方便 &#xff1b; 缺点:只能对一个标签进行修饰。 1.2 第二种方式 内部样式 我们通过<style>标签来声明我们的CSS. 通常<style>标签我们推荐写在…

性能优化——分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…