欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java?9大性能優(yōu)化經驗總結

 更新時間:2023年02月18日 16:18:40   投稿:wdc  
這篇文章主要介紹了java?9大性能優(yōu)化經驗總結,包括:Java代碼優(yōu)化,數據庫優(yōu)化,分布式緩存,異步化,Web前段,搜索引擎優(yōu)化等需要的朋友可以參考下

性能優(yōu)化屬于Java高級崗的必備技能,而且大廠特別喜歡考察,今天主要給大家介紹9種性能優(yōu)化的方法

1.Java代碼優(yōu)化

之所以把代碼放到第一位,是因為這一點最容易引忽視,比如拿到一個性能優(yōu)化的需求以后,言必稱緩存、異步等。

實際上,第一步就應該是分析相關的代碼,找出相應的瓶頸,再來考慮具體的優(yōu)化策略。

有一些性能問題,完全是由于代碼寫的不合理,通過直接修改一下代碼就能解決問題的,比如for循環(huán)次數過多、作了很多無謂的條件判斷、相同邏輯重復多次等,這樣的優(yōu)化成本是最低的。

2.數據庫優(yōu)化

9大性能優(yōu)化經驗總結,強烈建議收藏!-mikechen的互聯網架構

1.SQL優(yōu)化

這里以MySQL為例,最常見的方式是,由自帶的慢查詢日志或者開源的慢查詢系統(tǒng)定位到具體的出問題的SQL,然后使用explain、profile等工具來逐步調優(yōu),最后經過測試達到效果后上線。

這里舉幾個優(yōu)化的例子:

1.查詢優(yōu)化

對查詢進行優(yōu)化,要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

2.避免null判斷

應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

3.避免全表掃描

應盡量避免在 where 子句中使用 != 或 <> 操作符,否則將引擎放棄使用索引而進行全表掃描。

應盡量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索引而進行全表掃描。

in和 not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對于連續(xù)的數值,能用 between就不要用 in 了:

select id from t where num between 1 and 3

4.大數據量查詢

對于多張大數據量的表JOIN,要先分頁再JOIN,否則邏輯讀會很高。

5.合理使用索引

索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。

一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。

6.多使用數字型字段

盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。

這是因為引擎在處理查詢和連 接時會逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。

7.避免大數量

盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

8.避免大事務

盡量避免大事務操作,提高系統(tǒng)并發(fā)能力。

2.連接池調優(yōu)

我們的應用為了實現數據庫連接的高效獲取、對數據庫連接的限流等目的,通常會采用連接池類的方案,即每一個應用節(jié)點都管理了一個到各個數據庫的連接池。

隨著業(yè)務訪問量或者數據量的增長,原有的連接池參數可能不能很好地滿足需求,這個時候就需要結合當前使用連接池的原理、具體的連接池監(jiān)控數據和當前的業(yè)務量作一個綜合的判斷,通過反復的幾次調試得到最終的調優(yōu)參數。

3.架構層面

這一類調優(yōu)包括讀寫分離、多從庫負載均衡、水平和垂直分庫分表等方面,一般需要的改動較大,但是頻率沒有SQL調優(yōu)高,而且一般需要DBA來配合參與。

9大性能優(yōu)化經驗總結,強烈建議收藏!-mikechen的互聯網架構

3.分布式緩存

緩存可以稱的上是性能優(yōu)化的利器,緩存主要用來存放那些讀寫比很高、很少變化的數據。

9大性能優(yōu)化經驗總結,強烈建議收藏!-mikechen的互聯網架構

什么情況適合用緩存?考慮以下兩種場景:

  •  短時間內相同數據重復查詢多次且數據更新不頻繁,這個時候可以選擇先從緩存查詢,查詢不到再從數據庫加載并回設到緩存的方式。此種場景較適合用單機緩存。
  •  高并發(fā)查詢熱點數據,后端數據庫不堪重負,可以用緩存來扛。

使用緩存需要注意的問題:

1.避免緩存失效

把頻繁修改的數據放入緩存,容易出現數據寫入緩存后,應用還來不及讀取緩存,數據就已經失效的情形,徒增系統(tǒng)負擔。

2.緩存熱點數據

緩存使用的內存資源非常寶貴,只能將最新訪問的數據緩存起來,而把歷史數據清理出緩存,即緩存資源應該留給20%的熱點數據。

 3.數據不一致性

