緩存系統-基本概述

目錄

一、系統概述

二、名詞解釋

三、淘汰策略

1、LRU

2、LFU

3、FIFO

4、TTL

5、Random

四、讀寫模式

1、Cache Aside(旁路緩存)

2、Write Through(直寫)

3、Write Back(回寫)

五、問題方案

1、緩存穿透

2、緩存雪崩

3、緩存擊穿

4、最佳實踐


一、系統概述

緩存(Cache)是通過臨時存儲高頻訪問數據來加速數據訪問的技術組件,本質是"空間換時間"的典型實踐。其核心價值體現在:

  • 性能加速:縮短數據訪問路徑(CPU緩存 vs 內存訪問速度差達100倍)
  • 資源節約:減少對底層數據源的訪問壓力(數據庫查詢成本降低80%+)
  • 系統穩定:應對突發流量沖擊(如秒殺場景QPS可達10萬級)

二、名詞解釋

  1. 緩存命中率:請求緩存時,數據存在的概率(命中次數 / 總請求次數),命中率>90%為高效,<70%需優化(如調整淘汰策略或容量);
  2. 緩存穿透:請求不存在的數據(如惡意攻擊或無效ID),繞過緩存直擊后端;
  3. 緩存擊穿:熱點數據過期瞬間,高并發請求壓垮數據庫;
  4. 緩存雪崩:大量緩存同時過期,導致請求洪峰沖擊后端;
  5. 緩存污染:緩存中存儲了大量非高頻訪問或無效數據,導致緩存命中率下降,進而降低系統整體性能的現象。本質是緩存資源被低價值數據占用,無法有效服務高頻請求。
  6. TTL(Time To Live):緩存數據存活時間;
  7. 冷熱數據分離:高頻/低頻數據分區存儲
  8. 緩存預熱:系統啟動時加載熱點數據

三、淘汰策略

緩存系統通過淘汰策略在容量不足時決定移除哪些數據,核心目標是最大化緩存命中率。

策略

時間復雜度

空間開銷

適用場景

命中率

LRU

O(1)

通用場景(Web緩存)

★★★★☆

LFU

O(1)~O(log n)

熱點數據集中(視頻推薦)

★★★★★

FIFO

O(1)

簡單順序訪問(日志緩沖)

★★☆☆☆

TTL

O(log n)

時效性數據(會話/驗證碼)

★★★☆☆

Random

O(1)

低成本容忍場景

★★☆☆☆

1、LRU

核心思想:優先淘汰最久未被訪問的數據
數據結構:哈希表 + 雙向鏈表(哈希表存儲鍵值對,鏈表維護訪問順序)
操作流程

  • 數據訪問
    • 命中緩存:將節點移到鏈表頭部
    • 未命中:從數據庫加載,新節點插入鏈表頭部
  • 淘汰觸發
    • 鏈表尾部節點(最久未訪問)被移除
    • 同步刪除哈希表中對應鍵

優點

  • 高效反映時間局部性(最近訪問的數據更可能再被訪問)
  • 時間復雜度:O(1)(哈希表定位 + 鏈表移動)

缺點

  • 突發批量訪問可能污染緩存(如全表掃描)
  • 鏈表維護增加內存開銷

2、LFU

核心思想:優先淘汰訪問頻率最低的數據
數據結構:雙哈希表(鍵值存儲 + 頻率-鍵列表) + 最小堆/雙向鏈表
操作流程

  • 數據訪問
    • 命中緩存:增加計數,調整在頻率鏈表中的位置
  • 淘汰觸發
    • 移除最低頻率鏈表中的最早節點(LRU作為次級策略)
    • 更新最小頻率值

優點

  • 精準保護高頻訪問數據
  • 適合長期熱點數據場景(如電商熱門商品)

缺點

  • 新數據易被淘汰(初始頻率低)
  • 維護成本高(需頻率排序)
  • 歷史高頻但不再訪問的數據可能滯留

3、FIFO

核心思想:按進入緩存的順序淘汰
數據結構:隊列(數組/鏈表實現)
操作流程

(1)數據寫入:新數據加入隊尾

(2)淘汰觸發:移除隊首數據

優點

  • 實現簡單(僅需隊列)
  • 零額外內存開銷

