成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
對于相同的用戶請求,若每次都重復查詢數據庫、重復計算,將浪費大量時間和資源。將計算結果緩存至本地內存或使用分布式緩存,可節(jié)約寶貴的CPU計算資源,減少數據庫重復查詢或磁盤I/O。

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

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

單例層面

在處理IO操作、數據庫連接、配置文件解析加載等耗費大量系統資源的任務時,我們必須限制這些實例的創(chuàng)建,或者始終使用一個共享的實例,以節(jié)約系統資源。這種情況下就需要使用單例模式。

批量操作

若有100個請求,逐個執(zhí)行顯然效率較低。將這100個請求合并為一個請求進行批量操作,則能大幅提升效率。

特別是在數據庫操作中,批量處理不僅比逐條執(zhí)行效率更高,還能有效降低數據庫連接數,提升應用的QPS上限。

Future模式處理

假設某項任務需花費一定時間執(zhí)行,為避免無謂的等待,可先獲取一個“提貨單”——即Future,隨后繼續(xù)處理其他任務,直至“貨物”抵達,即任務執(zhí)行完成并獲得結果。這時便可憑借“提貨單”提取物品,即通過Future對象獲取返回值。

偽代碼

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);
        // 使用真實數據
        // 如果call()沒有執(zhí)行完成,仍會等待
        System.out.println("數據=" + futureTask.get());
    }
}

線程池思路

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

自 Java 5 開始,引入了并發(fā)編程新API,如Executor框架,內部采用線程池機制,位于java.util.concurrent包中。通過該框架控制線程的啟動、執(zhí)行和關閉,可簡化并發(fā)編程操作。

偽代碼

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操作集中到一個或少數幾個線程中進行處理。使用NIO替代阻塞I/O能夠提高程序的并發(fā)吞吐能力,降低系統開銷。

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

偽代碼

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);  
        // 讀取數據到緩沖區(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)化鎖呢?我們可以考慮以下幾個方面:

  • 縮短鎖持有時間
  • 嘗試使用同步代碼塊替代同步方法,從而減少鎖的占用時間。
  • 降低鎖粒度
  • 在并發(fā)環(huán)境中使用Map時,最好選用ConcurrentHashMap替代HashTable和HashMap(ConcurrentHashMap采用分段鎖,鎖的粒度更細)。

  • 分離鎖

  • 普通鎖(例如synchronized)可能導致讀寫互相阻塞,可以嘗試將讀操作和寫操作分開。

  • 鎖粗化

  • 有時我們希望將多次鎖的請求合并成一個,以減少頻繁加鎖、同步和解鎖所帶來的性能損失。

  • 鎖消除

  • 鎖消除是指Java虛擬機在JIT編譯時,經過運行上下文的掃描,去除那些不會產生共享資源競爭的鎖。通過鎖消除,可以減少無謂的鎖請求時間。

數據傳輸壓縮

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

緩存計算結果

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

責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2021-11-04 10:34:02

JavaScript繼承編程

2022-02-18 00:13:53

JavaScript編程語言數組

2019-07-28 20:15:07

2017-05-23 09:20:32

大數據數據分析多層模型

2021-01-20 05:35:08

PythonMock微服務

2021-09-27 09:18:30

ListIterato接口方法

2019-10-17 19:15:22

jQueryJavaScript前端

2023-11-01 15:52:35

2022-08-04 09:39:39

Kubernetes聲明式系統

2019-07-01 15:01:44

NVMe接口存儲

2020-12-23 13:28:18

云計算云計算技術后端技術

2020-11-13 08:14:28

JavaScript

2024-07-08 12:40:18

MySQL索引失效

2021-06-29 10:00:02

JavaScriptStorage接口

2021-08-02 10:01:09

Iterator接口Java項目開發(fā)

2024-05-23 15:32:33

StorageJavaScript

2021-05-29 10:20:54

GoModules語言

2018-12-26 10:14:56

綜合布線系統數據

2023-06-21 00:10:17

JSONWeb服務器JavaScript

2021-02-19 19:35:53

SVG 形狀元素
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲视频在线观看 | 精品视频国产 | wwwxx在线观看 | 国产精品99久久久久久www | 欧美日韩综合一区 | 成人欧美一区二区三区在线观看 | 免费电影av | 91精品国产91久久久久久密臀 | www.jizzjizz| 欧美成人第一页 | 久久久久久久网 | 国产亚洲精品久久久久久牛牛 | 久在线 | 插插插干干干 | 少妇一级淫片aaaaaaaaa | 亚洲免费在线观看 | 啪视频在线 | 在线免费观看a级片 | 黑人巨大精品欧美一区二区免费 | 中文字幕1区 | 爱爱无遮挡 | 国产黄色网址在线观看 | 中文字幕在线观看第一页 | 亚洲精品一区中文字幕 | 日本特黄a级高清免费大片 成年人黄色小视频 | 免费在线看黄 | 日韩中文一区二区三区 | av在线视 | 黄色网址在线免费播放 | 久久久久久免费毛片精品 | 91在线视频网址 | 日韩久草 | 国产丝袜一区二区三区免费视频 | 亚洲精品视频免费观看 | 日韩美香港a一级毛片免费 国产综合av | 欧美一区二区视频 | 在线看91 | av在线播放免费 | 国产精品揄拍一区二区 | 日本h片在线观看 | 国产免费av网 |