一般會對緩存設置失效時間,超過失效時間,就要從數據庫重新加載。

因此應用要忍受一定時間的數據不一致,另一種策略是數據更新時立即更新緩存,不過這也會帶來更多的系統(tǒng)開銷和事務一致性的問題。

 4.緩存可用性

業(yè)務發(fā)展到一定階段時,緩存會承擔大部分數據訪問的壓力,數據庫已經習慣了有緩存的日子,所以當緩存服務器崩潰時,數據庫會因為完全不能承受如此大的壓力而宕機,進而導致整個網站不可用,這種情況被稱作緩存雪崩,發(fā)生這種故障,甚至不能簡單地重啟緩存服務器和數據庫服務器來恢復網站訪問。

解決方式:

1)緩存熱備(當某臺服務器宕機時,將緩存訪問切換到熱備服務器上;

2)緩存服務器集群。

5. 緩存預熱

緩存中存放的是熱點數據,熱點數據是緩存系統(tǒng)用LRU對不斷訪問的數據篩選出來的,這個過程需要較長的時間。

新啟動的緩存系統(tǒng)沒有任何數據,此時系統(tǒng)的性能和數據庫負載都不太好。因此可以選擇在啟動緩存是就把熱點數據預加載好。

 6.緩存穿透

因為不恰當的業(yè)務或惡意攻擊,持續(xù)高并發(fā)地訪問某一個不存在的數據,如果緩存不保存該數據,就會有大量的請求壓力落在數據庫上。

簡單的解決方式是把請求的不存在的數據也放進緩存,其value是null。

4.異步化

針對某些客戶端的請求,在服務端可能需要針對這些請求做一些附屬的事情,這些事情其實用戶并不關心或者用戶不需要立即拿到這些事情的處理結果,這種情況就比較適合用異步的方式處理這些事情。

異步化的作用:

  •  縮短接口響應時間,使用戶的請求快速返回,用戶體驗更好。
  •  避免線程長時間處于運行狀態(tài),這樣會引起服務線程池的可用線程長時間不夠用,進而引起線程池任務隊列長度增大,從而阻塞更多請求任務,使得更多請求得不到技術處理。
  •  線程長時間處于運行狀態(tài),可能還會引起系統(tǒng)Load、CPU使用率、機器整體性能下降等一系列問題,甚至引發(fā)雪崩。異步的思路可以在不增加機器數和CPU數的情況下,有效解決這個問題。

比如:使用消息隊列(MQ)中間件服務,MQ天生就是異步的。

9大性能優(yōu)化經驗總結,強烈建議收藏!-mikechen的互聯網架構

一些額外的任務,可能不需要我這個系統(tǒng)來處理,但是需要其他系統(tǒng)來處理,這個時候可以先把它封裝成一個消息,扔到消息隊列里面,通過消息中間件的可靠性保證把消息投遞到關心它的系統(tǒng),然后讓這個系統(tǒng)來做相應的處理。

再比如C端在完成一個提單動作以后,可能需要其它端做一系列的事情,但是這些事情的結果不會立刻對C端用戶產生影響,那么就可以先把C端下單的請求響應先返回給用戶,返回之前往MQ中發(fā)一個消息即可,而且這些事情理應不是C端的負責范圍,所以這個時候用MQ的方式,來解決這個問題最合適。

5.Web前段

Web前端指網站業(yè)務邏輯之前的部分,包括:

  • 瀏覽器加載
  • 網站視圖模型
  • 圖片服務
  • CDN服務等

9大性能優(yōu)化經驗總結,強烈建議收藏!-mikechen的互聯網架構

主要優(yōu)化手段有優(yōu)化瀏覽器訪問,使用反向代理,CDN等。

1.瀏覽器訪問優(yōu)化

(1)減少http請求

HTTP協(xié)議是無狀態(tài)的應用層協(xié)議,意味著每次HTTP請求都需要簡歷通信鏈路,進行數據傳輸,而在服務器端,每個HTTP都需要啟動獨立的線程去處理,這些通信和服務的開銷都很昂貴,減少HTTP請求的數目可有效提高訪問性能。

減少HTTP請求的主要手段是:

  •  合并CSS,以及壓縮CSS大小
  •  合并JavaScript,以及壓縮JS大小
  •  合并圖片

