【PmHub面試篇】PmHub 緩存與數據庫一致性的面試專題分析

在分布式系統開發中,緩存與數據庫的一致性問題是后端開發面試的核心考點之一。本文結合 PmHub 項目實踐,整理高頻面試題及深度解答,幫助開發者系統掌握緩存一致性解決方案的設計與實現。若想對相關內容有更透徹的理解,強烈推薦參考之前發布的博文:【PmHub后端篇】PmHub 中緩存與數據庫一致性的實現方案及分析

1 項目中如何保證緩存和數據一致性

我們主要采用Cache Aside 模式,核心邏輯是:

  • 讀流程
    • 先查詢緩存,若命中直接返回
    • 若未命中,查詢數據庫
    • 將查詢結果寫入緩存(設置合理過期時間)
  • 寫流程:
    • 先更新數據庫
    • 刪除對應緩存(而非更新,原因見問題 2)

同時結合以下輔助策略:

  • 分布式鎖:處理高并發寫沖突(如流程狀態更新場景,通過 Redisson 實現分布式鎖)
  • 緩存監控:通過 SkyWalking 監控緩存命中率(目標 > 90%)、淘汰率(<5%)
  • 定時任務:每日凌晨對冷數據進行全量緩存重建

2 為什么刪除緩存,而不更新緩存

主要基于以下考量:

  • 更新緩存浪費服務器資源:頻繁的緩存更新可能導致緩存服務器的負載增加,通過刪除緩存而不是頻繁更新,可以減少緩存服務器的壓力,提高系統整體性能。
  • 避免臟數據:高并發下更新緩存可能讀到中間態數據(如事務未提交)
  • 減少無效更新:頻繁寫場景下,刪除緩存可避免緩存與 DB 的無效同步

3 先更新 DB,再刪除緩存是否是完美解決方案

  • 局限性分析
    1. 寫性能損耗:每次寫操作需額外執行緩存刪除(優化方向:通過異步隊列批量處理緩存失效)

    2. 極端并發不一致
      場景:線程 A 更新 DB 后未刪緩存時,線程 B 讀取到舊緩存
      概率:僅發生在 DB 更新成功但緩存刪除失敗,且此時有讀請求的極端情況
      解決方案

      • 緩存設置短過期時間(如 5 分鐘)
      • 增加異步校驗任務(定時對比 DB 與緩存數據)
    3. 緩存穿透與預熱問題

    • 冷數據首次訪問會穿透到 DB(布隆過濾器攔截無效請求)
    • 系統冷啟動時需預熱熱點數據(啟動時通過 Spring 事件監聽異步加載)

4 Cache Aside 模式有哪些局限性?

  • 緩存穿透:首次訪問冷數據時存在 DB 穿透風險(解決方案:布隆過濾器攔截無效 key)
  • 并發不一致:極端情況下(如更新 DB 后刪除緩存前服務宕機)可能不一致(解決方案:分布式鎖 + 異步數據校驗任務)
  • 緩存預熱:冷啟動時需要預熱熱點數據(解決方案:啟動時通過 @PostConstruct 預熱或異步線程加載)
  • 寫性能影響:每次寫操作需額外執行緩存刪除(優化方向:合并批量寫操作,使用 Redis Pipeline 批量刪除)

5 Spring Cache 如何集成 Redis?

Spring Cache 默認使用本地緩存(ConcurrentMap),集成 Redis 需:

  1. 添加 Redis 緩存依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置 CacheManager:
@Bean
public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer(RedisConnectionFactory connectionFactory) {return builder -> builder.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig(connectionFactory)).withCacheConfiguration("yourCacheName", RedisCacheConfiguration.defaultCacheConfig(connectionFactory).entryTtl(Duration.ofMinutes(5)));
}
  1. 使用 @Cacheable/@CacheEvict 注解聲明緩存操作。

6 如果緩存刪除失敗怎么辦?

采用重試機制 + 消息隊列

  • 刪除緩存失敗時,將 key 寫入 RabbitMQ 死信隊列
  • 通過消費者異步重試刪除(設置 3 次重試間隔,避免洪峰)

