当前位置:网站首页>读写分离后,性能居然提升100%了呀

读写分离后,性能居然提升100%了呀

2022-08-09 11:44:00 Park33448

今天来聊一个简单但重要的问题。最近自己搭建了一个项目玩一下,跑起来也是挺顺溜的,但是,在做压测的时候,发现接口的性能出现瓶颈,最后发现慢动作出现在MySQL.

这可咋办呢?索引也优化了,连接池也用上了,Redis缓存命中率也符合预期。然而,所有的请求都集中在一台主MySQL上,压测的时候,还是挺吃力的,那就来试试读写分离吧。

一. 主从复制逻辑

数据库一主多从,是很经典的结构,对于数据库的容灾、可扩展性和高可用性,都是有好处的。一主多从,依赖于主从复制,下面是主从复制的逻辑图,一起来看看:

主从复制后,可以认为,从库和主库的内容是"一致"的,这里指的是最终一致性。 对读实时性要求不高的业务场景中,读写分离是没有问题的,数据会最终一致。

然而,必须要说的是,由于主从复制需要时间,向主库写入数据后,如果直接从从库读取,可能读不到最新的值。所以,具体读主库还是从库,取决于业务场景。

主从复制后,就可以开心地进行读写分离了。具体来说就是,让所有的写请求调度到主库,让大量读请求调度到从库。读写分离的逻辑图如下,非常直观且易懂:

二. 读写分离效果

在实际测试中,将大量的读请求调度到从库,在主库上留下写请求和少量的读请求,可以看到,读写分离后,主库上的少量读请求耗时立即明显下降且稳定:

​而且,实际也发现,调读到从库上后,大量读请求的耗时也有下降。自然地,主库上的写请求的性能也提升了近100%。读写分离的好处,可见一斑。爽爽哒!

对于应用服务来说,也可做读写分离。比如某服务提供读和写的接口,主调方可做读写分离,这样就能针对读和写进行不同的伸缩策略,提升了扩展的弹性。

这篇文章的内容很简单,关键在于理解主从复制的过程,以及读写分离的原理。而且,对于软件开发人员来说,动手实践是极好的学习方式。实践之后,体会了过程,看到了结果,知识和技能就是自己的了。一起加油吧。

后记

说我太短,不给推荐...... 行吧

求一个整数,在内存当中存储时,二进制1的个数。

方法一:一个整型的数字共32个比特位,每个比特位如何判断是否为1?只需让这一位和1进行按位与即可

import java.util.Scanner;
public class test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n= scanner.nextInt();
        int count=0;
        for (int i = 1; i <=32 ; i++) {
            if(((n>>i)&1)==1){
                count++;
            }
        }
        System.out.println("二进制中1的个数:"+count);
    }
}

这种方法的缺陷在于:每个数都要按位与完32位,比如1只有第一位是1,后面31个0没有必要比较

优化:

import java.util.Scanner;
public class Main{
    public static void main1(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int count = 0;
        while (n != 0) {//如果移动的过程当中是0了,就结束循环
            if((n & 1) != 0) {
                count++;
            }
            n = n >>> 1;
        }
        System.out.println(count);
    }
}

方法二:

采用相邻的两个数据进行按位与运算

第一次循环:n=7  n=n&(n-1) = 7 & 6 = 6

第二次循环:n=6  n=n&(n-1)= 6 & 5= 4

第三次循环:n=4  n=n&(n-1)=4 & 3= 0

此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    int count = 0;
    while (n != 0) {
        n = n & (n-1);
        count++;
    }
    System.out.println(count);
}

原网站

版权声明
本文为[Park33448]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Park33/article/details/126227324