《去哪兒網Redis高并發實戰:從問題定位到架構升級》

去哪兒網Redis高并發實戰:從問題定位到架構升級

在互聯網行業競爭日益激烈的當下,高并發場景下的系統性能優化一直是技術團隊面臨的重要挑戰。對于去哪兒網這類在線旅游平臺來說,節假日期間的流量高峰更是對系統架構的嚴峻考驗。本文將深入剖析去哪兒網在五一假期期間,針對Redis高并發問題的實戰解決方案,從問題定位、優化策略到架構升級,全方位展現整個優化過程。

一、案例背景:五一假期流量峰值挑戰

1.1 業務場景

去哪兒網作為國內領先的在線旅游平臺,提供機票預訂、酒店預訂、旅游攻略等多種服務。在五一假期這樣的旅游旺季,平臺的業務流量呈現爆發式增長。其中,機票搜索、酒店推薦等核心接口的日請求量突破5億大關,支撐這些業務的Redis集群QPS(每秒查詢率)更是達到了驚人的80萬。如此龐大的訪問量,對Redis集群的性能和穩定性提出了極高的要求。

在機票搜索業務中,用戶頻繁查詢航線價格日歷,這使得與價格日歷相關的Redis key訪問量極為集中;酒店推薦接口則需要快速獲取酒店的各類信息,同樣依賴Redis緩存來提升響應速度。Redis作為內存數據庫,憑借其高性能、高并發的特點,成為了去哪兒網緩存數據的首選方案,但在極端流量下,也暴露出了一系列問題。

1.2 核心問題

隨著流量的持續攀升,Redis集群出現了嚴重的性能瓶頸。首先,熱點航線價格日歷key的訪問過于集中,導致承載這些key的單節點CPU使用率飆升至90%。過高的CPU負載使得該節點處理請求的能力大幅下降,不僅影響了自身的響應速度,還可能導致整個集群的性能波動。

其次,緩存雪崩問題給系統帶來了巨大壓力。由于大量緩存數據同時過期,瞬間產生的大量請求無法從Redis獲取數據,只能回源到數據庫(DB)。DB回源QPS超過4000,遠超其正常承載能力,接口響應時間也從正常的幾十毫秒延長至500ms以上,用戶體驗急劇下降。如果不及時解決這些問題,可能會導致用戶流失,對業務造成嚴重影響。

二、問題定位與分析

2.1 熱點key識別

為了找出導致單節點CPU過高的原因,技術團隊首先進行了熱點key的識別。通過使用redis-cli --bigkeys命令,對Redis集群中的key進行掃描分析。該命令能夠快速找出占用內存較大的key以及訪問頻率較高的key。

經過掃描發現,像flight:price:calendar:CN-SHA這樣與熱點航線價格日歷相關的key,其訪問占比超過了30%。這些熱點key的集中訪問,使得負責存儲它們的Redis節點負載過重,成為了系統性能的瓶頸。

2.2 慢查詢分析

除了熱點key問題,慢查詢也是影響Redis性能的重要因素。去哪兒網技術團隊開啟了Redis的慢查詢日志功能,對執行時間較長的命令進行分析。分析結果顯示,大量的HGETALL操作耗時超過10ms,而Redis是單線程模型,這些耗時較長的操作會阻塞其他請求的執行,導致整體響應速度變慢。

HGETALL命令用于獲取哈希表中的所有字段和值,在實際業務中,可能并不需要一次性獲取所有數據,這種過度的數據獲取方式不僅浪費了資源,還降低了系統的并發處理能力。

三、優化策略與實施

3.1 熱key多副本拆分

針對熱點key訪問集中的問題,去哪兒網采用了熱key多副本拆分的策略。以flight:price:calendar:CN-SHA這個熱點key為例,將其拆分為10個副本,分別命名為flight:price:calendar:CN-SHA:0flight:price:calendar:CN-SHA:9

在客戶端訪問時,通過hash(userId) % 10的方式,將用戶請求隨機分配到這10個副本上。這樣一來,原本集中在一個節點上的流量就被分散到了10個節點,有效降低了單個節點的負載壓力。通過這種方式,不僅提升了系統的并發處理能力,還增強了系統的穩定性。

