日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一篇文章告訴你真實場景下服務端接口性能問題是如何解決的

來源: 責編: 時間:2024-04-07 17:05:05 184觀看
導讀作為Java后端開發(fā)者,我們創(chuàng)作的許多代碼直接影響著用戶的使用體驗。如果后端代碼性能不佳,用戶在訪問網(wǎng)站時就必須花費更多時間等待服務器響應。這可能引發(fā)用戶投訴甚至用戶流失問題。性能優(yōu)化是一個廣泛而重要的話題。

作為Java后端開發(fā)者,我們創(chuàng)作的許多代碼直接影響著用戶的使用體驗。如果后端代碼性能不佳,用戶在訪問網(wǎng)站時就必須花費更多時間等待服務器響應。這可能引發(fā)用戶投訴甚至用戶流失問題。4af28資訊網(wǎng)——每日最新資訊28at.com

性能優(yōu)化是一個廣泛而重要的話題。《Java程序性能優(yōu)化》提到性能優(yōu)化可分為五個層次:設(shè)計優(yōu)化、代碼優(yōu)化、JVM優(yōu)化、數(shù)據(jù)庫優(yōu)化、操作系統(tǒng)優(yōu)化等。每個層次都涵蓋許多方法論和最佳實踐。本文無意進行全面詳盡的概述,只是列舉幾個常用的Java代碼優(yōu)化方案,希望讀者閱讀后能實際應用到自己的代碼中。4af28資訊網(wǎng)——每日最新資訊28at.com

單例層面

在處理IO操作、數(shù)據(jù)庫連接、配置文件解析加載等耗費大量系統(tǒng)資源的任務時,我們必須限制這些實例的創(chuàng)建,或者始終使用一個共享的實例,以節(jié)約系統(tǒng)資源。這種情況下就需要使用單例模式。4af28資訊網(wǎng)——每日最新資訊28at.com

批量操作

若有100個請求,逐個執(zhí)行顯然效率較低。將這100個請求合并為一個請求進行批量操作,則能大幅提升效率。4af28資訊網(wǎng)——每日最新資訊28at.com

特別是在數(shù)據(jù)庫操作中,批量處理不僅比逐條執(zhí)行效率更高,還能有效降低數(shù)據(jù)庫連接數(shù),提升應用的QPS上限。4af28資訊網(wǎng)——每日最新資訊28at.com

Future模式處理

假設(shè)某項任務需花費一定時間執(zhí)行,為避免無謂的等待,可先獲取一個“提貨單”——即Future,隨后繼續(xù)處理其他任務,直至“貨物”抵達,即任務執(zhí)行完成并獲得結(jié)果。這時便可憑借“提貨單”提取物品,即通過Future對象獲取返回值。4af28資訊網(wǎng)——每日最新資訊28at.com

偽代碼4af28資訊網(wǎng)——每日最新資訊28at.com

