系統性能的提升方向
服務器并發處理能力 :通過優化內存管理策略、選擇合適的連接模式(長連接或短連接)、改進 I/O
模型(如 epoll
、IOCP
)、以及采用高效的服務器并發策略(如多線程、事件驅動等),可以有效提升服務器的并發響應能力。
數據庫性能優化 :包括合理設計索引、使用連接池減少連接開銷、借助臨時表提升中間數據處理效率、根據需求進行反范式化設計,以及引入各類 NoSQL
技術(如 Redis
、MongoDB
)以緩解關系型數據庫在高并發讀寫場景下的性能瓶頸。
分布式計算能力提升 :通過引入消息隊列等中間件實現異步解耦,以及采用 MapReduce
、Spark
等并行計算模型,能夠在大數據處理與復雜計算場景下顯著提升系統的吞吐量與可伸縮性。
系統擴展性設計 :通過復制與讀寫分離提升數據庫讀寫性能,采用垂直分區(按功能拆分)和水平分區(按數據范圍拆分)對系統進行拆解,并進行業務模塊的合理劃分,從而實現系統的高可擴展性與模塊獨立部署。
代碼級優化與重構 :使用無狀態設計簡化多線程編程,利用資源池(如線程池、連接池)提升資源復用率,同時采用合理的數據結構與實體建模,提高程序執行效率與可維護性。
緩存系統設計 :在分布式環境下,通過頁面緩存、內容靜態化、反向代理緩存等機制,可大幅降低動態內容的生成開銷,是提升系統性能的關鍵手段之一。
在上述各類性能優化手段中,緩存機制通常是性價比最高、最優先考慮的方案 ,可在不修改核心業務邏輯的前提下,迅速降低系統負載并提升響應速度。
服務器并發處理策略
? 1. 連接模式選擇:長連接 vs 短連接
模式 特點 適用場景 長連接 一次連接,多次請求 高頻交互,如 IM
、WebSocket
、微服務調用 短連接 每次請求后即關閉連接 請求頻率低、簡單事務型操作,如 HTTP API
、圖片訪問
🔎 選擇建議 :
請求頻繁、會話狀態相關:用長連接 可減少握手開銷 事務性請求、客戶端數量極多(如 CDN
邊緣):短連接 可節省服務器資源
? 2. I/O 模型選擇:阻塞、非阻塞、I/O 多路復用、異步 I/O
模型 描述 適用場景 阻塞 I/O 簡單直觀,效率低 小型系統、原型階段 非阻塞 I/O 不阻塞系統調用,需輪詢 簡單異步場景 I/O 多路復用(select、epoll) 1個線程監聽多個連接 高并發網絡服務,如 HTTP
網關、代理 異步 I/O(如 IOCP、Linux AIO) 操作系統通知事件完成 超高性能、對響應延遲要求極高的系統,如交易系統
🔎 選擇建議 :
Linux
+ 高并發:epoll 是主流選擇(如 nginx
)Windows
高并發:IOCP 高 IOPS
場景(如文件服務器):可研究 AIO
? 3. 并發策略選擇:多進程、多線程、事件驅動、線程池
策略 描述 適用場景 多進程 穩定、隔離性好,但開銷大 Web
服務器(如 nginx master-worker
模型)多線程 資源利用率高,但線程切換開銷大 多核 CPU
、大量并發連接 事件驅動(Reactor) 低資源占用,高性能 網絡服務器,RPC
框架(如 libevent
、Muduo
) 線程池 控制線程數,避免頻繁創建銷毀 IO
密集型服務、業務層線程池
🔎 選擇建議 :
網絡服務器:事件驅動 + IO 多路復用 + 線程池 是常見組合(如 Muduo
、nginx
) CPU
密集:使用多線程并做任務切分多核 CPU
+ 并發多任務:Reactor + 多線程處理
🧠 實戰建議:如何選型?
場景 推薦選型 API
網關長連接 + epoll
+ 多線程或線程池 聊天服務器 長連接 + epoll/Reactor
+ 線程池 文件傳輸服務 長連接 + 異步 IO
(或多線程) 高并發 Web
服務 短連接 + epoll
+ 事件驅動(nginx
模型) 內部微服務 長連接(HTTP/2
或 RPC
)+ 多線程
📌 總結選擇思路
并發連接多,IO等待多 → IO
多路復用(epoll
)+ 事件驅動計算密集型任務多 → 多線程 + CPU
親和綁定連接數量巨大,響應輕量 → 長連接 + 異步 IO
任務獨立、需隔離 → 多進程模型(如 Redis
、nginx
)
數據庫性能優化
? 1. 索引設計
技術 說明 適用場景 B+ 樹索引(普通索引、聯合索引) 提高查詢效率,適用于范圍查詢、排序等 大量 SELECT
查詢,尤其 WHERE
子句帶條件的表 哈希索引(如 Memory 表引擎) 精確匹配極快 等值查詢場景,非范圍查找 全文索引(MySQL InnoDB) 用于模糊匹配、搜索引擎 日志搜索、文章檢索等文本內容匹配場景 覆蓋索引 查詢字段只使用索引,無需訪問表 索引列即查詢列,提升查詢速度
🔎 選擇建議 :
查詢慢?→ 查看慢查詢日志 + 建立合適的索引(注意選擇性) 索引太多?→ 檢查冗余索引,避免過多影響寫性能
? 2. 連接池
技術 說明 適用場景 連接池(如 C3P0、HikariCP) 復用數據庫連接,避免頻繁建立銷毀連接 所有高并發場景,尤其是 Web
服務、大量短連接請求系統 線程池 + 連接池協同 配合線程調度,均衡資源 業務層中間件(如 C++
后端服務)
🔎 選擇建議 :
不用連接池會導致大量創建/銷毀連接,吞吐量下降 嚴重 C++
可用 libpqxx(PostgreSQL
)、MySQL Connector/C++、自己封裝連接池(如基于 smart pointer
+ blocking queue
)
? 3. 臨時表
技術 說明 適用場景 內存臨時表 小數據量中間處理(如排序/聚合) 報表統計、分頁排序 磁盤臨時表 內存不足時自動切換 大量 join
、子查詢場景
🔎 選擇建議 :
有復雜 SQL
查詢(如多級聚合)?→ 考慮手動使用臨時表優化可控性 MySQL
中避免觸發磁盤臨時表:限制排序字段長度 + 增加排序用索引
? 4. 反范式化
技術 說明 適用場景 冗余字段 少量重復存儲,避免頻繁 join
查詢頻繁、性能敏感 表合并 結構變復雜,性能變高 用戶展示型數據表,非核心寫邏輯表
🔎 選擇建議 :
如果 join
表太多導致慢查詢 → 適當反范式化 讀多寫少(如商品展示頁)→ 適合冗余存儲
? 5. 引入 NoSQL 技術
技術 說明 適用場景 Redis 高速鍵值緩存,支持事務/過期策略 緩存、排行榜、消息隊列、會話管理 MongoDB 文檔型存儲,結構靈活 JSON
類數據存儲、大量變字段的業務(如日志)Elasticsearch 搜索引擎型數據庫 全文檢索、日志分析、排序查詢 Cassandra、HBase 分布式可擴展大表存儲 海量寫入、IoT
場景等
🔎 選擇建議 :
緩存讀優化 → 用 Redis
(熱點數據) 大字段/結構變化多的數據 → MongoDB
搜索功能復雜 → Elasticsearch
千萬級行寫入/大規模分布式寫入 → Cassandra
/HBase
🧠 如何綜合選擇優化策略?
問題 優化方向 查詢慢 檢查慢查詢 + 建立合適索引 + 考慮反范式化 并發訪問高 連接池 + NoSQL
緩存(Redis
) SQL
復雜拆解邏輯,使用臨時表優化查詢鏈路 數據寫入高頻 引入 NoSQL
存儲(Redis
、Cassandra
)或批處理機制 表結構復雜、字段經常變 使用 MongoDB
等文檔型數據庫
🎯 總結
不同的優化策略適用于不同場景,選擇的核心是明確性能瓶頸 。優化順序推薦如下:
先看是否是 查詢性能問題(索引 + SQL 優化) 再看是否是 連接/并發瓶頸(連接池 + 分布式) 然后關注 數據建模與緩存(反范式化 + Redis) 最后根據業務量判斷是否需要 引入 NoSQL 或數據拆分
分布式計算能力提升
? 一、消息隊列(MQ)用于異步解耦
🌐 技術作用:
實現服務之間的異步調用(解耦發送方和接收方) 削峰填谷,提高系統吞吐量 支持事務、失敗重試、延遲處理等機制
🚦適用場景:
場景 使用 MQ 的價值 用戶下單、發短信、發郵件等 異步執行,不阻塞主流程 秒殺、搶購高并發場景 異步削峰,寫入隊列慢慢消費 多系統數據同步 系統間廣播變更消息 解耦微服務依賴 發布-訂閱模型,提高模塊獨立性
🔧 常見 MQ 技術選型:
MQ 產品 優勢 劣勢 Kafka 高吞吐、分布式、順序寫 延遲略高,事務弱 RabbitMQ 成熟、功能強、事務支持好 吞吐較低,運維復雜 RocketMQ(阿里開源) 高性能、事務支持、分布式好 文檔略少,學習曲線中等 Redis Stream 快速上手、輕量 不適合超大吞吐、長隊列持久化
? 如何選擇:
需求類型 推薦方案 高吞吐 + 實時日志處理 Kafka
系統解耦 + 順序 + 事務 RocketMQ
或 RabbitMQ
小型服務 + 快速上線 Redis Stream
事件驅動微服務 Kafka
或 RabbitMQ
(如 Saga
模式)
? 二、MapReduce / Spark 等并行計算框架
🌐 目的:
解決單機計算瓶頸(CPU
、內存) 分布式并行處理大規模數據 (GB
~PB
級) 高可擴展性、容錯能力強
🚦適用場景:
場景 適合并行計算的模型 大數據離線處理 日志聚合、用戶行為分析 多機并行運算 海量圖片處理、模型訓練 數據倉庫構建 ETL
、數據清洗、轉換實時數據分析 實時 BI
指標、流式計算
🔧 MapReduce vs Spark 比較表:
特性 MapReduce Spark 編程模型 Map
→ Reduce
流程固定更靈活,有 RDD
、DataFrame
內存利用 基于磁盤,慢 基于內存計算,快很多 實時計算 不支持 Spark Streaming
支持容錯機制 高,適合批處理 高,也支持流計算 使用語言 Java
為主支持 Scala
、Python
、Java
、C++
學習成本 中等 中等偏高(但生態更好)
? 如何選擇:
應用需求 建議使用 離線批量處理、可靠性強 Hadoop MapReduce
(如大規模日志清洗)實時處理、機器學習、復雜管道任務 Spark
(性能更好,支持 SQL
、MLlib
、GraphX
)輕量流式分析(Kafka + 輕量處理) Spark Streaming
/ Flink
不想部署集群,輕量任務 多線程 + 分布式任務調度(如 Celery
、任務隊列)即可
? 三、整合:如何搭建高性能分布式計算架構
🧱 推薦組合模型 (企業常見):
[客戶端請求]↓[Web API 網關]↓┌────────────────────┐│ MQ 消息隊列 │(如 Kafka / RocketMQ)└────────────────────┘↓ ↓[服務A:數據入庫] [服務B:Spark 分析任務]↓[HDFS / Hive / Redis]
🔑 優勢 :
解耦服務:不影響主流程,避免阻塞 靈活計算:數據到 Spark
處理,支持定時任務或實時流 統一調度:可以用 Airflow
/ DolphinScheduler
統一管理任務依賴
📌 總結選擇建議
問題 推薦方案 服務調用解耦、削峰填谷 消息隊列(Kafka
/ RabbitMQ
) 大規模離線處理 Hadoop MapReduce
快速實時處理,靈活調度 Spark
/ Spark Streaming
輕量級 C++
分布式 ZeroMQ
+ 多線程 + 分布式調度腳本微服務架構 + 數據同步 Kafka
+ Spark
/Flink
處理鏈
如果你在用 C++ 開發 ,可以結合:
Kafka
的 C++
客戶端(如 librdkafka)與 Spark
/MapReduce
聯動通過 REST AP
I 或中間文件通信(例如 C++
寫中間結果 → HDFS
) 或采用 RPC
框架(如 brpc
)連接消息隊列和分布式計算節點
系統擴展性設計
? 一、復制與讀寫分離(Replication & Read/Write Splitting)
🧩 技術解釋:
主從復制 :數據庫主節點寫入數據,從節點復制主數據做只讀查詢。讀寫分離 :將寫請求發送至主庫,讀請求發送至多個從庫,實現并發讀取負載均衡。
🔍 適用場景:
條件 是否推薦 讀操作遠大于寫操作(如 80%
是查詢) ? 極推薦 數據一致性要求不是強一致(可 eventual
) ? 適用 寫請求也很多 ? 不適用(需搭配分庫策略)
?? 注意事項:
會有 主從延遲 (不適合秒級一致的寫后讀場景) 多數配合中間件(如 MyCat
、ShardingSphere
)或應用層實現路由
? 二、垂直分區(Vertical Partitioning)
🧩 技術解釋:
按照功能/模塊/業務邊界 對系統進行拆解,形成多個獨立服務(微服務思維)
🧩 數據層:將一個表的字段按用途拆分成多個表
🔍 適用場景:
條件 是否推薦 系統功能復雜,業務邊界清晰 ? 推薦 不同業務模塊開發部署頻繁 ? 推薦 表字段數量過多(上百列) ? 推薦進行字段級拆分 強依賴業務聚合 & 跨模塊事務多 ? 拆分后處理復雜(可使用分布式事務中間件)
?? 注意事項:
模塊間依賴需通過 API
/消息通信 依賴統一配置中心和服務注冊(微服務架構)
? 三、水平分區(Horizontal Partitioning,也稱分庫分表)
🧩 技術解釋:
按照數據內容范圍或哈希值將同一個表的數據分散到多個表/數據庫中 例:user_0001
, user_0002
, …,或者將用戶ID
哈希后落到不同表 常見的分片方式: 范圍分片(Range
):按時間或ID
段劃分 哈希分片(Hash
):按ID
哈希后取模
🔍 適用場景:
條件 是否推薦 單表數據量過大(>千萬級) ? 強烈推薦 寫請求并發高,主庫壓力大 ? 推薦 查詢需要跨庫 Join
、多表事務 ? 避免(拆分代價大)
?? 注意事項:
涉及 跨庫事務困難 涉及分片路由邏輯,需引入 Sharding
中間件(如 ShardingSphere
、Cobar
) 復雜查詢、分頁、排序需額外處理(例如匯總后再統一排序)
? 四、業務模塊劃分(功能解耦)
🧩 技術解釋:
按照業務領域進行模塊劃分(DDD
思想) 每個模塊對應獨立的部署單元,可獨立擴展、獨立部署
🌐 微服務是最典型的模塊劃分架構:
服務名稱 功能職責 UserService
負責用戶注冊、認證 OrderService
負責下單、支付流程 ProductService
商品上架、庫存管理
🔍 適用場景:
條件 是否推薦 團隊開發協作、持續交付要求高 ? 推薦 不同業務增長速度不同 ? 推薦(分布式擴展) 系統規模小,功能簡單 ? 不適合(引入復雜性過高)
? 選擇指南:如何判斷哪種擴展方式優先使用?
問題 推薦技術 數據庫讀壓力大 ? 主從復制 + 讀寫分離 單表數據過大(千萬以上) ? 水平分表(按用戶ID
、時間等) 系統模塊越來越多 ? 垂直分區(功能拆分) + 微服務 跨團隊協作 + 獨立部署 ? 微服務 + 獨立數據庫/緩存 查詢、聚合依賴多個服務 ? 拆分前需評估成本(事務復雜)
🎯 實戰架構建議(以 C++ 后端為例)
+-----------------+| API 網關 |+--------+--------+|┌──────────┴──────────┐| |+-------▼------+ +--------▼--------+|用戶服務(C++) | | 訂單服務(C++) |+-------+------+ +--------+--------+| |+-----------▼----+ +-------▼---------+| user_db_master | | order_db_master || user_db_slave | | order_db_slave |+----------------+ +------------------+
讀寫分離 :主庫寫,從庫讀服務垂直拆分 :按功能拆解,解耦模塊模塊擴展性好 :可獨立擴展每個模塊,用戶服務扛不住壓力 → 單獨擴容
? 總結
技術 優勢 適用 主從復制 + 讀寫分離 提高讀性能,結構簡單 查詢為主的系統 垂直分區 解耦模塊,易擴展 功能多、團隊開發協作多的系統 水平分區 提高寫性能,突破單表瓶頸 單表太大、寫并發高 模塊劃分(微服務) 易維護、獨立部署 中大型系統,迭代快
代碼級優化與重構的選擇
? 1. 無狀態設計:簡化多線程編程的基礎
🎯 設計原則:
不保存請求上下文和狀態信息,避免線程共享變量 每次請求是獨立的,天然并發安全(無鎖或極少加鎖)
? 使用時機:
條件 是否適合使用無狀態設計 服務是冪等的 ,無強狀態依賴 ? 非常適合 多線程處理請求,不共享全局狀態 ? 推薦 請求過程中需維持用戶上下文 ? 不適合(需借助 Token
/ Session
)
🧠 C++中示例:
void handleRequest ( const Request& req) { Response res = process ( req) ; sendResponse ( res) ;
}
?? 注意:
無狀態 ≠ 不使用狀態,而是狀態不共享 或通過參數/上下文傳遞
? 2. 資源池:提升資源復用率的關鍵
🧩 常見資源池:
類型 作用 線程池 復用線程,避免頻繁創建/銷毀 連接池(數據庫、Redis) 緩存連接,減少 TCP
連接開銷 對象池 減少頻繁分配大對象(如圖像緩沖區、臨時數據結構)
? 選擇建議:
場景 建議資源池 有大量短生命周期線程任務(如請求處理) ? 線程池 數據庫訪問頻繁,連接代價高 ? 數據庫連接池 Redis
/QPS
高頻、連接初始化慢? Redis
連接池 大量對象頻繁創建(如內存塊、JSON
結構) ? 對象池 / arena allocator
C++ 示例(線程池):
ThreadPool pool ( 8 ) ; pool. enqueue ( [ ] ( ) { doHeavyTask ( ) ;
} ) ;
? 3. 合理選擇數據結構:代碼優化最“性價比高”的手段
🎯 核心理念:選用適合場景的數據結構 ,避免暴力遍歷 &不必要的內存浪費
📌 常見優化對比:
場景 推薦數據結構 原因 高頻插入 + 查詢 unordered_map
哈希結構 O(1)
查詢 排序、大量查找 std::map
/ set
紅黑樹結構 O(logN)
實時日志緩存、隊列 deque
/ ring buffer
高效首尾操作 圖結構搜索 adjacency list + BFS/DFS
更快更省空間 大對象重復構建 string_view
/ 指針引用減少拷貝
C++ 示例(替代 std::map):
std:: unordered_map< int , string> fastLookup;
? 4. 實體建模:程序可維護性與可演化性的核心
🧩 什么是實體建模?
將業務模型抽象為清晰的類、結構體、接口 遵循 SOLID
原則(單一職責、開閉原則等) 有良好的接口設計、數據封裝、抽象層次清晰
? 建模是否合理看以下幾點:
問題 是否建模良好 業務代碼解耦、類職責單一 ? 是 修改一個功能不用改很多模塊 ? 是 類型擴展容易,依賴抽象而非實現 ? 是 所有邏輯堆在一個大類中 ? 重構必要 模型隨業務混亂擴張 ? 設計缺陷
C++ 建模建議:
使用 class
/ struct
區分數據 vs 行為 使用虛函數 / 接口實現面向接口編程 借助模板、策略模式實現高效復用
🧭 如何選擇代碼級優化策略?
優化目標 推薦策略 提高并發安全性,減少鎖 ? 無狀態設計 減少資源開銷(連接/線程) ? 資源池 提升邏輯性能(執行速度) ? 高效數據結構 提高代碼可維護性、解耦 ? 合理建模 & 模塊化 QPS
高、請求多、服務負載重? 多線程 + 線程池 + 無狀態設計 長連接資源多,初始化代價大 ? 連接池 + 對象池
🎯 總結
技術點 優勢 適用場景 無狀態設計 并發安全、易擴展 高并發請求、微服務、REST API
線程池/連接池 控制資源復用 高 QPS
系統,IO
密集型服務 高效數據結構 提升執行效率 大數據、高性能處理 建模重構 易維護、可擴展 中長期開發、團隊協作、領域演化
緩存系統設計
? 1. 常見緩存機制概覽
緩存類型 工作位置 典型用途 示例技術 頁面緩存 客戶端或CDN
層 整個頁面內容緩存 CDN
、Nginx
、Varnish
內容靜態化 服務端生成靜態HTML
頻繁訪問的動態頁面 靜態 HTML
+ Nginx
反向代理緩存 應用前端(邊緣) 緩存接口響應/資源 Nginx
、Varnish
應用內緩存 后端服務中 緩存對象/數據結果 本地Map
、Guava(Java)
分布式緩存 獨立緩存服務 多節點共享熱點數據 Redis
、Memcached
? 2. 各類緩存機制詳解與選擇建議
① 頁面緩存(Page Cache)
緩存粒度: 整個 HTML
頁面 典型實現: CDN
、Nginx
、瀏覽器本地緩存
? 優點: 命中后無需訪問后端,速度極快 適合完全靜態或少變動的內容 ? 缺點: 個性化內容不適合緩存 無法精細控制緩存更新(例如登錄態變化)
? 適用場景:
新聞門戶、展示型官網、商品詳情頁 用戶登錄前的靜態內容
② 內容靜態化(Static Rendering)
緩存粒度: HTML
片段或頁面 實現方式: 后端動態內容預先渲染并存為靜態HTML
,或用 SSR
方式生成
? 優點: 避免每次都走數據庫或模板引擎 與 CDN
/Nginx
配合使用效果更佳 ? 缺點: 內容更新依賴定時任務或觸發機制 對需要實時更新的內容不適合
? 適用場景:
博客、新聞詳情頁、活動頁 一小時以內可容忍數據延遲的頁面
③ 反向代理緩存(Reverse Proxy Cache)
緩存粒度: URI
請求或 API
返回數據 實現方式: Nginx
/ Varnish
等緩存請求結果
? 優點: 不需要改動業務代碼 支持過期策略、緩存 key
規則配置靈活 ? 缺點: 邏輯復雜的接口緩存命中率低 動態接口緩存控制需依賴 header
/參數設計
? 適用場景:
搜索頁、列表頁、排行榜接口 查詢參數固定、結果可緩存的 API
④ 應用內緩存(本地緩存)
緩存粒度: 單服務進程內緩存熱點數據 實現方式: C++
中用 map
、LRU
緩存等結構
? 優點: 訪問速度最快(內存命中) 減輕數據庫和分布式緩存壓力 ? 缺點: 無法跨進程共享,服務重啟即失效 不適合動態變更頻繁的數據
? 適用場景:
熱門配置參數、本地字典映射、計數器 每個服務都需要高頻訪問的一致性小數據集
⑤ 分布式緩存(如 Redis、Memcached)
緩存粒度: 跨服務共享的對象、結構、數據結果 典型用途: 用戶信息、Session
、熱點數據、排行榜、購物車數據等
? 優點: ? 缺點: 網絡訪問有延遲(比本地慢) 需維護一致性與緩存雪崩、穿透等問題
? 適用場景:
任何需要多實例共享緩存的場景 高并發熱點查詢 電商系統中的價格、庫存緩存
? 3. 緩存選擇對比表(速查)
需求/特征 推薦緩存方式 靜態頁面,無需頻繁更新 ? 頁面緩存 / 靜態化 API
查詢頻率高,參數固定? 反向代理緩存 結構化數據頻繁訪問,讀多寫少 ? Redis
緩存(帶過期) 超高頻小數據、快速命中 ? 應用內緩存(Map
/ LRU
) 個性化內容緩存 ? 本地緩存 + Redis
分組合 大量跨服務訪問的共享數據 ? 分布式緩存
? 4. 實戰建議:如何設計分布式緩存架構(C++ 后端)
[Browser]|+------+------+| CDN/Edge | ← 頁面緩存+------+------+|[Nginx] ← 反向代理緩存|[C++ Backend]/ \
[本地LRU緩存] [Redis緩存]\ /[MySQL/PostgreSQL]
? 5. 綜合推薦選擇策略
目標 推薦策略 降低接口 QPS
,減輕數據庫壓力 ? Redis
緩存接口結果 快速返回頁面,極低延遲 ? 靜態頁面 + 頁面緩存 無需代碼改動,直接加緩存 ? Nginx
/Varnish
反向代理緩存 服務間共享熱門數據 ? Redis
或 Memcached
熱門數據每個服務反復用 ? 本地緩存 + 定時刷新(LRU
)
? 6. Bonus:緩存淘汰與一致性策略
淘汰策略:LRU
, LFU
, TTL
(Redis
支持) 緩存更新策略: 被動更新(超時失效) 主動更新(數據修改時同步更新緩存) 緩存穿透:空值也緩存、布隆過濾器 緩存雪崩:過期時間隨機化、降級兜底
如果你使用的是 C++
,你可能會用:
功能 C++ 實現方案 本地緩存 std::unordered_map + LRU策略
Redis
訪問hiredis
/ redis-plus-plus
CDN
靜態資源托管Nginx
+ HTML
靜態渲染Proxy
緩存控制Nginx
+ cache-control
頭設置
🎯 總結
靜態頁面優先 CDN,接口結果優先 Redis,熱點對象優先本地緩存,統一緩存路由通過中間層控制。
參考
系統架構設計