轧岔
昨天 10:34
在面试中,并发模块是一定会问到的知识点。而问到并发模块,如何提升项目并发性能?又是一个高频的面试题。
但这道面试题大部分同学都回答不好,且没有清晰的回答逻辑链,所以接下来这篇文章咱们给大家系统的梳理一下如何回答这个问题?(文章最后有视频解析)
0.概述
想要提升项目并发性能其实不难,只需要记住三个字即可:代、中、架。
什么意思呢?请看这幅图:
1.代码层面
1.1 使用并发编程和异步编程
想象一下餐厅只有一个服务员是什么场景?客人点餐、上菜、结账全都得排队。如果多几个服务员,效率就完全不同了。代码也是如此,使用多线程处理任务,相当于增加了多个“服务员”。
异步编程就更进一步了——服务员接到点单后,不是站在原地等厨师做菜,而是先去服务其他客人,等菜好了再过来。
Java 中的 CompletableFuture、Spring 的 @Async 注解、线程池、动态线程池都能实现这种效果。
1.2 无锁编程
这就好比十字路口的管理方式。用锁机制像红绿灯——即使没有车,其他方向也得等着。无锁编程则像转盘,大家按照规则自行通过,效率更高。Java 中的 Atomic 类就是无锁编程的典型代表。
1.3 锁的优化
如果非得用锁,也要讲究方式:
- 减少锁粒度:不要把整个仓库都锁上,只锁某个货架就行。
- 读写锁:多个读者可以同时读,写者才需要独占。
- 乐观锁:先假设不会冲突,操作完再检查,如果冲突了重试。
2.中间件
2.1 添加缓存多级缓存
缓存就像把常用工具放在手边,而不是每次都去仓库取。Redis、Memcached 都是常用的缓存中间件。
有一次,我们把商品信息加了缓存,接口响应时间直接从 200ms 降到 20ms,提升了 10 倍!
多级缓存
使用多级缓存可以从离用户请求最近的地方优先获取缓存信息,从而保证了更高的查询效率,多级缓存包括以下这些:
- 分布式缓存:例如,Redis、MemCached 等。
- 本地缓存:例如,Caffeine、Google Guava Cache、Spring Cache、Ehcache 等。
- Nginx 缓存:在 Nginx 中配置并开启缓存功能。
- CDN 缓存:是一种通过在离用户更近的位置存储数据副本,以提供更快速、高效地内容交付的技术。CDN缓存使用分布式网络和边缘节点来缓存和分发静态和动态内容,以减少用户请求的响应时间和带宽消耗。
- 浏览器缓存:它的实现主要依靠 HTTP 协议中的缓存机制,当浏览器第一次请求一个资源时,服务器会将该资源的相关缓存规则(如 Cache-Control、Expires 等)一同返回给客户端,浏览器会根据这些规则来判断是否需要缓存该资源以及该资源的有效期。
2.2 优化连接中间件
数据库连接池、HTTP 连接池等都需要优化配置。就像高速公路的收费站,如果收费窗口太少,即使道路再宽也会堵车。
3.架构层面
3.1 负载均衡
单台服务器性能再强也有极限。负载均衡相当于银行开设多个窗口,将客户分流到不同的柜台。Nginx、LVS 等都是常用的负载均衡器。
3.2 微服务动态扩容
微服务架构下,我们可以针对访问量大的服务单独扩容。比如订单服务压力大,就只给订单服务增加实例,而不是扩展整个应用。
3.3 集群和数据分片
当数据量巨大时,单数据库会成为瓶颈。分库分表就像把一个大图书馆分成多个小阅览室,每个房间存放不同类别的书籍,提高检索效率。
4.扩展:监控与持续优化
光做优化不够,还需要知道优化效果如何。使用 SkyWalking、Pinpoint 等工具可以监控系统性能,找出热点方法;Arthas 可以在线诊断运行中的程序。
这就好比给系统做体检,只有定期检查才能及时发现潜在问题并解决问题。
视频解析
https://www.bilibili.com/video/BV1v2atzqE5b/
小结
提升系统并发能力是一个系统工程,需要从代码细节到架构设计全面考虑:
- 代码层面:善用多线程、异步和无锁编程
- 中间件:合理使用缓存和连接池
- 架构层面:通过负载均衡、微服务和分库分表水平扩展
- 持续监控:找出瓶颈,持续优化
记住,没有一劳永逸的解决方案,只有适合当前业务场景的最优解。不同的项目阶段,需要采取不同的优化策略。
希望这些经验对你有帮助!如果你有其他好的建议,欢迎一起讨论。
本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:场景题、SpringAI、SpringAIAlibaba、并发编程、MySQL、Redis、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、JVM、设计模式、消息队列、Dify、Coze、AI常见面试题等。
关注公众号(加好友):
作者: 王磊的博客
出处: http://vipstone.cnblogs.com/
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
|
|
|
相关推荐
|
|