Redis學習系列之—— JDHotKey 熱點緩存探測系統

一、為什么需要熱點緩存探測

? ? ? ? 在回答這個問題前,我們先考慮一下:為什么光用 Redis 還不夠,還需要使用本地緩存?

? ? ? ? 一般來說,Redis 集群的性能能抗住幾十萬并發,能夠應付大部分情況。但對于一些頭部 APP,當出現熱點輿情、商品秒殺活動等百萬并發的場景,Redis 集群也來不及處理這么多請求,更何況對某一個熱點 key 的請求會打到同一個 Redis 分片上。這會導致?Redis 服務超時甚至不可用,最終形成緩存雪崩。

????????如果能把熱點數據緩存到應用程序節點中,就可以解決問題,因為本地緩存有以下優勢:

1、數據不需要通過網絡傳輸,能提升性能

2、由于應用的高擴展性,本地緩存是天然的分布式存儲,負載分擔容易實現

3、本地緩存可以緩解遠程緩存的壓力

? ? ? ? 但是,使用本地緩存最重要的問題是:本地內存有限,無法支持大量數據存儲

????????因此在超高并發業務下,需要引入熱點緩存探測系統(以下簡稱“熱點系統”),它解決本地緩存問題的方法大致如下:

????????由于本地內存有限,所以最好是只存儲熱點數據,從而兼顧內存規模和緩存命中率。但是超高并發業務往往采用大量的應用節點,每個節點分擔到的流量有限,所以單個節點僅分析自身的數據使用情況,難以及時得知哪些是熱點 key。而熱點系統把各節點的數據使用情況進行收集、匯總,從全局判斷出哪些屬于熱點 key,再把熱點 key 推送給各應用節點。

二、熱點 key 的使用場景

? ? ? ? 熱點數據有兩個重要特性:有限時間、流量高聚。熱點 key 的使用場景主要有:

1、正面的:例如熱門商品的 id、熱點輿情的 id。這些 key 作為熱點 key 后,數據緩存到本地,商品詳情、輿情詳情等信息就不用再從 Redis 獲取了,減小了 Redis 壓力。

2、負面的:例如使用搶票腳本的 ip 地址。這些 key 作為熱點 key 后,數據緩存到本地,當請求到來后,直接從本地緩存看一下是否存在,若存在就拒絕這些請求。

? ? ? ? 當然,熱點系統只是把 key 當作一個字符串,具體在什么場景使用,非常靈活。

三、JDHotKey 架構剖析

(一)整體架構

JDHotKey 主要由 4 個組件構成:

1、etcd:etcd 是一個高性能的配置中心,可以以極小的資源占用,提供高效的監聽訂閱服務。主要用于存放規則配置,各 worker 的 ip 地址,以及探測出的熱 key、手工添加的熱 key 等。

2、client:client 是在應用中添加的引用 jar,引入后,就可以以便捷的方式去判斷某 key 是否熱key。同時,該 jar 完成了 key 上報、監聽 etcd 里的 rule 變化、worker 信息變化、熱 key 變化,對熱 key 進行本地 caffeine 緩存等。

3、worker:worker 端是一個獨立部署的 Java 程序,通常部署多臺根據 key 的 Hash 值進行流量分擔。worker 啟動后會連接 etcd,并定期上報自己的ip信息,供client端獲取地址并進行長連接。之后,對各個client發來的待測key進行累加計算,當達到etcd里設定的rule閾值后,將熱key推送到各個client。

4、dashboard:dashboard 是一個可視化控制臺,啟動后會連接 etcd,之后在控制臺設置各個 APP 的 key 規則。然后當worker探測出來熱key后,會將 key 發往 etcd,dashboard 也會監聽熱 key 信息,進行入庫保存記錄。同時,dashboard 也可以手工添加、刪除熱 key,供各個 client 端監聽。

(二)核心業務邏輯

1、規則維護:主要由運營人員通過 dashboard 配置熱點規則,比如:對于所有 product 開頭的 key,2秒內出現20次訪問算熱 key)。

2、熱點上報:client 端會根據熱點規則,將參與熱點統計的 key 進行本地統計,并定期(默認 500 ms 一次)上報給 worker。上報時,會對 key 進行 hash 運算后取余,找到對應的 worker 進行上報。