缺點

  • 忽略訪問模式(可能淘汰熱點數據)
  • 緩存命中率通常最低

4、TTL

核心思想:基于過期時間自動淘汰
數據結構:哈希表 + 時間堆(或輪詢檢查)
操作流程

  • 數據寫入:設置過期時間戳(當前時間 + TTL)
  • 淘汰觸發
    • 主動:定期掃描過期數據(定時器)
    • 被動:訪問時檢查過期并刪除

優點

  • 保證數據時效性(適合會話緩存)
  • 避免手動清理

缺點

  • 可能提前移除仍有價值的數據
  • 掃描機制消耗CPU(大緩存需優化)

5、Random

核心思想:隨機選擇數據淘汰
數據結構:動態數組(如Python list)
操作流程

  • 淘汰觸發:隨機選擇鍵刪除
  • 數據維護:數組動態調整

優點

  • 實現極其簡單
  • 無狀態維護成本

缺點

  • 可能誤刪高頻數據
  • 性能波動不可預測

四、讀寫模式

主要是要保證數據的一致性。

1、Cache Aside(旁路緩存)

旁路緩存模式,也稱為懶加載(Lazy Loading),是最常見的緩存模式。

應用程序直接與緩存和數據庫(或主數據存儲)交互。

優點:實現簡單,緩存只保存實際被請求的數據,節省內存。
缺點:緩存未命中時,需要訪問數據庫,可能導致延遲。另外,在寫操作后立即讀,可能會因為緩存失效而讀到舊數據(需要等到下次加載),但通常通過刪除緩存保證一致性。

讀流程

  • 緩存命中:應用程序首先檢查緩存。如果數據存在(命中),則直接返回緩存數據。
  • 緩存未命中

????????(1)應用程序從數據庫中讀取數據。

? ? ? ? (2)將讀取到的數據寫入緩存(以便后續讀取命中)。

? ? ? ? (3)返回數據。

寫流程

  • 應用程序直接更新數據庫。
  • 同時,使緩存中對應的數據失效(刪除緩存項)。這樣,下次讀取時,會觸發緩存未命中,從而從數據庫加載最新數據并重新填充緩存。


?

2、Write Through(直寫)

在直寫模式中,緩存作為數據庫的代理層。

寫操作總是先經過緩存,然后由緩存同步更新到數據庫。

優點:緩存和數據庫始終保持一致(強一致性)。讀操作很少會訪問數據庫,因為寫操作已經更新了緩存。
缺點:寫操作延遲較高,因為需要等待數據庫寫入完成。如果數據不經常被讀取,那么寫入緩存可能造成資源浪費(因為每次寫都更新緩存,即使很少讀)。

讀流程

  • 緩存命中:直接返回緩存數據。
  • 緩存未命中

? ? ? ? (1)緩存從數據庫中加載數據(或由應用程序觸發加載)。

? ? ? ? (2)將數據放入緩存。

? ? ? ? (3)返回數據。

寫流程

(1)應用程序更新緩存(如果數據在緩存中不存在,則創建緩存項)。

(2)緩存立即將數據同步寫入數據庫(通常在一個事務內)。

(3)只有在數據庫寫入成功后,寫操作才算完成。


?

3、Write Back(回寫)

回寫模式(也稱為Write-Behind)中,寫操作首先寫入緩存,然后異步批量寫入數據庫。緩存作為寫操作的緩沖區。

優點:寫操作非常快,因為應用程序不需要等待數據庫寫入。可以合并多次寫操作,減少數據庫壓力。
缺點:數據不一致的風險(緩存和數據庫在異步同步前不一致)。如果緩存崩潰,尚未寫入數據庫的數據會丟失。因此,通常需要額外的機制(如寫日志)來保證數據持久性。

讀流程

  • 緩存命中:直接返回緩存數據。
  • 緩存未命中

? ? ? ? (1)從數據庫中加載數據到緩存。

? ? ? ? (2)返回數據。

寫流程

(1)應用程序更新緩存(如果數據不在緩存中,則先加載到緩存再更新,或者直接創建新的緩存項)。

(2)緩存標記數據為“臟”(dirty),表示需要同步到數據庫。

