色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從2s優化到0.1s,這周班沒白加!

CodeSheep ? 來源:CodeSheep ? 2023-06-28 17:03 ? 次閱讀

大家好,今天我們繼續來分享一個在項目開發過程中遇到的實際問題,這里也來梳理并總結一下我們是如何對它進行持續優化的,希望能對大家有所幫助。

分類樹查詢功能,在各個業務系統中可以說隨處可見,特別是在一些電商系統中。

b2a0caea-1588-11ee-962d-dac502259ad0.png

但就是這樣一個看似簡單的分類樹查詢功能,我們卻優化了數次

這其中到底經歷了什么呢?

背 景

我們的一個老項目使用了SpringBoot推薦的模板引擎:Thymeleaf,進行動態渲染。

它是一個XML/XHTML/HTML5模板引擎,可用于Web與非Web環境中的應用開發。

它提供了一個用于整合SpringMVC的可選模塊,在應用開發中,我們可以使用Thymeleaf來完全代替JSP或其他模板引擎,如VelocityFreeMarker等。

前端開發寫好Thymeleaf的模板文件,調用后端接口獲取數據,進行動態綁定,就能把想要的內容展示給用戶。

由于當時很早這也個是從0-1的新項目,為了開快速開發功能,第一版接口是直接從數據庫中查詢分類數據,組裝成分類樹,然后返回給前端。

通過這種方式,簡化了數據流程,快速把整個頁面功能調通了。

第1次優化

我們將該接口部署到dev環境,剛開始沒啥問題。

隨著開發人員添加的分類越來越多,很快就暴露出性能瓶頸。

我們不得不做優化了。

我們第一個想到的是:加Redis緩存

流程圖如下:

b2c6e8ce-1588-11ee-962d-dac502259ad0.png

于是暫時這樣優化了一下:

  1. 用戶訪問接口獲取分類樹時,先從Redis中查詢數據。
  2. 如果Redis中有數據,則直接數據。
  3. 如果Redis中沒有數據,則再從數據庫中查詢數據,拼接成分類樹返回。
  4. 將從數據庫中查到的分類樹的數據,保存到Redis中,設置過期時間5分鐘。
  5. 將分類樹返回給用戶。

我們在Redis中定義一個了key,value是一個分類樹的json格式轉換成了字符串,使用簡單的key/value形式保存數據。

經過這樣優化之后,dev環境的聯調和自測順利完成了。

第2次優化

我們將這個功能部署到st環境了。

剛開始測試同學沒有發現什么問題,但隨著后面不斷地深入測試,隔一段時間就出現一次首頁訪問很慢的情況。

于是,我們馬上進行了第2次優化。

我們決定使用Job定期異步更新分類樹到Redis中,在系統上線之前,會先生成一份數據。

當然為了保險起見,防止Redis在哪條突然掛了,之前分類樹同步寫入Redis的邏輯還是保留。

于是,流程圖改成了這樣:

b2f15a96-1588-11ee-962d-dac502259ad0.png

增加了一個job每隔5分鐘執行一次,從數據庫中查詢分類數據,封裝成分類樹,更新到Redis緩存中。

其他的流程保持不變。

此外,Redis的過期時間之前設置的5分鐘,現在要改成永久。

通過這次優化之后,st環境就沒有再出現過分類樹查詢的性能問題了。

第3次優化

測試了一段時間之后,整個網站的功能快要上線了。

為了保險起見,我們需要對網站首頁做一次壓力測試。

果然測出問題了,網站首頁最大的qps是100多,最后發現是每次都從Redis獲取分類樹導致的網站首頁的性能瓶頸。

我們需要做第3次優化。

該怎么優化呢?

答:加內存緩存。

如果加了內存緩存,就需要考慮數據一致性問題。

內存緩存是保存在服務器節點上的,不同的服務器節點更新的頻率可能有點差異,這樣可能會導致數據的不一致性。

但分類本身是更新頻率比較低的數據,對于用戶來說不太敏感,即使在短時間內,用戶看到的分類樹有些差異,也不會對用戶造成太大的影響。

因此,分類樹這種業務場景,是可以使用內存緩存的。

于是,我們使用了Spring推薦的caffine作為內存緩存。

改造后的流程圖如下:

b320f4b8-1588-11ee-962d-dac502259ad0.png

  1. 用戶訪問接口時改成先從本地緩存分類數查詢數據。
  2. 如果本地緩存有,則直接返回。
  3. 如果本地緩存沒有,則從Redis中查詢數據。
  4. 如果Redis中有數據,則將數據更新到本地緩存中,然后返回數據。
  5. 如果Redis中也沒有數據(說明Redis掛了),則從數據庫中查詢數據,更新到Redis中(萬一Redis恢復了呢),然后更新到本地緩存中,返回返回數據。

需要注意的是,需要改本地緩存設置一個過期時間,這里設置的5分鐘,不然的話,沒辦法獲取新的數據。

這樣優化之后,再次做網站首頁的壓力測試,qps提升到了500多,滿足上線要求。

第4次優化

之后,這個功能順利上線了。

使用了很長一段時間沒有出現問題。