客戶端請求
計算hash userId % 10
訪問flight:price:calendar:CN-SHA:0
訪問flight:price:calendar:CN-SHA:1
訪問flight:price:calendar:CN-SHA:2
訪問flight:price:calendar:CN-SHA:3
訪問flight:price:calendar:CN-SHA:4
訪問flight:price:calendar:CN-SHA:5
訪問flight:price:calendar:CN-SHA:6
訪問flight:price:calendar:CN-SHA:7
訪問flight:price:calendar:CN-SHA:8
訪問flight:price:calendar:CN-SHA:9

3.2 邏輯過期+異步刷新

為了解決緩存雪崩問題,去哪兒網引入了邏輯過期+異步刷新的機制。在緩存數據結構中新增logical_expire_time字段,用于記錄數據的邏輯過期時間,同時將物理TTL(生存時間)設置為24小時。

當系統檢測到logical_expire_time < now時,并不會立即阻塞請求去更新數據,而是觸發一個異步任務來刷新數據。在異步任務刷新數據的過程中,請求仍然可以獲取到舊數據,這樣就避免了大量請求同時回源到數據庫,有效防止了緩存雪崩的發生。通過這種方式,保證了系統在緩存數據更新過程中的高可用性和穩定性。

請求訪問緩存
logical_expire_time < now?
觸發異步任務刷新數據
返回緩存數據
異步獲取新數據
更新緩存數據

3.3 本地緩存前置

為了進一步減少對Redis的訪問量,去哪兒網在客戶端引入了本地緩存。選用Caffeine作為本地緩存框架,對熱門航線數據進行緩存,設置TTL為10分鐘。Caffeine具有高性能、低內存占用等特點,非常適合在客戶端使用。

通過引入本地緩存,大量對熱門航線數據的請求可以直接從本地緩存中獲取,命中率達到了85%。這不僅減輕了Redis集群的壓力,還顯著提升了接口的響應速度,為用戶提供了更好的使用體驗。

客戶端請求
本地緩存是否命中?
返回本地緩存數據
訪問Redis
獲取數據并更新本地緩存
返回數據

四、架構升級與監控完善

4.1 集群拆分

隨著業務的不斷發展,Redis集群中的資源競爭問題日益突出。為了解決這一問題,去哪兒網對Redis集群進行了拆分,按照業務維度將其拆分為機票、酒店、攻略3個Cluster集群。

通過集群拆分,不同業務的數據存儲在不同的集群中,避免了資源的相互競爭。例如,機票業務的流量不會影響到酒店業務的性能,每個集群可以根據自身業務的特點進行針對性的優化和擴展。這種架構設計不僅提升了系統的性能,還增強了系統的可維護性和擴展性。

4.2 監控體系建設

為了及時發現和解決系統中出現的問題,去哪兒網構建了完善的監控體系,選用Prometheus作為監控工具。Prometheus能夠實時采集和存儲Redis集群的各項指標數據,并提供強大的查詢和告警功能。

監控的關鍵指標包括QPS、命中率、慢查詢數、內存使用率等。通過對這些指標的實時監控,技術團隊可以及時了解Redis集群的運行狀態。同時,設置了告警規則,當CPU使用率超過80%、命中率低于70%時,系統會自動觸發告警,通知相關人員進行處理。這樣一來,能夠在問題發生的第一時間做出響應,保障系統的穩定運行。

4.3 大key治理

大key不僅會占用大量的內存空間,還會影響Redis的性能。去哪兒網制定了大key治理方案,定期對Redis中的大key進行掃描。對于像粉絲列表等數據量大的key,將其拆分為多個子key,確保每個key的大小不超過1MB。

通過大key治理,減少了內存碎片的產生,提高了內存的利用率,同時也降低了大key對系統性能的影響,進一步提升了Redis集群的整體性能。

五、優化效果對比

經過一系列的優化和架構升級,去哪兒網Redis集群的性能得到了顯著提升。以下是優化前后各項指標的對比:

指標優化前優化后
單節點CPU峰值90%35%
緩存命中率68%96.5%
DB回源QPS4200380
接口響應時間320ms65ms

從數據可以看出,單節點CPU峰值從90%下降到35%,有效解決了熱點key導致的CPU過高問題;緩存命中率從68%提升到96.5%,大幅減少了對數據庫的訪問;DB回源QPS從4200降至380,極大減輕了數據庫的壓力;接口響應時間從320ms縮短至65ms,顯著提升了用戶體驗。

