高效并发一直都是面试中的热门面试题,几乎每家公司都会提到这个问题,这个问题并没有什么标准答案,所以面试官注重于你考虑这个问题的方式与你解决这个问题的思路,下来我分享一下自己的回答思路,如有错误请大家在评论区指出。

总体思路

1、硬件优化
2、代码优化
3、数据库优化

1、硬件优化

1、“让计算机并发执行若干个运算任务”与“更充分地利用计算机处理

器的效能”之间的因果关系, 看起来理所当然, 实际上它们之间的关系

并没有想象中那么简单, 其中一个重要的复杂性的来源是绝大多数的运

算任务都不可能只靠处理器“计算”就能完成。 处理器至少要与内存交

互, 如读取运算数据、 存储运算结果等, 这个I/O操作就是很难消除的

(无法仅靠寄存器来完成所有运算任务) 。 由于计算机的存储设备与处

理器的运算速度有着几个数量级的差距, 所以现代计算机系统都不得不

加入一层或多层读写速度尽可能接近处理器运算速度的高速缓存

(Cache) 来作为内存与处理器之间的缓冲: 将运算需要使用的数据复

制到缓存中, 让运算能快速进行, 当运算结束后再从缓存同步回内存之

中, 这样处理器就无须等待缓慢的内存读写了。

java高并发秒杀面试题 java解决高并发面试_java高并发秒杀面试题


所以在对硬件进行优化的时候,最主要的就是保证处理器的处理速度与内存的读写速度尽可能接近,保证处理器的性能不被浪费。其次才是对各个硬件进行优化处理,最常见的就是更换最新的存储设备或者处理器。

2、再就是需要从硬盘读取数据的时候,与内存直接进行交互的应该首选固态硬盘,因为固态硬盘的读写速度更快,另外还应该在机械硬盘及时存储一份备份数据,因为固态硬盘一旦损坏其内部的数据很难找回来,而机械硬盘虽然读写速度低一点,但是它就算是损坏了,其内部的数据也可以找回90%以上。

3、其三就是优化服务器的带宽,因为服务器可能要同时接收非常大量的请求和要同时发出非常大量的响应,所以这时候就需要有足够的带宽来保证数据及时被接收或者发出,避免造成因数据积压而导致性能底下。

2、代码优化

1、在代码优化方面,首当其冲的就是多线程的使用了,因为多线程充分利用多核CPU的计算能力,通过多线程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。

2、其次就是对线程池的使用了,线程池有以下优点:

降低资源消耗:重用存在的线程,减少对象创建销毁的开销。

提高响应速度:可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。当任务到达时,任务可以不需要的等到线程创建就能立即执行。

提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

所以,熟练使用线程池可大大降低资源的消耗和创建线程所消耗的时间,从而提升服务器效率。

3、锁机制的优化,在多线程的条件下,我们要保证数据的准确性就得加入锁机制,但是锁也是可以优化的,比如某个数据读比较频繁很少有写的操作,我们就可以对它使用乐观锁。并且,我们可以将数据分段加锁来提升并发访问的效率等,这一点大家可以去找一下锁优化相关的主题来阅读。

3、数据库优化

1、数据库SQL优化
保证查询语句尽量命中索引从而提升查询速度,尽量是需要什么数据查询什么数据,不要查询多段数据之后再进行筛选
2、加入缓存机制
对于缓存我想大家都不陌生,缓存可以让我们将一些有时效性的、经常访问的、不便于存储数据库等的数据,我们可以将数据存储在专门的用于缓存的应用程序中,如果有必要,还可以将缓存应用服务器单独部署,如果数据量过大,我们还可以组成缓存服务器集群,比如:cache、redis等都是比较专注于缓存数据的。只所以使用缓存,是因为一是减少数据库的访问压力,二是一般专注于缓存的应用对于数据的读写较于数据库都是非常快的。
3、数据库读写分离
读写分离是为了提供程序的性能,随着用户的增加,数据库的压力也会越来越大,对数据库或者SQL的基本优化可能达不到最终的效果,读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作。主数据库提供写操作,从数据库提 供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。
4、数据库活跃数据分离
用微博来举例,一个大V通常有几百万甚至上千万粉丝,所以他们的数据是要被很多人同时看到的,这样的数据就可以称之为活跃数据,如果用普通用户的数据处理方法来处理大V的数据就会导致性能底下。所以,我们可以将活跃数据分离出来对他们进行特殊的逻辑处理来提升效率。

以上就是我对高并发问题的一些大体思路,如果有不足或者错误的地方欢迎大家在评论区留言。最后为大家推荐一本有关高并发的书《设计数据密集型应用》。