3、熱點統計:每個 worker 會負責自己管轄范圍內的 key 的統計,采用的是滑動窗口算法。

4、熱點推送:當 worker 熱點統計發現熱 key 時,將熱 key 推送給所有的 client。此外,dashboard 也可以手動添加或刪除熱 key 并進行推送。

5、熱點緩存:當 client 收到熱點推送后,會從本地的熱 key 集合中進行添加或刪除。開發人員可以通過 client 提供的 SDK 查詢某個 key 是否為熱 key,也可以通過 SDK?從本地緩存(Caffiene)中存入、獲取、刪除熱 key 對應的 value。

參考:https://mp.weixin.qq.com/s/xOzEj5HtCeh_ezHDPHw6Jw

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

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

相關文章

Linux 安全加固

Linux 安全加固需要從??用戶權限、系統服務、網絡防護、日志審計、文件系統、訪問控制??等多個維度入手,目標是減少攻擊面、限制未授權訪問、提升系統健壯性。以下是??詳細步驟實操示例??,覆蓋主流 Linux 發行版(如 CentOS/Ubuntu&am…

【Docker#2】容器歷史發展 | 虛擬化實現方式

一、前言 – 容器技術發展史 容器技術是現今計算技術的重要組成部分,其發展歷程可以追溯到很早的計算機系統提供的進程隔離工具。以下是容器技術的發展歷程,其中涵蓋了從早期的進程隔離技術到現代云計算和云原生的演變: ① Jail 時代 1979 年…

React + Mermaid 圖表渲染消失問題剖析及 4 種代碼級修復方案

Mermaid 是一個流行的庫&#xff0c;它可以將文本圖表&#xff08;例如 graph LR; A-->B;&#xff09;轉換為 SVG 圖表。在靜態 HTML 頁面中&#xff0c;Mermaid 會查找 <pre class"mermaid"> 代碼塊&#xff0c;并在頁面加載時將它們替換為渲染后的圖表。它…

[Element]修改el-pagination背景色

[Element]修改el-pagination背景色 代碼 <el-pagination:current-page.sync"queryParams.current":page-size.sync"queryParams.size":page-sizes"[10, 20, 50, 100]"layout"prev, pager, next, jumper, sizes":total"queryP…

Docker 可用鏡像列表

Docker 鏡像源列表&#xff08;7月15日更新-長期&免費&#xff09;_dockerhub國內鏡像源列表-CSDN博客

低代碼可視化工作流的系統設計與實現路徑研究

一、背景分析在數字化轉型不斷深化的背景下&#xff0c;企業業務流程呈現出高度定制化與動態調整的趨勢&#xff0c;傳統信息系統在開發周期、實施成本與擴展能力上的局限性日益凸顯&#xff0c;已難以支撐快速響應和敏捷迭代的實際需求。面向這一現實挑戰&#xff0c;基于 BPM…

mac mlx大模型框架的安裝和使用

mlx是apple平臺的大模型推理框架&#xff0c;對mac m1系列處理器支持較好。 這里記錄mlx安裝和運行示例。 1 安裝mlx框架 conda create -n mlx python3.12 conda activate mlx pip install mlx-lm 2 運行mlx測試例 以下是測試程序&#xff0c;使用方法和hf、vllm等推理框架基…

JAVA 使用Apache POI合并Word文檔并保留批注的實現

一、需求背景 在實際工作中&#xff0c;我們經常需要將多個Word文檔合并成一個文件。但當文檔中包含批注&#xff08;Comments&#xff09;時&#xff0c;傳統的復制粘貼會導致批注丟失或引用錯亂。本文將介紹如何通過Java和Apache POI庫實現保留批注及引用關系的文檔合并功能。…

Linux的服務管理工具:`systemd`(`systemctl`)和`SysVinit ` 筆記250718

Linux的服務管理工具:systemd(systemctl)和SysVinit 筆記250718 Linux的服務管理工具 Linux 的服務管理工具隨著發行版和初始化系統的發展而演變。以下是主要的服務管理工具及其對應的初始化系統&#xff1a; 1. systemd (現代主流標準) 初始化系統&#xff1a; 是絕大多數…

Couchbase 可觀測性最佳實踐

Couchbase 介紹 Couchbase 是一個開源的分布式 NoSQL 數據庫&#xff0c;專為高性能和高可擴展性設計&#xff0c;適用于實時數據處理的企業應用。它結合鍵值存儲和文檔數據庫的優勢&#xff0c;支持 JSON 文檔存儲&#xff0c;并通過 N1QL&#xff08;類 SQL 查詢語言&#x…

構建基于MCP的LLM聊天機器人客戶端開發指南

引言 在當今人工智能技術快速發展的時代&#xff0c;大型語言模型(LLM)已成為構建智能應用的核心組件。MCP(Modular Conversational Platform)作為一個強大的對話平臺&#xff0c;為開發者提供了將LLM能力與自定義工具集成的標準化方式。本文將詳細介紹如何使用Python開發一個…

接口測試的原則、用例與流程詳解

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 一、接口的介紹軟件測試中&#xff0c;常說的接口有兩種&#xff1a;圖形用戶接口&#xff08;GUI&#xff0c;人與程序的接口&#xff09;、應用程序編程接口&am…

ubuntu 22.02 帶外進單用戶拯救系統

不停地按 F7 &#xff0c;然后進到 menu &#xff0c;選擇 ubuntu &#xff0c;然后按下 ESC &#xff0c;然后瞬間會刷一個 ubuntu 的選項&#xff08;默認是在第一的位置&#xff0c;直接快速按下 e&#xff09;即可進入單用戶模式。 找到類似 linux /boot/vmlinuz-xxx rootU…

Java-75 深入淺出 RPC Dubbo Java SPI機制詳解:從JDK到Dubbo的插件式擴展

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-30-新發布【1T 萬億】參數量大模型&#xff01;Kim…

【橘子分布式】gRPC(編程篇-上)

一、簡介 我們之前學習了grpc的一些理論知識&#xff0c;現在我們開始正式進入編程環節。 我們的項目結構和之前的thrift結構還是一樣的&#xff0c;一個common,一個client&#xff0c;一個server。只不過在grpc這里common它一般叫做api模塊。還是放置一些公共的實體類&#x…

IOS 18下openURL 失效問題

突然有一天有玩家反饋說應用打開外部連接打不開了&#xff0c;于是查了一下&#xff0c;報錯&#xff1a;BUG IN CLIENT OF UIKIT: The caller of UIApplication.openURL(_:) needs to migrate to the non-deprecated UIApplication.open(_:options:completionHandler:). Force…

前端面試題(React 與 Vue)

目錄 一、React 函數組件 Fiber架構 組件重新渲染 組件通信 為什么不能在if中使用hook useEffect與useLayoutEffect區別 性能優化hooks 受控組件與非受控組件 redux與zustand區別 二、Vue vue2與vue3區別 生命周期 computed與watch區別 v-if與v-show區別 v-mod…

大模型格式

目錄 大模型格式&#xff1a; ollma 可以加載gguf ChatGPT 說&#xff1a; &#x1f50d; 什么是 GGUF&#xff1f; 大模型格式&#xff1a; Ollama 模型格式只能運行已打包成 .gguf 格式的模型&#xff0c;或通過其 Modelfile 方式構建 ModelScope 模型格式大多使用 Hug…

數據結構 棧(1)

1. 棧的概念和結構之前幾篇我們分別講解了順序表和單鏈表的內容&#xff0c;今天我們又來學習一個新的關于數據結構的內容--- 棧 。棧&#xff1a;棧也屬于線性表 , 但它是一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一…

【Android代碼】繪本翻頁時通過AI識別,自動通過手機/pad朗讀繪本

核心功能&#xff1a; 打開攝像頭&#xff08;可支持外接攝像頭&#xff09;檢測翻頁&#xff08;后續考慮添加圖像差異算法&#xff09;拍照后用 識圖自動用 TextToSpeech 朗讀文字內容 &#x1f4cc; 說明&#xff1a;使用了 CameraX&#xff08;Android Jetpack&#xff09;…