兩年后的某一天,有用戶反饋說,網站首頁有點慢。

我們排查了一下原因發現,分類樹的數據太多了,一次性返回了上萬個分類。

原來在系統上線的這兩年多的時間內,運營同學在系統后臺增加了很多分類。

我們需要做第4次優化。

這時要如何優化呢?

限制分類樹的數量?

答:也不太現實,目前這個業務場景就是有這么多分類,不能讓用戶選擇不到他想要的分類吧?

這時我們想到最快的辦法是開啟nginxGZip功能。

讓數據在傳輸之前,先壓縮一下,然后進行傳輸,在用戶瀏覽器中,自動解壓,將真實的分類樹數據展示給用戶。

之前調用接口返回的分類樹有1MB的大小,優化之后,接口返回的分類樹的大小是100Kb,一下子縮小了10倍。

這樣簡單的優化之后,性能提升了一些。

第5次優化

經過上面優化之后,用戶很長一段時間都沒有反饋性能問題。

但有一天公司同事在排查Redis中大key的時候,揪出了分類樹。之前的分類樹使用key/value的結構保存數據的。

我們不得不做第5次優化。

為了優化在Redis中存儲數據的大小,我們首先需要對數據進行瘦身。

只保存需要用到的字段。

例如:

@AllArgsConstructor
@Data
publicclassCategory{

privateLongid;
privateStringname;
privateLongparentId;
privateDateinDate;
privateLonginUserId;
privateStringinUserName;
privateListchildren;
}

像這個分類對象中inDate、inUserId和inUserName字段是可以不用保存的。

修改自動名稱。

例如:

@AllArgsConstructor
@Data
publicclassCategory{
/**
*分類編號
*/
@JsonProperty("i")
privateLongid;

/**
*分類層級
*/
@JsonProperty("l")
privateIntegerlevel;

/**
*分類名稱
*/
@JsonProperty("n")
privateStringname;

/**
*父分類編號
*/
@JsonProperty("p")
privateLongparentId;

/**
*子分類列表
*/
@JsonProperty("c")
privateListchildren;
}

由于在一萬多條數據中,每條數據的字段名稱是固定的,他們的重復率太高了。

由此,可以在json序列化時,改成一個簡短的名稱,以便于返回更少的數據大小。

這還不夠,需要對存儲的數據做壓縮。

之前在Redis中保存的key/value,其中的value是json格式的字符串。

其實RedisTemplate支持,value保存byte數組

先將json字符串數據用GZip工具類壓縮成byte數組,然后保存到Redis中。

再獲取數據時,將byte數組轉換成json字符串,然后再轉換成分類樹。

這樣優化之后,保存到Redis中的分類樹的數據大小,一下子減少了10倍,Redis的大key問題被解決了。

小 結

所以回過頭來看,這樣一個看似并不復雜的功能需求,但是要想把它做到穩定、高效、可用,一路下來還是需要考慮不少問題的。而這其中遇到的任何一個問題,一旦解決并復盤了,它也就匯聚成我們的經驗了,希望這篇文章的梳理能對大家有所幫助。

好了,今天的內容分享就到這里了,感謝大家的收看,我們下篇見。



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • 模板
    +關注

    關注

    0

    文章

    108

    瀏覽量

    20561
  • 分類樹
    +關注

    關注

    0

    文章

    3

    瀏覽量

    5740

原文標題:從2s優化到0.1s,這周班沒白加!