(3)緩存立即返回成功給應用程序(無需等待數據庫寫入)。

(4)緩存會在之后的某個時間點(例如,緩存滿時、定時任務、或者低負載時)將“臟”數據批量寫入數據庫。

?

五、問題方案

1、緩存穿透

問題原因

????????當查詢不存在的數據時(如無效ID、不存在的用戶名),每次請求都會穿透緩存層直接訪問數據庫。在惡意攻擊場景下(如腳本批量請求隨機ID),數據庫會持續承受無效查詢壓力,導致性能急劇下降甚至崩潰。這種現象與正常緩存未命中的區別在于:正常未命中是偶發的,而穿透是持續性的無效查詢。

// 大量惡意調用
getData("invalid_id_1");
getData("invalid_id_2");
...// 緩存訪問接口
std::string getData(const std::string& key) 
{auto data = cache.get(key); // 緩存查詢if (data.empty()) {data = db.query(key);   // 緩存未命中,查詢數據庫cache.set(key, data);   // 寫入緩存}return data;
}

解決方案

(1)布隆過濾器(Bloom Filter)

  • 在緩存層前設置布隆過濾器作為屏障
  • 工作原理:使用多個哈希函數將鍵映射到位數組中,查詢時:
    • 若鍵不在過濾器中 → 直接返回空(攔截非法請求)
    • 若鍵可能存在 → 繼續查詢緩存/數據庫
  • 特點:存在誤判率(通常<1%),但內存效率極高(1億鍵僅需約100MB)

(2)空值緩存(Cache Null Object)

  • 對查詢結果為空的鍵,緩存特殊標記(如"NULL")
  • 設置較短過期時間(5-30秒),防止惡意請求耗盡空間
  • 需配合監控清理機制,避免存儲過多無效鍵
// C++ 布隆過濾器+空值緩存實現
class BloomFilter {
private:std::vector<bool> bits;std::vector<std::hash<std::string>> hashers;public:BloomFilter(size_t size, int hash_count) : bits(size), hashers(hash_count) {}void add(const std::string& key) {for (auto& hash_fn : hashers) {size_t pos = hash_fn(key) % bits.size();bits[pos] = true;}}bool may_contain(const std::string& key) {for (auto& hash_fn : hashers) {size_t pos = hash_fn(key) % bits.size();if (!bits[pos]) return false;}return true;}
};// 使用示例
BloomFilter filter(1000000, 3); // 100萬位,3個哈希std::string get_data(const std::string& key) {// 布隆過濾器攔截if (!filter.may_contain(key)) return "";// 緩存查詢auto data = cache.get(key);if (data == "NULL") return ""; // 空值標識if (data.empty()) {data = db.query(key);if (data.empty()) {cache.set(key, "NULL", 15); // 緩存空值15秒return "";}cache.set(key, data, 3600); // 緩存有效數據}return data;
}

2、緩存雪崩

問題原因

????????當大量緩存在同一時間段集中過期(如緩存初始化時設置相同TTL),瞬時會有海量請求穿透到數據庫。典型場景包括:

  • 系統啟動時批量加載緩存
  • 定時任務刷新緩存
  • 緩存服務器重啟

雪崩效應會導致數據庫出現流量尖峰,引發連鎖故障(如連接池耗盡、CPU過載)。

解決方案

(1)差異化過期時間

  • 基礎過期時間 + 隨機偏移(如30分鐘 ± 5分鐘)
  • 確保緩存失效時間均勻分布,避免集中失效

(2)雙層緩存策略

  • 主緩存:設置較短TTL(30分鐘),承擔日常請求
  • 備份緩存:設置長TTL(24-48小時)
  • 當主緩存失效時:
    • 先返回備份緩存數據
    • 異步重建主緩存
  • 保證即使主緩存失效,仍有備份數據可用

(3)熱數據永不過期

  • 對核心熱數據(如首頁推薦)采用邏輯過期:
    • 物理上永不過期
    • 后臺線程定期更新數據
    • 數據對象包含邏輯過期時間戳