六、總結與展望

去哪兒網在Redis高并發實戰中的優化經驗,為其他面臨類似問題的互聯網企業提供了寶貴的參考。通過熱點key多副本拆分、邏輯過期+異步刷新、本地緩存前置等優化策略,以及集群拆分、監控體系建設、大key治理等架構升級措施,成功解決了五一假期流量峰值下的性能瓶頸問題。

未來,隨著業務的持續增長和用戶需求的不斷變化,去哪兒網將繼續關注Redis技術的發展,探索更多優化方案和架構創新,進一步提升系統的性能和穩定性,為用戶提供更加優質的服務。同時,也會將這些實踐經驗應用到更多的業務場景中,推動整個技術團隊的能力提升。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910477.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系統架構設計 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…

設計模式精講 Day 6:適配器模式(Adapter Pattern)

【設計模式精講 Day 6】適配器模式&#xff08;Adapter Pattern&#xff09; 文章內容 在“設計模式精講”系列的第6天&#xff0c;我們將深入講解適配器模式&#xff08;Adapter Pattern&#xff09;。作為結構型設計模式之一&#xff0c;適配器模式的核心思想是將一個類的接…

系統穩定性治理

一、微服務內部異常 描述 微服務Pod自動重啟表現&#xff1a;服務波動&#xff08;響應時間不穩定&#xff09;、監控指標異常&#xff08;Pod重啟次數增加&#xff0c;CPU/內存波動&#xff09;、Kubernetes事件記錄容器重啟原因影響&#xff1a;服務中斷、性能波動、資源消耗…

多智能體協同的力量:賦能AI安全報告系統的智能設計之道

“設想一個由‘數據采集者’、‘風險分析師’、‘報告撰寫員’甚至‘合規監督員’組成的虛擬團隊&#xff0c;它們如何攜手打造一份深度洞察、精準預警的危化安全報告&#xff1f;這正是多智能體協作在AI安全領域的魅力所在。” 一、挑戰升級&#xff1a;單一AI難以應對的復雜性…

ceph pg 卡在 active+clean+remapped 狀態

場景 ceph 環境中有個 osd.0 做了 raid0 ,后來想剔除掉,執行了 ceph osd out 0 然后等了很長時間等 pg 數據遷移到別的 osd,但是最后有一個 pg 狀態卡在了 active+clean+remapped 狀態。如下: ceph pg ls-by-osd 0 PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES …

systemd[1]: Failed to start LSB: Bring up/down networking

使用ssh連接虛擬機服務時&#xff0c;連接異常&#xff0c;虛擬機系統centos 7&#xff0c;于是登錄虛擬機&#xff0c;查看服務ip&#xff0c;發現配置的靜態ip未生效。因此重啟網卡systemctl restart network&#xff0c;出現報錯&#xff0c;使用systemctl status network查…

Go 語言使用 excelize 庫操作 Excel 的方法

在筆者開發的項目中&#xff0c;有操作excel的需要&#xff0c;由于go操作excel比較方便且功能強大&#xff0c;于是選擇使用go來操作excel。github.com/360EntSecGroup-Skylar/excelize庫是一個功能強大且易于使用的庫&#xff0c;它支持創建、讀取和修改 Excel 文件&#xff…

Java基礎(三):邏輯運算符詳解

Java基礎系列文章 Java基礎(一)&#xff1a;發展史、技術體系與JDK環境配置詳解 Java基礎(二)&#xff1a;八種基本數據類型詳解 Java基礎(三)&#xff1a;邏輯運算符詳解 目錄 一、什么是邏輯運算符&#xff1f;二、基礎邏輯運算符&#xff08;3種&#xff09;1、&&…

Bugku-CTF-web

最近刷了一下 Bugku-CTF-web 的61-70題&#xff08;平臺目前只有67&#xff09;&#xff0c;好難好難&#xff0c;全都是知識的盲區。各種代碼審計&#xff0c;各種反序列化&#xff0c;各種反彈shell&#xff0c;各種模版注入&#xff0c;各種字符串繞過&#xff0c;可以說是W…

GitLab 工具如何提升我的工作效率

在當今快節奏的軟件開發和技術創作領域&#xff0c;作為一名博主&#xff0c;高效的工作流程和強大的協作工具至關重要。GitLab 作為一款集成了版本控制、項目管理、持續集成與持續部署&#xff08;CI/CD&#xff09;等功能于一體的平臺&#xff0c;為我的工作帶來了巨大的便利…