文章出處:【微信號:CodeSheep,微信公眾號:CodeSheep】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    用RK3128輸出I2S信號TAS5707,噪音大怎么優化

    我用 RK3128 輸出 I2S 信號 TAS5707,現在噪音大,請問有什么方法可以優化嗎? 目前整機的音量是在 RK3128里面調整,TAS5707音量是設為最大的。 謝
    發表于 10-30 07:26

    S2S(Services To Signal)測試問答#S2S測試 #SOA

    S2S
    北匯信息POLELINK
    發布于 :2023年01月19日 17:37:52

    請問按鍵2S如何實現啊

    請問按鍵2S如何實現啊我現在用的定時器時間為25MS如何實現按鍵2S請高手給予指點 最好是簡單的代碼
    發表于 05-10 11:31

    0.1S~6小時定時電路圖

    0.1S~6小時定時電路圖:本定時器電路由基準脈沖產生器,分頻電路和執行電路組成,分單步定時和循環定時。
    發表于 10-27 09:28 ?1154次閱讀
    <b class='flag-5'>0.1S</b>~6小時定時電路圖

    全“芯”升級 小米手機2S詳細拆解

    小米手機在國產智能手機中一直是人們關注的焦點,除了1999元經典的平民價格外,其旗艦機水準的配置總能在第一時間抓住人眼球。小米手機2S 是小米手機2的升級版本,就外觀而言,消費者根本無從分辨二者
    的頭像 發表于 04-14 15:45 ?3.6w次閱讀

    好高興又可以用小米2S啦!你的小米2S還在嗎?

    小米2S可以說是小米系列手機里最經典的手機,沒有之一。如今小米更迭很快,依舊為發燒而生,可是卻再也沒有一款像當年小米2S那樣經典之作
    發表于 03-03 08:16 ?4960次閱讀
    好高興又可以用小米<b class='flag-5'>2S</b>啦!你的小米<b class='flag-5'>2S</b>還在嗎?

    s=surprise,發布會后大家都這樣評價nova 2s

    12月7日下午,華為正式發布了華為 nova 2s,作為nova系列的最新一代產品,華為 nova 2s繼承了高顏值的外觀設計以及強大的自拍、拍照性能,并且加入了很多最新的時尚元素,比如說采用全面屏
    發表于 12-08 16:17 ?1093次閱讀

    來了來了!最新小米MIX 2S曝光

    近日,小米發布預告稱將于3月27日發布小米MIX 2S,目前有爆料為我們揭露了這款新機的謎團。
    的頭像 發表于 03-02 14:16 ?3151次閱讀

    小米MIX 2S評測:全面屏好看,但驚喜難以勾起購買的欲望

    小米MIX 2S在配置方面,依然是走了性能路線,擁有“高通845+8GB”這目前國產機當中頂尖的配置。然而這次小米MIX 2S的出現,并沒有當初小米MIX出現時候的那種驚艷,外觀設計沒有大的進步,而背面類似于iPhone X的設計在大眾評價當中,甚至有退步的感覺。
    的頭像 發表于 04-05 15:00 ?5366次閱讀

    小米 MIX 2S 與 MIX 2 對比圖賞

    小米在 3 月底給我們帶來了全新的旗艦——MIX 2S,延續了 MIX 系列的全面屏設計,這一次除完成國內廠商首發驍龍 845 的任務外,更是大幅度提升了以往 MIX 系列的拍照弱項。在詳細評測出來之前,我們先來看看小米 MIX 2S 與 MIX
    的頭像 發表于 04-13 10:19 ?9215次閱讀

    谷歌ARCore登陸中國市場 小米Mix 2S應用商店首發

    在小米8發布之前,小米MIX 2S可以說是小米目前旗艦手機的最佳代表,這款產品發布于3月27日,憑借著小米史上最好拍照手機的頭銜,MIX 2S一經發售就受到了用戶的追捧,不過由于剛發售時候的產能原因,小米MIX 2S經常出現斷貨
    發表于 05-30 09:56 ?1275次閱讀

    小米Air 2s無線耳機固件更新

    。 本次固件更新優化彈窗問題;優化聲音卡頓、音質、LHDC;優化誤觸、提示燈等其它問題,提高穩定性。 IT之家了解,小米真無線藍牙耳機 Air 2
    的頭像 發表于 11-18 11:47 ?9221次閱讀

    小米Air 2s已修復電量10%時概率無法充電問題

    據IT之家網友反饋,小米 Air 2s 真無線藍牙耳機現已推送 2.1.5.2 版本固件,優化了當耳機電量為 10% 時,概率性無法充電的問題。 此前,小米 Air 2s 耳機還優化
    的頭像 發表于 12-01 09:15 ?5210次閱讀

    Tinker Board 2S嵌入式系統開箱介紹

    本次取得的是Tinker Board 2S / 2GB的版本,單板微電腦就外觀來看,Tinker Board 2S與Tinker Board 2這兩個版本的各種外接界面規劃其實沒有差異
    的頭像 發表于 11-07 16:07 ?1619次閱讀

    Tinker Board 2S系統與軟件安裝設定

    Tinker Board 2S在官方網站上提供了Debian10 Linux操作系統給用戶進行安裝,相關LXDE桌面環境的套件軟件程序,都有相當完整的支持,本文將會著眼在Tinker Board 2S應用在AI范疇中
    的頭像 發表于 11-14 16:06 ?2223次閱讀
    主站蜘蛛池模板: 久久亚洲伊人中字综合精品| 精品国产乱码久久久久久口爆| 国产亚洲精品97在线视频一| 精品伊人久久| 秋霞影音先锋一区二区| 小雪奶水涨翁工帮吸的推荐语录| 亚洲一卡久久4卡5卡6卡7卡 | 97国产成人精品免费视频| 成激人情在线影院920| 国产又爽又黄又不遮挡视频| 男人插曲视频大全免费网站| 午夜片无码区在线观看| 97视频在线观看免费播放| 国产精品久久精品| 男人J进入女人P免费狂躁| 学生妹被爆插到高潮无遮挡| 99视频精品国产免费观看| 国产午夜精品视频在线播放| 女性爽爽影院免费观看| 亚洲狠狠网站色噜噜| 成人精品视频在线| 久久视频在线视频| 羞羞答答影院在线| yin荡体育课羞耻play双性 | 亚洲精品第一页| 精品国产5g影院天天爽| 牛牛在线精品视频| 亚洲欧美人成视频在线| 俄罗斯大肥BBXX| 魅男mangay| 亚洲中文无码AV在线观看| 囯产精品久久久久久久久免费蜜桃| 久久精品动漫99精品动漫| 午夜国产精品视频在线| qvod影院| 猫咪av永久最新域名| 亚洲日韩欧美国产中文在线| 国产成人免费手机在线观看视频| 免费视频xxx| 瑜伽牲交AV| 国拍自产精品福利区|