// C++ 雙層緩存+隨機TTL實現
std::string get_data_avalanche_protected(const std::string& key) {// 隨機數生成器static thread_local std::mt19937 rng(std::random_device{}());static std::uniform_int_distribution<int> dist(-300, 300);// 優先查詢主緩存if (auto data = cache.get("primary_" + key); !data.empty()) return data;// 查詢備份緩存if (auto backup = cache.get("backup_" + key); !backup.empty()) {// 異步重建主緩存std::thread([key, backup] {int ttl = 1800 + dist(rng); // 30分鐘基礎+隨機偏移cache.set("primary_" + key, backup, ttl);}).detach();return backup;}// 查詢數據庫auto data = db.query(key);if (!data.empty()) {int primary_ttl = 1800 + dist(rng);cache.set("primary_" + key, data, primary_ttl);cache.set("backup_" + key, data, 86400); // 備份24小時}return data;
}

3、緩存擊穿

問題原因

當某個熱點Key突然失效時,瞬時海量并發請求同時涌入數據庫。與雪崩的區別在于:

  • 雪崩:大量不同Key同時失效
  • 擊穿:單個熱點Key失效引發風暴

核心危害

  • 單點數據庫壓力暴增(萬級QPS)
  • 可能引發連接池耗盡
  • 重建緩存時的重復查詢浪費資源

解決方案

(1)互斥鎖重建(分布式鎖)

  • 當緩存失效時,僅允許一個線程執行數據庫查詢
  • 其他線程阻塞等待或重試
  • 關鍵點:
    • 鎖粒度:Key級別鎖而非全局鎖
    • 鎖超時:防止死鎖(通常5-10秒)
    • 雙重檢查:獲取鎖后再次驗證緩存

(2)邏輯過期永不過期

  • 緩存永不物理刪除
  • 數據結構包含邏輯過期時間戳
  • 請求處理流程:
    • 返回當前緩存數據(無論是否過期)
    • 異步檢查過期狀態
    • 過期則觸發重建
  • 優點:零等待時間,保證高并發下的可用性

(3)熱點數據監控+預加載

  • 實時監控Key訪問頻率
  • 識別熱點Key后:
    • 延長其TTL
    • 提前異步刷新
    • 在多個緩存節點復制
// C++ 互斥鎖+邏輯過期實現
class HotspotProtection {
private:std::shared_mutex global_mutex;std::unordered_map<std::string, std::shared_ptr<std::mutex>> key_mutexes;struct CacheItem {int64_t logical_expire; // 邏輯過期時間戳(毫秒)std::string data;};public:std::string get_data(const std::string& key) {// 獲取當前緩存項auto item = cache.get<CacheItem>(key);// 未邏輯過期直接返回if (item.logical_expire > get_system_time_millis()) return item.data;// 獲取Key級別鎖std::shared_ptr<std::mutex> key_mutex;{std::shared_lock read_lock(global_mutex);auto it = key_mutexes.find(key);if (it != key_mutexes.end()) key_mutex = it->second;}if (!key_mutex) {std::unique_lock write_lock(global_mutex);key_mutex = key_mutexes[key] = std::make_shared<std::mutex>();}// 鎖定并重建std::unique_lock lock(*key_mutex);// 雙重檢查item = cache.get<CacheItem>(key);if (item.logical_expire > get_system_time_millis()) return item.data;// 查詢數據庫auto new_data = db.query(key);int64_t new_expire = get_system_time_millis() + 3600000; // 1小時后過期// 更新緩存cache.set(key, CacheItem{new_expire, new_data});return new_data;}
};

4、最佳實踐

防御策略

適用場景

優點

缺點

布隆過濾器

防惡意請求/無效鍵

內存高效,攔截精確

存在誤判率

空值緩存

處理不存在數據

簡單易實現

可能存儲大量無效鍵

隨機TTL

防批量緩存同時失效

有效分散壓力

無法應對熱點Key失效

雙層緩存

高可用場景

主備切換平滑

增加內存開銷

互斥鎖重建

防熱點Key擊穿

保證數據一致性

增加請求延遲

邏輯過期

超高并發熱點數據

零等待時間,極致性能

實現復雜度高

分層防御體系