Unity Addressable使用之服務器遠程加載

本地模擬服務器加載 1、創建一個Profiles&#xff0c;將Remote設為Editor Hosted 2、在Addressables Group窗口將Profile設為Local Test 3、將某個Asset Groups設為Remote加載 4、Build資源 5、打開本地模擬服務器 Addressables Hosting 窗口是 Addressable 提供的一個內置本…

Java基礎八股文 - 面試者心理歷程與標準答案

Java基礎八股文 - 面試者心理歷程與標準答案 前言&#xff1a;如何應對Java基礎面試問題 面試Java基礎時&#xff0c;很多候選人會因為緊張而忘記平時熟悉的知識點。本文將從面試者的心理歷程出發&#xff0c;教你如何在面試中用自己的思路組織答案&#xff0c;然后給出標準回…

學習筆記088——Windows配置Tomcat自啟

1、下載 下載Windows版本tomcat。本文下載的版本是&#xff1a; apache-tomcat-9.0.31-windows-x64.zip 點擊下載 注意&#xff1a;要確保bin目錄下有 service.bat 文件&#xff01; 2、配置服務 解壓后&#xff0c;終端進入bin?錄&#xff0c;安裝服務&#xff1a;service…

SSL證書怎么配置到服務器上 ?

在網絡安全備受關注的當下&#xff0c;SSL證書已成為網站安全的標配。但僅有SSL證書還不夠&#xff0c;正確將其配置到服務器上&#xff0c;才能真正發揮保障數據傳輸安全、驗證網站身份的作用。由于服務器類型多樣&#xff0c;不同服務器的SSL證書配置方法存在差異&#xff0c…

AI與SEO關鍵詞協同進化

內容概要 人工智能&#xff08;AI&#xff09;與搜索引擎優化&#xff08;SEO&#xff09;的結合&#xff0c;正深刻變革著關鍵詞策略的制定與執行方式。本文旨在探討AI技術如何驅動SEO關鍵詞領域的智能化進化&#xff0c;核心在于利用AI強大的數據處理與模式識別能力&#xf…

01.線性代數是如何將復雜的數據結構轉化為可計算的數學問題,這個過程是如何進行的

將復雜數據結構轉化為可計算的數學問題是數據科學、機器學習和算法設計中的核心環節。這一過程需要結合數據特性、數學理論和計算框架,通過系統化的抽象和建模實現。以下是具體轉化流程及關鍵技術解析: 一、數據結構分析:解構原始數據的本質特征 1. 識別數據類型與結構特性…

華為OD機考-網上商城優惠活動-模擬(JAVA 2025B卷)

import java.util.Scanner;public class Test3 {static int mjq;static int dzq;static int wmkq;static class Group {int price;// 打折后價格int num;// 優惠券使用熟練}public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input sc…

JavaScript 數據處理 - 將字符串按指定位數截斷并放入數組(基礎實現、使用正則表達式實現、使用正則表達式簡化實現)

將字符串按指定位數截斷并放入數組 1、基礎實現 /*** 將字符串按指定位數截斷并放入數組* param {string} str - 要處理的字符串* param {number} n - 每段截斷的位數* returns {Array} 截斷后的字符串數組*/ function splitStringByLength(str, n) {const result [];for (l…

python學智能算法(十四)|機器學習樸素貝葉斯方法進階-CountVectorizer文本處理簡單測試

【1】引用 前序學習文章中&#xff0c;已經對拉普拉斯平滑和簡單二元分類進行了初步探索&#xff0c;相關文章鏈接為&#xff1a; python學智能算法&#xff08;十二&#xff09;|機器學習樸素貝葉斯方法初步-拉普拉斯平滑計算條件概率-CSDN博客 python學智能算法&#xff0…

Java枚舉類的規范設計與常見錯誤規避

前言 在Java開發中&#xff0c;枚舉&#xff08;enum&#xff09;是一種強大的工具&#xff0c;用于定義一組固定常量集合。然而&#xff0c;許多開發者在使用枚舉時容易陷入設計誤區&#xff0c;導致代碼可維護性差、運行時錯誤頻發&#xff0c;甚至引發生產事故。 一、枚舉…