public class RealData implements Callable<String> {    protected String data;    public RealData(String data) {        this.data = data;    }    @Override    public String call() throws Exception {        // 通過sleep方法演示業(yè)務是緩慢的        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        return data;    }}public class Application {    public static void main(String[] args) throws Exception {        FutureTask<String> futureTask =                new FutureTask<>(new RealData("name"));        ExecutorService executor =                Executors.newFixedThreadPool(1); // 使用線程池        // 執(zhí)行FutureTask,相當于上例中的client.request("name")發(fā)送請求        executor.submit(futureTask);        // 這里可以用一個sleep代替對其他業(yè)務邏輯的處理        // 在處理這些業(yè)務邏輯的同時,RealData也在創(chuàng)建,充分利用等待時間        Thread.sleep(2000);        // 使用真實數(shù)據(jù)        // 如果call()沒有執(zhí)行完成,仍會等待        System.out.println("數(shù)據(jù)=" + futureTask.get());    }}

線程池思路

合理運用線程池帶來三大益處。首先,降低資源消耗:通過重復利用已創(chuàng)建的線程,降低線程的創(chuàng)建與銷毀成本。其次,提高響應速度:任務到達時,無需等待線程創(chuàng)建即可立即執(zhí)行。第三,提升線程可管理性:線程是珍貴資源,無節(jié)制地創(chuàng)建會消耗系統(tǒng)資源,降低系統(tǒng)穩(wěn)定性;線程池能實現(xiàn)統(tǒng)一分配、優(yōu)化和監(jiān)控。4af28資訊網(wǎng)——每日最新資訊28at.com

自 Java 5 開始,引入了并發(fā)編程新API,如Executor框架,內(nèi)部采用線程池機制,位于java.util.concurrent包中。通過該框架控制線程的啟動、執(zhí)行和關(guān)閉,可簡化并發(fā)編程操作。4af28資訊網(wǎng)——每日最新資訊28at.com

偽代碼4af28資訊網(wǎng)——每日最新資訊28at.com

public class MultiThreadTest {    public static void main(String[] args) {        ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("thread-%d").build();        ExecutorService executor = new ThreadPoolExecutor(2, 5, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);        executor.execute(new Runnable() {            @Override            public void run() {               System.out.println("Hello, world!");            }        });        System.out.println(" ===> Main Thread! ");    }}

NIO處理

JDK自1.4版本起引入了新的I/O編程類庫,即NIO。NIO不僅帶來了高效的Buffer和Channel,還引入了基于Selector的非阻塞I/O機制,可以將多個異步I/O操作集中到一個或少數(shù)幾個線程中進行處理。使用NIO替代阻塞I/O能夠提高程序的并發(fā)吞吐能力,降低系統(tǒng)開銷。4af28資訊網(wǎng)——每日最新資訊28at.com

針對每個請求,如果為其單獨開啟一個線程來處理邏輯,當客戶端數(shù)據(jù)傳輸是間歇性的而非連續(xù)的時,相應線程會處于I/O等待狀態(tài),并頻繁進行上下文切換。利用NIO引入的Selector機制,可以提升程序的并發(fā)效率,改善這種狀況。4af28資訊網(wǎng)——每日最新資訊28at.com

偽代碼4af28資訊網(wǎng)——每日最新資訊28at.com

public class NioTest {      static public void main( String args[] ) throws Exception {          FileInputStream fin = new FileInputStream("D://test.txt");          // 獲取通道          FileChannel fc = fin.getChannel();          // 創(chuàng)建緩沖區(qū)          ByteBuffer buffer = ByteBuffer.allocate(1024);          // 讀取數(shù)據(jù)到緩沖區(qū)          fc.read(buffer);          buffer.flip();          while (buffer.remaining()>0) {              byte b = buffer.get();              System.out.print(((char)b));          }          fin.close();      }  }

優(yōu)化鎖層面

在并發(fā)場景中,頻繁使用鎖是很常見的情況。然而,鎖引發(fā)競爭,而競爭又會耗費大量資源。那么,在Java代碼中,如何優(yōu)化鎖呢?我們可以考慮以下幾個方面:4af28資訊網(wǎng)——每日最新資訊28at.com

  • 縮短鎖持有時間
  • 嘗試使用同步代碼塊替代同步方法,從而減少鎖的占用時間。
  • 降低鎖粒度
  • 在并發(fā)環(huán)境中使用Map時,最好選用ConcurrentHashMap替代HashTable和HashMap(ConcurrentHashMap采用分段鎖,鎖的粒度更細)。4af28資訊網(wǎng)——每日最新資訊28at.com

  • 分離鎖4af28資訊網(wǎng)——每日最新資訊28at.com

  • 普通鎖(例如synchronized)可能導致讀寫互相阻塞,可以嘗試將讀操作和寫操作分開。4af28資訊網(wǎng)——每日最新資訊28at.com

  • 鎖粗化4af28資訊網(wǎng)——每日最新資訊28at.com

  • 有時我們希望將多次鎖的請求合并成一個,以減少頻繁加鎖、同步和解鎖所帶來的性能損失。4af28資訊網(wǎng)——每日最新資訊28at.com

  • 鎖消除4af28資訊網(wǎng)——每日最新資訊28at.com

