系統性能優化的關鍵手段

系統性能的提升方向

  1. 服務器并發處理能力:通過優化內存管理策略、選擇合適的連接模式(長連接或短連接)、改進 I/O 模型(如 epollIOCP)、以及采用高效的服務器并發策略(如多線程、事件驅動等),可以有效提升服務器的并發響應能力。

  2. 數據庫性能優化:包括合理設計索引、使用連接池減少連接開銷、借助臨時表提升中間數據處理效率、根據需求進行反范式化設計,以及引入各類 NoSQL 技術(如 RedisMongoDB)以緩解關系型數據庫在高并發讀寫場景下的性能瓶頸。

  3. 分布式計算能力提升:通過引入消息隊列等中間件實現異步解耦,以及采用 MapReduceSpark 等并行計算模型,能夠在大數據處理與復雜計算場景下顯著提升系統的吞吐量與可伸縮性。

  4. 系統擴展性設計:通過復制與讀寫分離提升數據庫讀寫性能,采用垂直分區(按功能拆分)和水平分區(按數據范圍拆分)對系統進行拆解,并進行業務模塊的合理劃分,從而實現系統的高可擴展性與模塊獨立部署。

  5. 代碼級優化與重構:使用無狀態設計簡化多線程編程,利用資源池(如線程池、連接池)提升資源復用率,同時采用合理的數據結構與實體建模,提高程序執行效率與可維護性。

  6. 緩存系統設計:在分布式環境下,通過頁面緩存、內容靜態化、反向代理緩存等機制,可大幅降低動態內容的生成開銷,是提升系統性能的關鍵手段之一。

在上述各類性能優化手段中,緩存機制通常是性價比最高、最優先考慮的方案,可在不修改核心業務邏輯的前提下,迅速降低系統負載并提升響應速度。


服務器并發處理策略

? 1. 連接模式選擇:長連接 vs 短連接