7 如何處理緩存雪崩?

  • 緩存層加隨機過期時間(如 10-15 分鐘隨機)
  • 對熱點數據加本地緩存(Caffeine)作為保護罩
  • 服務層添加 Hystrix 熔斷,防止 DB 被壓垮

6 參考鏈接

PmHub如何保證緩存和數據庫的一致性

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

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

相關文章

游戲行業對于服務器類型該怎樣進行選擇

大型的網絡游戲和多人在線游戲對于服務器類型的選擇還是有著一定要求的&#xff0c;在游戲運行的過程中一般需要處理大量的數據&#xff0c;如玩家的實時操作和游戲場景渲染等多種內容&#xff0c;較為熱門的在線游戲&#xff0c;在線玩家數量會非常龐大&#xff0c;這需要服務…

Android Studio安裝遇到的問題

一、現況 1.1 安裝時間 2025-06 1.2由于本人操作系統是win7的&#xff0c;android studio最新版支持的最低要求官方是win11,16G&#xff0c;所以我下載的是android studio的版本&#xff0c;版本信息android-studio-2024.1.2.12-windows jdk用的是1.8&#xff0c; gradle用的…

[論文閱讀] 人工智能 + 軟件工程 | 用大語言模型架起軟件需求形式化的橋梁

用大語言模型架起軟件需求形式化的橋梁 論文信息 misc{beg2025short,title{A Short Survey on Formalising Software Requirements with Large Language Models}, author{Arshad Beg and Diarmuid ODonoghue and Rosemary Monahan},year{2025},eprint{2506.11874},archivePre…

0_1面向對象

基本套路 題目描述 往往非常簡單,如:設計一個XX系統。或者:你有沒有用過XXX,給你看一下它的界面和功能,你來設計一個。闡述題意 面試者需向面試官詢問系統的具體要求。如,需要什么功能,需要承受的流量大小,是否需要考慮可靠性,容錯性等等。面試者提供一個初步的系統設…

mumu模擬器鼠標側鍵返回

把圖片中的“點擊鼠標右鍵“操作換成點側鍵 參考文章&#xff1a;你們要的鼠標右鍵返回來啦【mumu模擬器吧】_百度貼吧

軟件公司進軍無人機領域的戰略指南與生態合作全景-優雅草卓伊凡

軟件公司進軍無人機領域的戰略指南與生態合作全景-優雅草卓伊凡 那么找到細分領域我們應該如何開始真正加入無人機開發的梯隊呢&#xff0c;卓伊凡看了大疆創新加入成為認證開發者也是非常不錯的選擇。 引言&#xff1a;無人機產業的黃金機遇 根據德勤2023年全球無人機解決方…

鍵盤覺醒:Raycast 把 Mac 變成「AI 指令戰艦」

在 Mac 上追逐效率的腳步&#xff0c;從未停歇。從早期的 Alfred 到系統內置的 Spotlight&#xff0c;這些工具雖好用&#xff0c;卻總讓人覺得功能邊界清晰&#xff0c;變化有限。直到 Raycast 出現&#xff0c;徹底重塑了這個品類的想象空間。它集啟動應用、查找文件、單位換…

宇宙盡頭是WPS之——【Excel】一個自動重新排序的宏

1. 目的 你是否在做一個表格排序&#xff0c;但只能知道某幾個行之間的相對順序&#xff0c;而可能排著排著發現后面還有順序更靠前的項&#xff0c;而不得不將排好的序號重新11…… 所以你需要一個宏&#xff0c;它可以知道你輸入了一個已經存在的序號&#xff0c;并以那個序…

Sharding-jdbc使用(一:水平分表)

說明&#xff1a;Sharding-jdbc是常見的分庫分表工具&#xff0c;本文介紹Sharding-jdbc的基礎使用。 分庫分表 首先&#xff0c;介紹一下分庫分表&#xff1a; &#xff08;1&#xff09;分庫 水平分庫&#xff1a;以字段為依據&#xff0c;按照一定策略&#xff08;hash、…

處理器指令中的函數調用指令是什么?

處理器指令中的函數調用指令是什么? 函數調用指令是處理器指令集中用于實現函數(或子程序)調用和返回的專用指令。它們是支持結構化編程和代碼復用的硬件基礎。核心指令通常包括: 調用指令 (CALL / BL / BLX 等): 功能: 暫停當前函數的執行,跳轉到目標函數(被調用函數)…

CHASE、CoSQL、SPARC概念介紹

CHASE&#xff1a;一個跨領域多輪交互text2sql中文數據集&#xff0c;包含5459個多輪問題組成的列表&#xff0c;一共17,940個<query, SQL>二元組&#xff0c;涉及280個不同領域的數據庫。CoSQL&#xff1a;一個用于構建跨域對話文本到sql系統的語料庫。它是Spider和SPar…

設備巡檢系統小程序ThinkPHP+UniApp

基于ThinkPHP和Uniapp開發的設備巡檢系統&#xff0c;可應用于電力、水利、物業等巡檢場景&#xff0c;可編譯微信小程序。提供全部無加密源碼&#xff0c;可私有化部署。 ?功能特性 部門管理 后臺可以設置多部門&#xff0c;便于篩選員工 員工管理 后臺維護員工信…

Visual Studio Code 1.101下載

[軟件名稱]: Visual Studio Code 1.101 [軟件大小]: 147 MB [下載通道]: 夸克盤 | 迅雷盤 | 百度盤 &#x1f3af; 一、MCP&#xff08;Model Context Protocol&#xff09;全面升級 資源 Templates 支持 MCP 現在不僅能處理提示&#xff0c;還能識別和管理“資源模板”&…

linux的基本運維

grep 選項功能-r遞歸搜索子目錄-i忽略大小寫-n顯示行號-l只顯示文件名-v反轉匹配&#xff08;顯示不包含的行&#xff09;-w全詞匹配-E使用擴展正則表達式–include指定文件類型 --include*.{js,py}–exclude排除文件類型 --exclude*.log–exclude-dir排除目錄 --exclude-dir{…

c++11右值引用(rvalue reference)

右值引用&#xff08;rvalue reference&#xff09;是 C11 引入的一個新特性&#xff0c;主要用于支持移動語義&#xff0c;優化資源的管理&#xff0c;尤其是在進行資源轉移時避免不必要的拷貝操作。右值引用通過 && 符號進行表示。 1. 右值引用的基本概念 右值&…

【算力網絡】算網安全

一、算網安全概念 算力網絡與網絡空間安全的結合設計需構建“內生安全、智能調度、動態防護”的一體化體系&#xff0c;而SRv6安全服務鏈正是實現該目標的核心技術路徑。 1.1、算力網絡安全架構設計 1.1.1 體系化架構思路與方法體系 1. ?分層安全架構&#xff08;“三橫一…

傳輸層協議UDP/TCP

目錄 UDP協議 UDP協議段格式 UDP緩沖區 TCP協議 TCP協議段格式 確認應答機制 超時重傳機制 連接管理機制 連接建立&#xff08;三次握手&#xff09; 連接關閉&#xff08;四次揮手&#xff09; 滑動窗口 流量控制 擁塞控制 延遲應答 捎帶應答 UDP協議 UDP協議…

華為OD-2024年E卷-找終點[100分] -- python

問題描述&#xff1a; 給定一個正整數數組&#xff0c;設為nums&#xff0c;最大為100個成員&#xff0c;求從第一個成員開始&#xff0c;正好走到數組最后一個成員&#xff0c;所使用的最少步驟數。要求: 第一步必須從第一元素開始&#xff0c;且1<第一步的步長<len/2…

ARINC653分區調度算法的研究與改進

# ARINC653分區調度算法的研究與優化&#xff1a;從單核到多核的實時性保障 ## 1 研究背景與意義 航空電子系統經歷了從**聯合式架構**到**綜合模塊化航空電子**&#xff08;Integrated Modular Avionics, IMA&#xff09;架構的重大演變。在這一演變過程中&#xff0c;ARINC…

Vue-8-前端框架Vue之應用基礎響應式數據和計算屬性

文章目錄 1 響應式數據1.1 ref創建基本類型的響應式數據1.2 reactive創建對象類型的響應式數據1.2.1 汽車示例(對象{})1.2.2 游戲示例(數組[])1.2.3 深層示例1.3 ref創建對象類型的響應式數據1.4 ref對比reactive1.4.1 區別和使用原則1.4.2 reactive重新分配新對象1.4.3 ref重新…