  • 鎖消除是指Java虛擬機在JIT編譯時,經(jīng)過運行上下文的掃描,去除那些不會產(chǎn)生共享資源競爭的鎖。通過鎖消除,可以減少無謂的鎖請求時間。4af28資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)傳輸壓縮

在數(shù)據(jù)傳輸之前,壓縮數(shù)據(jù)是一種優(yōu)化方式,可以減少網(wǎng)絡傳輸?shù)臄?shù)據(jù)量,提升傳輸速度。接收端可解壓數(shù)據(jù),還原傳輸內(nèi)容。壓縮后的數(shù)據(jù)能節(jié)省存儲介質(zhì)(如磁盤或內(nèi)存)空間和網(wǎng)絡帶寬,從而降低成本。然而,壓縮并非無成本之舉。數(shù)據(jù)壓縮需要大量CPU計算,并且根據(jù)壓縮算法的不同,計算復雜度和壓縮比都有顯著差異。通常需要根據(jù)業(yè)務情景選擇合適的壓縮算法。4af28資訊網(wǎng)——每日最新資訊28at.com

緩存計算結(jié)果

對于相同的用戶請求,若每次都重復查詢數(shù)據(jù)庫、重復計算,將浪費大量時間和資源。將計算結(jié)果緩存至本地內(nèi)存或使用分布式緩存,可節(jié)約寶貴的CPU計算資源,減少數(shù)據(jù)庫重復查詢或磁盤I/O。將原本需要磁頭物理轉(zhuǎn)動的操作轉(zhuǎn)化為內(nèi)存中的電子運動,提高響應速度。同時,快速釋放線程也提升了應用的吞吐能力。4af28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-81731-0.html一篇文章告訴你真實場景下服務端接口性能問題是如何解決的

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 京東一面:如何在SpringBoot啟動時執(zhí)行特定代碼?

下一篇: 詳解WebSocketMessageBrokerConfigurer在SpringBoot中應用與實踐

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 對標蘋果的靈動島 華為帶來實況窗功能

    繼蘋果的靈動島之后,華為也在今天正式推出了“實況窗”功能。據(jù)今天鴻蒙OS 4.0的現(xiàn)場演示顯示,華為的實況窗可以更高效的展現(xiàn)出實時通知,比如鎖屏上就能看到外賣、打車、銀行
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權(quán)的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業(yè)用途。(幾小時前,swyy發(fā)現(xiàn)它已從LLaMA 2更名為Lla
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(消息堆積)、消費 三大塊領(lǐng)域。那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。注意,如果白話中不小心提到相關(guān)代
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 余承東:AI大模型技術(shù)的發(fā)展將會帶來下一代智能終端操作系統(tǒng)的智慧體驗

    8月4日消息,2023年華為開發(fā)者大會(HDC.Together)今天正式開幕,華為發(fā)布HarmonyOS 4、全新升級的鴻蒙開發(fā)套件、HarmonyOS Next開發(fā)者預覽版本等一系列
  • 三星Galaxy Z Fold5今日亮相:厚度縮減但仍略顯厚重

    據(jù)官方此前宣布,三星將于7月26日也就是今天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • OPPO K11采用全方位護眼屏:三大護眼能力減輕視覺疲勞

    日前OPPO官方宣布,全新的OPPO K11將于7月25日正式發(fā)布,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼IMX890主攝,堪稱是2000檔位影像表
Top 主站蜘蛛池模板: 永安市| 宁河县| 当雄县| 米易县| 伊宁县| 静安区| 肇东市| 大丰市| 体育| 马尔康县| 台前县| 太仓市| 旬阳县| 会同县| 科技| 安乡县| 宁河县| 锡林郭勒盟| 本溪| 长岭县| 大石桥市| 浙江省| 平度市| 滨州市| 调兵山市| 阜阳市| 新余市| 民县| 顺义区| 唐山市| 合阳县| 桐乡市| 巴南区| 讷河市| 米泉市| 海门市| 织金县| 忻州市| 宜城市| 白沙| 岱山县|