  • 第一層:布隆過濾器攔截非法請求
  • 第二層:空值緩存處理無效查詢
  • 第三層:隨機TTL+雙層緩存防雪崩
  • 第四層:互斥鎖+邏輯過期防擊穿

熱點數據特殊處理

設置熱點閾值,對于熱點 key,延長 TTL、多節點復制

// 熱點Key識別與預加載
class HotspotManager {
public:void monitor_access(const std::string& key) {access_count[key]++;if (access_count[key] > 1000) {   // 達到熱點閾值extend_ttl(key, 3600);        // 延長TTLpreload_replica(key);        // 多節點復制}}
};

熔斷降級機制

  • 當數據庫壓力超過閾值時:
    • 自動觸發熔斷
    • 返回降級內容(如默認推薦)
    • 記錄日志異步補償

持續監控指標

緩存命中率 > 95% # 低于閾值告警

數據庫QPS < 3000 # 超過閾值擴容

穿透請求量 < 100/s # 超過閾值啟動防御

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

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

相關文章

基于GNU Radio Companion搭建的BPSK收發通信實驗

目錄 一、實驗目的和要求 二、實驗內容 1.Lab5 仿真設計一個BPSK的數字收發射系統 Lab6 實際使用RTLSDR解調BPSK信號 一、實驗目的和要求 1.了解軟FM的工作方式和原理,數字通信的碼間串擾及星座圖 2.掌握并正確使用RTL-SDL硬件和Gnuradio軟件 3.正確使用Gnraduo軟件,建…

華為OD機試-返回矩陣中非1的元素、個數/數值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩陣中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis學習筆記——黑馬點評 消息隊列25-30

前言&#xff1a; 學習收獲&#xff1a; Redis消息隊列&#xff1a; 消息隊列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的隊列。最簡單的消息隊列包括3個角色&#xff1a; 消息隊列&#xff1a;存儲和管理消息&#xff0c;也被稱為消息代理生…

基于Django+Vue3的草莓病害檢測系統設計與實現,Web前后端分離,YOLOv8 Web目標檢測系統

這里寫自定義目錄標題 基于DjangoVue3的草莓病害檢測系統 基于DjangoVue3的草莓病害檢測系統 本項目結合 YOLOv8 與 Django Vue3 &#xff0c;構建了一個通用的 Web 前后端系統&#xff0c;便于用戶進行目標檢測的操作和展示&#xff0c;實現對圖片、視頻實時目標檢測和攝像頭…

【MFC】樹控件的使用詳解

目錄 添加線條鏈接 添加折疊小按鈕 設置樹控件的節點和對應的圖標 設置默認選中項 設置選中項切換響應函數 涉及接口介紹&#xff1a; 首先我們通過資源視圖可以添加一個樹形控件&#xff0c;如下&#xff1a; 添加線條鏈接 在樹形控件中&#xff0c;有一個屬性“Has…

跨境賣家警報。抽繩背包版權案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.對其熱銷的抽繩設計多功能運動背包發起跨境版權維權&#xff0c;保護范圍涵蓋產品外觀設計。 案件基本情況&#xff1a; 起訴時間&#xff1a;2025-6-12 案件號&#xff1a;25-cv-06509 原…

Android Activity全面解析:從創建到生命周期的完整指南

Activity作為Android四大組件之一&#xff0c;是構建用戶界面的核心單元。筆者通過郭霖著的第一行代碼入門安卓&#xff0c;內容基本都取自書中&#xff0c;這篇博客作為筆者的筆記同時精簡了一些書中內容分享在csdn中 一、Activity的創建與基礎配置 1.1 創建Activity的基本步…

深入理解 Python 的 secrets 模塊:打造更安全的隨機數生成機制

深入理解 Python 的 secrets 模塊&#xff1a;打造更安全的隨機數生成機制 在構建涉及用戶身份認證、權限管理、加密通信等系統時&#xff0c;開發者最不能忽視的一個問題就是“安全性”。安全問題的核心之一在于“隨機性”——尤其是密碼、驗證碼、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、關鍵術語解析 1.1 并發 (Concurrency) 定義: 并發是指同時處理多個待處理任務的能力&#xff0c;這些任務可以依次或并行&#xff08;如果可能&#xff09;進行&#xff0c;最終每個任務都會成功或失敗。 理解: 單核 CPU: 即使是單核 CPU 也可以實…

DCM4CHEE Archive Light 開發環境部署(5)-IDEA集成調試配置

系列文章目錄 DCM4CHEE Archive light 開發環境部署(1)-前言DCM4CHEE Archive light 開發環境部署(2)-PostgreSQLDCM4CHEE Archive light 開發環境部署(3)-OpenLDAPDCM4CHEE Archive light 開發環境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 開發環境部署(5)-IDEA集成…

在rust中執行命令行輸出中文亂碼解決辦法

如果你使用標準的依賴庫執行命令中包含中文的話&#xff0c; 就會發現中文亂碼&#xff0c;如果你的輸出中沒有中文&#xff0c;就可以正常輸出&#xff0c;因為windows的命令行默認使用的是gbk編碼。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判斷當前瀏覽器卡不卡

方法一&#xff1a;使用 requestAnimationFrame 和時間戳計算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡頓的標志function calculateFPS(currentTime) {frameCount;// 每隔大約 1000 毫秒&#xff08;1秒&#…

51c嵌入式~電路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延長電子元器件的貨架壽命 本文探討了電子元器件的貨架壽命問題&#xff0c;重點討論了氧化、濕度敏感等級&#xff08;MSL&#xff09;與貨架壽命之間的關系。文章通過具體例子說明了氧化對電子元器件可…

Eureka 與 Feign(一)

Eureka 與 Feign 知識解析 1. Eureka Spring Cloud Eureka 是服務發現組件&#xff0c;包含&#xff1a; Eureka Server&#xff1a;注冊中心&#xff0c;管理服務實例Eureka Client&#xff1a;服務實例&#xff0c;向注冊中心注冊/獲取服務信息 核心功能&#xff1a; 服…

AN動畫軟件|Animate 2025百度云下載與安裝教程指南

如大家所了解的&#xff0c;?Animate全稱Adobe Animate&#xff0c;常常也被簡稱為AN。它是一款2D動畫制作軟件?&#xff0c;其前身為Flash Professional CC&#xff0c;2016年更名為Animate CC&#xff0c;支持Flash SWF文件及HTML5動畫創作&#xff0c;廣泛應用于網頁交互、…

提示詞工程中常見協議框架應用實例

一、生成式診斷催化協議(Generative Diagnosis Catalysis, GDC) 技術原理:基于神經符號系統的因果推理引擎,融合貝葉斯網絡與強化學習 實施場景: class DiagnosticCatalyst:def __init__(self, domain="醫療診斷"):self.causal_graph

資深Java工程師的面試題目(七)JDK JVM

以下是針對 Java 面試者 的 JVM 和 JDK 相關題目&#xff0c;涵蓋核心知識點、實際應用場景和進階問題&#xff1a; 一、JVM 基礎 1. JVM 內存模型 題目&#xff1a; 請描述 JVM 的內存模型及其組成部分&#xff0c;并說明每個區域的作用。 解析&#xff1a; JVM 內存模型分…

【系統設計【4】】設計一個限流器:從理論到實踐的完整解決方案

文章目錄 第一步&#xff1a;理解問題并確定設計范圍1、為什么需要限流器2、需求澄清的藝術3、需求總結與優先級 第二步&#xff1a;提出高層次設計并獲得認同1. 限流器的部署位置選擇2. 限流算法的選擇與權衡3. 高層架構設計 第三步&#xff1a;深入設計1、限流規則的設計與管…

基于DETR目標檢測項目

DETR見解 DETR&#xff08;Detection Transformer&#xff09;是一種端到端的目標檢測模型&#xff0c;由Facebook AI Research&#xff08;FAIR&#xff09;于2020年提出。DETR采用了Transformer架構&#xff0c;與傳統的基于區域的目標檢測方法有所不同&#xff0c;它通過全…

ZooKeeper 集群部署

ZooKeeper 集群部署 前言安裝部署資源下載JDK 部署Zookeeper 部署 前言 在 Linux 服務器上部署 Zookeeper 之前&#xff0c;需要先安裝 JDK。以下是相關版本及環境信息&#xff1a; JDK 版本 jdk-17_linux-x64_bin.tar.gz Zookeeper 部署的版本 3.5.7 操作系統版本 Red Hat E…