模式特點適用場景
長連接一次連接,多次請求高頻交互,如 IMWebSocket、微服務調用
短連接每次請求后即關閉連接請求頻率低、簡單事務型操作,如 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 框架(如 libeventMuduo
線程池控制線程數,避免頻繁創建銷毀IO密集型服務、業務層線程池

🔎 選擇建議

  • 網絡服務器:事件驅動 + IO 多路復用 + 線程池 是常見組合(如 Muduonginx
  • CPU 密集:使用多線程并做任務切分
  • 多核 CPU + 并發多任務:Reactor + 多線程處理

🧠 實戰建議:如何選型?

場景推薦選型
API 網關長連接 + epoll + 多線程或線程池
聊天服務器長連接 + epoll/Reactor + 線程池
文件傳輸服務長連接 + 異步 IO(或多線程)
高并發 Web 服務短連接 + epoll + 事件驅動(nginx 模型)
內部微服務長連接(HTTP/2RPC)+ 多線程

📌 總結選擇思路

  1. 并發連接多,IO等待多IO 多路復用(epoll)+ 事件驅動
  2. 計算密集型任務多 → 多線程 + CPU 親和綁定
  3. 連接數量巨大,響應輕量 → 長連接 + 異步 IO
  4. 任務獨立、需隔離 → 多進程模型(如 Redisnginx

數據庫性能優化

? 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 存儲(RedisCassandra)或批處理機制
表結構復雜、字段經常變使用 MongoDB 等文檔型數據庫

🎯 總結

不同的優化策略適用于不同場景,選擇的核心是明確性能瓶頸。優化順序推薦如下:

  1. 先看是否是 查詢性能問題(索引 + SQL 優化)
  2. 再看是否是 連接/并發瓶頸(連接池 + 分布式)
  3. 然后關注 數據建模與緩存(反范式化 + Redis)
  4. 最后根據業務量判斷是否需要 引入 NoSQL 或數據拆分

分布式計算能力提升

? 一、消息隊列(MQ)用于異步解耦

🌐 技術作用:

  • 實現服務之間的異步調用(解耦發送方和接收方)
  • 削峰填谷,提高系統吞吐量
  • 支持事務、失敗重試、延遲處理等機制

🚦適用場景:

場景使用 MQ 的價值
用戶下單、發短信、發郵件等異步執行,不阻塞主流程
秒殺、搶購高并發場景異步削峰,寫入隊列慢慢消費
多系統數據同步系統間廣播變更消息
解耦微服務依賴發布-訂閱模型,提高模塊獨立性

🔧 常見 MQ 技術選型:

MQ 產品優勢劣勢
Kafka高吞吐、分布式、順序寫延遲略高,事務弱
RabbitMQ成熟、功能強、事務支持好吞吐較低,運維復雜
RocketMQ(阿里開源)高性能、事務支持、分布式好文檔略少,學習曲線中等
Redis Stream快速上手、輕量不適合超大吞吐、長隊列持久化

? 如何選擇:

需求類型推薦方案
高吞吐 + 實時日志處理Kafka
系統解耦 + 順序 + 事務RocketMQRabbitMQ
小型服務 + 快速上線Redis Stream
事件驅動微服務KafkaRabbitMQ(如 Saga 模式)

? 二、MapReduce / Spark 等并行計算框架

🌐 目的:

  • 解決單機計算瓶頸(CPU、內存)
  • 分布式并行處理大規模數據GB~PB 級)
  • 高可擴展性、容錯能力強

🚦適用場景:

場景適合并行計算的模型
大數據離線處理日志聚合、用戶行為分析
多機并行運算海量圖片處理、模型訓練
數據倉庫構建ETL、數據清洗、轉換
實時數據分析實時 BI 指標、流式計算

🔧 MapReduce vs Spark 比較表:

特性MapReduceSpark
編程模型MapReduce 流程固定更靈活,有 RDDDataFrame
內存利用基于磁盤,慢基于內存計算,快很多
實時計算不支持Spark Streaming 支持
容錯機制高,適合批處理高,也支持流計算
使用語言Java 為主支持 ScalaPythonJavaC++
學習成本中等中等偏高(但生態更好)

? 如何選擇:

應用需求建議使用
離線批量處理、可靠性強Hadoop MapReduce(如大規模日志清洗)
實時處理、機器學習、復雜管道任務Spark(性能更好,支持 SQLMLlibGraphX
輕量流式分析(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++ 開發,可以結合:

  • KafkaC++ 客戶端(如 librdkafka)
  • Spark/MapReduce 聯動通過 REST API 或中間文件通信(例如 C++ 寫中間結果 → HDFS
  • 或采用 RPC 框架(如 brpc)連接消息隊列和分布式計算節點

系統擴展性設計

? 一、復制與讀寫分離(Replication & Read/Write Splitting)

🧩 技術解釋:

  • 主從復制:數據庫主節點寫入數據,從節點復制主數據做只讀查詢。
  • 讀寫分離:將寫請求發送至主庫,讀請求發送至多個從庫,實現并發讀取負載均衡。

🔍 適用場景:

條件是否推薦
讀操作遠大于寫操作(如 80% 是查詢)? 極推薦
數據一致性要求不是強一致(可 eventual? 適用
寫請求也很多? 不適用(需搭配分庫策略)

?? 注意事項:

  • 會有 主從延遲(不適合秒級一致的寫后讀場景)
  • 多數配合中間件(如 MyCatShardingSphere)或應用層實現路由

? 二、垂直分區(Vertical Partitioning)

🧩 技術解釋:

  • 按照功能/模塊/業務邊界對系統進行拆解,形成多個獨立服務(微服務思維)
    • 例:用戶服務、訂單服務、支付服務、搜索服務……

🧩 數據層:將一個表的字段按用途拆分成多個表

  • 用戶表按頻繁字段 & 低頻字段分表

🔍 適用場景:

條件是否推薦
系統功能復雜,業務邊界清晰? 推薦
不同業務模塊開發部署頻繁? 推薦
表字段數量過多(上百列)? 推薦進行字段級拆分
強依賴業務聚合 & 跨模塊事務多? 拆分后處理復雜(可使用分布式事務中間件)

?? 注意事項:

  • 模塊間依賴需通過 API/消息通信
  • 依賴統一配置中心和服務注冊(微服務架構)

? 三、水平分區(Horizontal Partitioning,也稱分庫分表)

🧩 技術解釋:

  • 按照數據內容范圍或哈希值將同一個表的數據分散到多個表/數據庫中
    • 例:user_0001, user_0002, …,或者將用戶ID哈希后落到不同表
  • 常見的分片方式:
    • 范圍分片(Range):按時間或ID段劃分
    • 哈希分片(Hash):按ID哈希后取模

🔍 適用場景:

條件是否推薦
單表數據量過大(>千萬級)? 強烈推薦
寫請求并發高,主庫壓力大? 推薦
查詢需要跨庫 Join、多表事務? 避免(拆分代價大)

?? 注意事項:

  • 涉及 跨庫事務困難
  • 涉及分片路由邏輯,需引入 Sharding 中間件(如 ShardingSphereCobar
  • 復雜查詢、分頁、排序需額外處理(例如匯總后再統一排序)

? 四、業務模塊劃分(功能解耦)

🧩 技術解釋:

  • 按照業務領域進行模塊劃分(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);  // 固定 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;  // 替代 std::map

? 4. 實體建模:程序可維護性與可演化性的核心

🧩 什么是實體建模?

  • 將業務模型抽象為清晰的類、結構體、接口
  • 遵循 SOLID 原則(單一職責、開閉原則等)
  • 有良好的接口設計、數據封裝、抽象層次清晰

? 建模是否合理看以下幾點:

問題是否建模良好
業務代碼解耦、類職責單一? 是
修改一個功能不用改很多模塊? 是
類型擴展容易,依賴抽象而非實現? 是
所有邏輯堆在一個大類中? 重構必要
模型隨業務混亂擴張? 設計缺陷

C++ 建模建議:

  • 使用 class / struct 區分數據 vs 行為
  • 使用虛函數 / 接口實現面向接口編程
  • 借助模板、策略模式實現高效復用

🧭 如何選擇代碼級優化策略?

優化目標推薦策略
提高并發安全性,減少鎖? 無狀態設計
減少資源開銷(連接/線程)? 資源池
提升邏輯性能(執行速度)? 高效數據結構
提高代碼可維護性、解耦? 合理建模 & 模塊化
QPS 高、請求多、服務負載重? 多線程 + 線程池 + 無狀態設計
長連接資源多,初始化代價大? 連接池 + 對象池

🎯 總結

技術點優勢適用場景
無狀態設計并發安全、易擴展高并發請求、微服務、REST API
線程池/連接池控制資源復用QPS 系統,IO密集型服務
高效數據結構提升執行效率大數據、高性能處理
建模重構易維護、可擴展中長期開發、團隊協作、領域演化

緩存系統設計

? 1. 常見緩存機制概覽

緩存類型工作位置典型用途示例技術
頁面緩存客戶端或CDN整個頁面內容緩存CDNNginxVarnish
內容靜態化服務端生成靜態HTML頻繁訪問的動態頁面靜態 HTML + Nginx
反向代理緩存應用前端(邊緣)緩存接口響應/資源NginxVarnish
應用內緩存后端服務中緩存對象/數據結果本地MapGuava(Java)
分布式緩存獨立緩存服務多節點共享熱點數據RedisMemcached

? 2. 各類緩存機制詳解與選擇建議

① 頁面緩存(Page Cache)

緩存粒度: 整個 HTML 頁面
典型實現: CDNNginx、瀏覽器本地緩存

  • ? 優點:
    • 命中后無需訪問后端,速度極快
    • 適合完全靜態或少變動的內容
  • ? 缺點:
    • 個性化內容不適合緩存
    • 無法精細控制緩存更新(例如登錄態變化)

? 適用場景:

  • 新聞門戶、展示型官網、商品詳情頁
  • 用戶登錄前的靜態內容

② 內容靜態化(Static Rendering)

緩存粒度: HTML片段或頁面
實現方式: 后端動態內容預先渲染并存為靜態HTML,或用 SSR 方式生成

  • ? 優點:
    • 避免每次都走數據庫或模板引擎
    • CDN/Nginx 配合使用效果更佳
  • ? 缺點:
    • 內容更新依賴定時任務或觸發機制
    • 對需要實時更新的內容不適合

? 適用場景:

  • 博客、新聞詳情頁、活動頁
  • 一小時以內可容忍數據延遲的頁面

③ 反向代理緩存(Reverse Proxy Cache)

緩存粒度: URI 請求或 API 返回數據
實現方式: Nginx / Varnish 等緩存請求結果

  • ? 優點:
    • 不需要改動業務代碼
    • 支持過期策略、緩存 key 規則配置靈活
  • ? 缺點:
    • 邏輯復雜的接口緩存命中率低
    • 動態接口緩存控制需依賴 header/參數設計

? 適用場景:

  • 搜索頁、列表頁、排行榜接口
  • 查詢參數固定、結果可緩存的 API

④ 應用內緩存(本地緩存)

緩存粒度: 單服務進程內緩存熱點數據
實現方式: C++ 中用 mapLRU 緩存等結構

  • ? 優點:
    • 訪問速度最快(內存命中)
    • 減輕數據庫和分布式緩存壓力
  • ? 缺點:
    • 無法跨進程共享,服務重啟即失效
    • 不適合動態變更頻繁的數據

? 適用場景:

  • 熱門配置參數、本地字典映射、計數器
  • 每個服務都需要高頻訪問的一致性小數據集

⑤ 分布式緩存(如 Redis、Memcached)

緩存粒度: 跨服務共享的對象、結構、數據結果
典型用途: 用戶信息、Session、熱點數據、排行榜、購物車數據等

  • ? 優點:
    • 高并發支撐能力強
    • 提供豐富的數據結構(Redis
  • ? 缺點:
    • 網絡訪問有延遲(比本地慢)
    • 需維護一致性與緩存雪崩、穿透等問題

? 適用場景:

  • 任何需要多實例共享緩存的場景
  • 高并發熱點查詢
  • 電商系統中的價格、庫存緩存

? 3. 緩存選擇對比表(速查)

需求/特征推薦緩存方式
靜態頁面,無需頻繁更新? 頁面緩存 / 靜態化
API 查詢頻率高,參數固定? 反向代理緩存
結構化數據頻繁訪問,讀多寫少? Redis 緩存(帶過期)
超高頻小數據、快速命中? 應用內緩存(Map / LRU
個性化內容緩存? 本地緩存 + Redis 分組合
大量跨服務訪問的共享數據? 分布式緩存

? 4. 實戰建議:如何設計分布式緩存架構(C++ 后端)

        [Browser]|+------+------+|    CDN/Edge | ← 頁面緩存+------+------+|[Nginx] ← 反向代理緩存|[C++ Backend]/        \
[本地LRU緩存]   [Redis緩存]\        /[MySQL/PostgreSQL]

? 5. 綜合推薦選擇策略

目標推薦策略
降低接口 QPS,減輕數據庫壓力? Redis 緩存接口結果
快速返回頁面,極低延遲? 靜態頁面 + 頁面緩存
無需代碼改動,直接加緩存? Nginx/Varnish 反向代理緩存
服務間共享熱門數據? RedisMemcached
熱門數據每個服務反復用? 本地緩存 + 定時刷新(LRU

? 6. Bonus:緩存淘汰與一致性策略

  • 淘汰策略:LRU, LFU, TTLRedis 支持)
  • 緩存更新策略:
    • 被動更新(超時失效)
    • 主動更新(數據修改時同步更新緩存)
  • 緩存穿透:空值也緩存、布隆過濾器
  • 緩存雪崩:過期時間隨機化、降級兜底

如果你使用的是 C++,你可能會用:

功能C++ 實現方案
本地緩存std::unordered_map + LRU策略
Redis 訪問hiredis / redis-plus-plus
CDN 靜態資源托管Nginx + HTML 靜態渲染
Proxy 緩存控制Nginx + cache-control 頭設置

🎯 總結

靜態頁面優先 CDN,接口結果優先 Redis,熱點對象優先本地緩存,統一緩存路由通過中間層控制。

參考

系統架構設計

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

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

相關文章

httpclient實現http連接池

HTTP連接池是一種優化網絡通信性能的技術&#xff0c;通過復用已建立的TCP連接減少重復握手開銷&#xff0c;提升資源利用率。以下是關鍵要點&#xff1a; 核心原理與優勢 ?連接復用機制? 維護活躍連接隊列&#xff0c;避免每次請求重復TCP三次握手/SSL協商&#xff0c;降低…

廣義焦點丟失:學習用于密集目標檢測的合格和分布式邊界盒之GFL論文閱讀

摘要 一階段檢測器通常將目標檢測形式化為密集的分類與定位(即邊界框回歸)問題。分類部分通常使用 Focal Loss 進行優化,而邊界框位置則在狄拉克δ分布下進行學習。最近,一階段檢測器的發展趨勢是引入獨立的預測分支來估計定位質量,所預測的質量可以輔助分類,從而提升檢…

Real-World Deep Local Motion Deblurring論文閱讀

Real-World Deep Local Motion Deblurring 1. 研究目標與實際問題意義1.1 研究目標1.2 實際問題1.3 產業意義2. 創新方法:LBAG模型與關鍵技術2.1 整體架構設計2.2 關鍵技術細節2.2.1 真實模糊掩碼生成(LBFMG)2.2.2 門控塊(Gate Block)2.2.3 模糊感知補丁裁剪(BAPC)2.3 損…

【Docker基礎】Docker鏡像管理:docker commit詳解

目錄 引言 1 docker commit命令概述 1.1 什么是docker commit 1.2 使用場景 1.3 優缺點分析 2 docker commit命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 提交流程 2.5 步驟描述 3 docker commit與Dockerfile構建對比 3.1 構建流程對比 3.2 對…

可調式穩壓二極管

1.與普通穩壓二極管的比較&#xff1a; 項目普通穩壓二極管可調式穩壓二極管&#xff08;如 TL431&#xff09;輸出電壓固定&#xff08;如5.1V、3.3V&#xff09;可調&#xff08;2.5V ~ 36V&#xff0c;取決于外部分壓&#xff09;精度低&#xff08;5%~10%&#xff09;高&a…

Kafka使用Elasticsearch Service Sink Connector直接傳輸topic數據到Elasticsearch

鏈接&#xff1a;Elasticsearch Service Sink Connector for Confluent Platform | Confluent Documentation 鏈接&#xff1a;Apache Kafka 一、搭建測試環境 下載Elasticsearch Service Sink Connector https://file.zjwlyy.cn/confluentinc-kafka-connect-elasticsearch…

訊方“教學有方”平臺獲華為昇騰應用開發技術認證!

教學有方 華為昇騰應用開發技術認證 權威認證 彰顯實力 近日&#xff0c;訊方技術自研的教育行業大模型平臺——“教學有方”&#xff0c;成功獲得華為昇騰應用開發技術認證。這一認證不僅是對 “教學有方” 平臺技術實力的高度認可&#xff0c;更標志著訊方在智慧教育領域的…

保護你的Electron應用:深度解析asar文件與Virbox Protector的安全策略

在現代軟件開發中&#xff0c;Electron框架因其跨平臺特性而備受開發者青睞。然而&#xff0c;隨著Electron應用的普及&#xff0c;如何保護應用中的核心資源文件——asar文件&#xff0c;成為了開發者必須面對的問題。今天&#xff0c;我們將深入探討asar文件的特性&#xff0…

端口安全配置示例

組網需求 如圖所示&#xff0c;用戶PC1、PC2、PC3通過接入設備連接公司網絡。為了提高用戶接入的安全性&#xff0c;將接入設備Router的接口使能端口安全功能&#xff0c;并且設置接口學習MAC地址數的上限為接入用戶數&#xff0c;這樣其他外來人員使用自己帶來的PC無法訪問公…

零基礎RT-thread第四節:電容按鍵

電容按鍵 其實只需要理解&#xff0c;手指按上去后充電時間變長&#xff0c;我們可以利用定時器輸入捕獲功能計算充電時間&#xff0c;超過無觸摸時的充電時間一定的閾值就認為是有手指觸摸。 基本原理就是這樣&#xff0c;我們開始寫代碼&#xff1a; 其實&#xff0c;看過了…

SQL基礎操作:從增刪改查開始

好的&#xff01;SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言。讓我們從最基礎的增刪改查&#xff08;CRUD&#xff09;?? 操作開始學習&#xff0c;我會用簡單易懂的方式講解每個操作。 &#x1f6e0; 準備工作&#xff08;建表…

vim 編輯模式/命令模式/視圖模式常用命令

以下是一份 Vim 命令大全&#xff0c;涵蓋 編輯模式&#xff08;Insert Mode&#xff09;、命令模式&#xff08;Normal Mode&#xff09; 和 視圖模式&#xff08;Visual Mode&#xff09; 的常用操作&#xff0c;適合初學者和進階用戶使用。 &#x1f9fe; Vim 模式簡介 Vim…

每天看一個Fortran文件(10)

今天來看下MCV模式調用物理過程的相關代碼。我想改進有關于海氣邊界層方面的內容&#xff0c;因此我尋找相關的代碼&#xff0c;發現在physics目錄下有一個sfc_ocean.f的文件。 可以看見這個文件是在好多好多年前更新的了&#xff0c;里面內容不多&#xff0c;總共146行。是計算…

python打卡day37

疏錦行 知識點回顧&#xff1a; 1. 過擬合的判斷&#xff1a;測試集和訓練集同步打印指標 2. 模型的保存和加載 a. 僅保存權重 b. 保存權重和模型 c. 保存全部信息checkpoint&#xff0c;還包含訓練狀態 3. 早停策略 作業&#xff1a;對信貸數據集訓練后保存權重&#xf…

【Spark征服之路-2.9-Spark-Core編程(五)】

RDD行動算子&#xff1a; 行動算子就是會觸發action的算子&#xff0c;觸發action的含義就是真正的計算數據。 1. reduce ? 函數簽名 def reduce(f: (T, T) > T): T ? 函數說明 聚集 RDD 中的所有元素&#xff0c;先聚合分區內數據&#xff0c;再聚合分區間數據 val…

【入門】【練17.3 】比大小

| 時間限制&#xff1a;C/C 1000MS&#xff0c;其他語言 2000MS 內存限制&#xff1a;C/C 64MB&#xff0c;其他語言 128MB 難度&#xff1a;中等 分數&#xff1a;100 OI排行榜得分&#xff1a;12(0.1分數2難度) 出題人&#xff1a;root | 描述 試編一個程序&#xff0c;輸入…

CppCon 2017 學習:Free Your Functions!

“Free Your Functions!” 這句話在C設計中有很深的含義&#xff0c;意思是&#xff1a; “Free Your Functions!” 的理解 “解放你的函數”&#xff0c;鼓勵程序員&#xff1a; 不要把所有的函數都綁在類的成員函數里&#xff0c;優先考慮寫成自由函數&#xff08;non-mem…

日常運維問題匯總-19

60. OVF3維護成本中心與訂貨原因之間的對應關系時&#xff0c;報錯提示&#xff0c;SYST: 不期望的日期 00/00/0000。消息號 FGV004&#xff0c;如下圖所示&#xff1a; OVF3往右邊拉動&#xff0c;有一個需要填入的字段“有效期自”&#xff0c;此字段值必須在成本中心定義的有…

2025SCA工具推薦︱基于多模態SCA的新一代開源供應鏈風險審查與治理平臺

近年來&#xff0c;隨著開源軟件在企業數字化轉型中的廣泛應用&#xff0c;開源供應鏈攻擊事件頻發&#xff0c;企業普遍面臨三大突出難題&#xff1a;一是不清楚自身引入了哪些開源組件&#xff0c;二是不掌握組件中潛在的安全漏洞和合規風險&#xff0c;三是缺乏自動化、全流…

CppCon 2017 學習:Migrating a C++03 library to C++11 case study

這段內容是在介紹 Wt&#xff08;發音類似 “witty”&#xff09; —— 一個用于 C 的 Web UI 框架。總結如下&#xff1a; 什么是 Wt&#xff1f; Wt 是一個 用 C 編寫的 widget&#xff08;控件&#xff09;驅動的 Web 框架。類似于桌面 GUI 框架&#xff08;比如 Qt&#…