將瀏覽器一次訪問需要的JavaScript,CSS合并成一個文件,這樣瀏覽器就只需要一次請求。多張圖片合并成一張,如果每張圖片都有不同的超鏈接,可通過CSS偏移響應鼠標點擊操作,構造不同的URL。

(2)使用瀏覽器緩存

對一個網站而言,CSS,JavaScript,Logo,圖標等這些靜態(tài)資源文件更新的頻率都比較低,而這些文件又幾乎是每次HTTP請求都需要的,如果將這些文件緩存在瀏覽器中,可以極好地改善性能。通過設置HTTP頭中Cache-Control和Expires屬性,可設定瀏覽器緩存,緩存時間可以是數天甚至是幾個月。有時候,靜態(tài)資源文件變化需要及時應用到客戶端瀏覽器,這種情況可以通過改變文件名實現,比如一般會在JavaScript后面加上一個版本號,使瀏覽器刷新修改的文件。

(3)啟用壓縮

在服務器端對文件進行壓縮,在瀏覽器端對文件解壓縮,可有效較少通信傳輸的數據量。文本文件的壓縮效率科大80%以上。

(4)CSS放在頁面最上面,JavaScript放在頁面最下面

瀏覽器會在下載完全部CSS之后對整個頁面進行渲染,因此最好的做法是將CSS放在頁面最上面,讓瀏覽器盡快下載CSS。JS則想法,瀏覽器在加載JS后立即執(zhí)行,有可能會阻塞整個頁面,造成頁面顯示緩慢,因此JS最好放在頁面最下面。

(5)減少Cookie傳輸

一方面,Cookie包含在每次請求和響應中,太大的Cookie會嚴重影響數據傳輸,因此哪些數據需要寫入Cookie需要慎重考慮,盡量減少Cookie中傳輸的數據量。另一方面,對于某些靜態(tài)資源的訪問,如CSS,JS等,發(fā)送Cookie沒有意義,可以考慮靜態(tài)資源使用獨立域名訪問,避免請求靜態(tài)資源時發(fā)送Cookie,減少Cookie傳輸的次數。

2.CDN加速

CDN(Content Distribute Network,內存分發(fā)網絡)的本質上仍然是一個緩存,而且將數據緩存在離用戶最近的地方,是用戶以最快速度獲取數據,即所謂網絡訪問第一跳。

CDN一般緩存的是靜態(tài)資源,如圖片,文件,CSS,Script腳本,靜態(tài)網頁等,但是這些文件訪問頻率很高,將其緩存在CDN可極大改善網頁的打開速度。

3.反向代理

傳統(tǒng)代理服務器位于瀏覽器一側,代理瀏覽器將HTTP請求發(fā)送到互聯網上,而反向代理服務器位于網站機房一側,代理網站Web服務器接收HTTP請求。

和傳統(tǒng)代理服務器可以保護瀏覽器安全一樣,反向代理服務器也具有保護網站安全的作用,來自互聯網的訪問請求必須經過代理服務器,相當于在Web服務器和可能的網絡攻擊之間建立了一個屏障。

除了安全功能,代理服務器也可以通過配置緩存功能加速Web請求,當用戶第一次訪問靜態(tài)內容的時候,靜態(tài)內容就被緩存在反向代理服務器上,這樣當其他用戶訪問該靜態(tài)內容的時候,就可以直接從反向代理服務器返回,加速Web請求響應速度,減輕服務器負載要。

6.服務化

做服務化最基礎的是按業(yè)務做服務拆分,避免跨業(yè)務間的互相影響,數據和服務同時拆分。同一個業(yè)務內部我們還按計算密集型/IO密集型的服務拆分、C端/B端服務拆分、核心/非核心服務拆分、高頻服務單獨部署等原則做拆分。

7.硬件升級

硬件問題對性能的影響不容忽視。

舉一個例子:一個DB集群經常有慢SQL報警,業(yè)務排查下來發(fā)現SQL都很簡單,該做的索引優(yōu)化也都做了,后來DBA同學幫忙定位到問題是硬件過舊導致,將機械硬盤升級成固態(tài)硬盤之后報警立馬消失了,效果立竿見影!

8.搜索引擎

復雜查詢以及一些聚合計算不適合在數據庫中做,可以利用搜索引擎來實現,另外搜索引擎還可以幫我們很好的解決跨庫、跨數據源檢索的場景。

9.產品邏輯優(yōu)化

業(yè)務邏輯優(yōu)化經常會容易被忽略,但效果卻往往比數據庫性能優(yōu)化、JVM調優(yōu)之類的來的更明顯。

舉一個例子,12306春運搶火車票的場景,由于訪問的人多,用戶點擊“查票”之后系統(tǒng)會非???,進度條非常慢,作為用戶,我們會習慣性的再去點“查票”,可能會連續(xù)點個好幾次。

假設平均一個用戶點5次,則后端系統(tǒng)負載就增加了5倍!而其中80%的請求是重復請求。

這個時候我們可以通過產品邏輯的方式來優(yōu)化,比如,在用戶點擊查詢之后將“按鈕置灰”,或者通過JS控制xx秒只能只能提交一次請求等,有效的攔截了80%的無效流量

以上就是java 9大性能優(yōu)化經驗總結的詳細內容,更多關于java性能優(yōu)化經驗總結的資料請關注腳本之家其它相關文章!

相關文章

  • java之lombok的構建者模式Builder中的泛型寫法說明

    java之lombok的構建者模式Builder中的泛型寫法說明

    這篇文章主要介紹了java之lombok的構建者模式Builder中的泛型寫法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Spring?Boot?內置工具類ReflectionUtils的實現

    Spring?Boot?內置工具類ReflectionUtils的實現

    ReflectionUtils是一個反射工具類,它封裝了Java反射的操作,使得我們能夠更輕松地操作和訪問類的方法、字段,本文主要介紹了Spring?Boot?內置工具類ReflectionUtils的實現,感興趣的可以了解一下
    2023-11-11
  • java如何對map進行排序詳解(map集合的使用)

    java如何對map進行排序詳解(map集合的使用)

    這篇文章主要介紹了java如何對map進行排序,java map集合的使用詳解,大家可以參考使用
    2013-12-12
  • Mybatis多參數及實體對象傳遞實例講解

    Mybatis多參數及實體對象傳遞實例講解

    在使用Mybatis的時候,經常會有各種各樣的參數傳遞,不同類型,不同個數的參數,下面小編通過例子給大家講解下Mybatis多參數及實體對象傳遞,一起看看吧
    2016-12-12
  • @ComponentScan注解用法之包路徑占位符解析

    @ComponentScan注解用法之包路徑占位符解析

    這篇文章主要介紹了@ComponentScan注解用法之包路徑占位符解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java中重寫和重載的區(qū)別及說明

    Java中重寫和重載的區(qū)別及說明

    Java語言中的重載和重寫是實現多態(tài)的兩種方式,但他們的實現方式和規(guī)則有所不同,重載發(fā)生在一個類中,同名的方法如果有不同的參數列表,則視為重載,重寫則發(fā)生在子類和父類之間,要求子類重寫方法和父類被重寫方法有相同的返回類型
    2024-10-10
  • 什么是jsoup及jsoup的使用

    什么是jsoup及jsoup的使用

    jsoup是一款基于Java的HTML解析器,它提供了一套非常省力的API,不但能直接解析某個URL地址、HTML文本內容,而且還能通過類似于DOM、CSS或者jQuery的方法來操作數據,所以?jsoup?也可以被當做爬蟲工具使用,這篇文章主要介紹了什么是jsoup及jsoup的使用,需要的朋友可以參考下
    2023-10-10
  • java計算兩個日期中間的時間

    java計算兩個日期中間的時間

    這篇文章主要介紹了java計算兩個日期中間的時間的相關資料,需要的朋友可以參考下
    2017-04-04
  • SpringMVC 上傳文件 MultipartFile 轉為 File的方法

    SpringMVC 上傳文件 MultipartFile 轉為 File的方法

    這篇文章主要介紹了SpringMVC 上傳文件 MultipartFile 轉為 File的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • mybatis插件實現自定義改寫表名實例代碼

    mybatis插件實現自定義改寫表名實例代碼

    在數據庫操作過程中,經常有修改表名的需求,下面這篇文章主要給大家介紹了關于mybatis插件實現自定義改寫表名的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04

最新評論