經典面試題:一文了解常見的緩存問題

在面試過程中,面試官的桌子上擺放著很多高頻的面試題,能否順利回答決定了你面試通過的概率。其中緩存問題就是其中的一份,可以說掌握緩存問題及解決方法是面試前必須準備的內容。那么緩存有什么典型的問題,出現的原因是什么,又該如何解決呢?本文,來為你一一詳細介紹。

緩存問題有哪些?

緩存雖然能提升性能,但也會帶來一些問題。緩存問題有很多,其中經典的緩存問題如下圖所示:

1. 緩存雪崩

問題描述

緩存服務宕機,導致所有請求直接訪問數據庫,引發數據庫壓力激增甚至崩潰。

解決方法

  • 集群化部署緩存(如Redis Cluster),實現高可用;
  • 使用熔斷降級機制,限制數據庫訪問量;
  • 讀寫分離;
  • 使用本地緩存;
  • 對緩存體系進行實時監控, 當請求訪問的慢速比超過閥值時,及時報警,通過機器替換、服務替換進行及時恢復;也可以通過各種自動故障轉移策略,自動關閉異常接口、停止邊緣服務、停止部分非核心功能措施,確保在極端場景下,核心功能的正常運行。

2. 緩存失效

問題描述

大量緩存數據同時過期,導致所有請求直接訪問數據庫,引發數據庫壓力激增甚至崩潰。

解決方法

  • 設置隨機過期時間,避免同時失效。使用公式:過期時間 = base 時間 + 隨機時間

3. 緩存穿透

問題描述

頻繁查詢不存在的數據(如惡意攻擊),緩存和數據庫均無法命中,導致無效請求穿透到數據庫。

解決方法

  • 布隆過濾器(Bloom Filter): 構建一個 BloomFilter 緩存過濾器,記錄全量數據,這樣訪問數據時,可以直接通過 BloomFilter 判斷這個 key 是否存在,如果不存在直接返回即可,根本無需查緩存和 DB。但是BloomFilter 要緩存全量的 key,這就要求全量的 key 數量不大,10億條數據以內最佳,因為 10億 條數據大概要占用 1.2GB 的內存。也可以用 BloomFilter 緩存非法 key,每次發現一個 key 是不存在的非法 key,就記錄到 BloomFilter 中,這種記錄方案,會導致 BloomFilter 存儲的 key 持續高速增長,為了避免記錄 key 太多而導致誤判率增大,需要定期清零處理;
  • 緩存空值(Null Object): 為不存在的 Key 設置短時間緩存,避免重復查詢數據庫。

4. 緩存擊穿

問題描述

某個熱點Key突然過期,大量并發請求直接訪問數據庫,導致瞬時壓力過大。

解決方法

  • 永久緩存: 針對基本不會發生更新的場景,可以把 key 設置為永不過期,讓 key 常駐緩存;
    **定期緩存:針對需要頻繁更新的場景,**可以使用額外的補償程序來定時刷新緩存或者延長 key 的實效時間;
  • 分布式鎖: 針對偶爾需要更新的場景,可以對請求代碼使用分布式互斥鎖,使得少部分直接請求數據庫后更新緩存,而剩余的其他請求直接使用新緩存即可,或者采用本地互斥鎖保證僅有少量請求能夠更新緩存,其余請求訪問新緩存。

5. 緩存與數據庫一致性

問題描述

緩存與數據庫數據不一致,常見于更新操作時,比如更新 DB 后,寫緩存失敗,從而導致緩存中存的是老數據。

解決方式

  • 刪除 Key: 寫入/更新的時候,先刪除緩存中的 Key,再更新數據庫;
  • 訂閱數據庫Binlog: 通過監聽數據庫變更同步更新緩存(如Canal工具);
  • 最終一致性容忍: 根據業務場景接受短暫不一致。

6. 緩存預熱

問題描述

系統啟動時緩存為空,大量請求直接訪問數據庫導致冷啟動壓力。

解決方式

  • 提前加載熱點數據到緩存(如統計分析高頻訪問的Key)。

7. 緩存淘汰策略

問題描述

緩存空間有限時,如何選擇淘汰哪些數據以騰出空間。

解決方式

  • LRU(Least Recently Used): 淘汰最近最少使用的數據;
  • LFU(Least Frequently Used): 淘汰訪問頻率最低的數據;
  • TTL(Time To Live):基于過期時間淘汰。

8. 緩存污染

問題描述

緩存中存儲了低頻訪問的數據,擠占了熱點數據的空間。

解決方式

  • 優化緩存淘汰策略(如結合LRU和LFU);
  • 定期清理非熱點數據。

9. 熱點 Key

問題描述

某些業務在某一瞬間或某一時間段內可能會成為熱點業務,熱點業務的數據可能會產生熱點key,比如微博上熱榜數據。

解決方式

  • 找到對應的熱點 key,將這些熱 key 進行分散處理,比如一個熱 key 名字叫 hotkey,可以被分散為 hotkey#1、hotkey#2、hotkey#3,……hotkey#n,這 n 個 key 分散存在多個緩存節點,然后 client 端請求時,隨機訪問其中某個后綴的 hotkey,這樣就可以把熱 key 的請求打散,避免一個緩存節點過載;
  • 也可以 key 的名字不變,對緩存提前進行多副本+多級結合的緩存架構設計。再次,如果熱 key 較多,還可以通過監控體系對緩存的 SLA 實時監控,通過快速擴容來減少熱 key 的沖擊。最后,業務端還可以使用本地緩存,將這些熱 key 記錄在本地緩存,來減少對遠程緩存的沖擊。

10. 大 Key

問題描述

緩存中某些 key 的 value 的值過大,導致寫操作超時、加載速度緩慢等問題。

解決方式

  • 如果數據存在 MC 中,可以設計一個緩存閥值,當 value 的長度超過閥值,則對內容啟用壓縮,讓 KV 盡量保持小的 size,其次評估大 key 所占的比例,在 Mc 啟動之初,就立即預寫足夠數據的大 key,讓 MC 預先分配足夠多的 trunk size 較大的 slab。確保后面系統運行時,大 key 有足夠的空間來進行緩存;
  • 如果數據存在 Redis 中,比如業務數據存 set 格式,大 key 對應的 set 結構有幾千幾萬個元素,這種寫入 Redis 時會消耗很長的時間,導致 Redis 卡頓。此時,可以擴展新的數據結構,同時讓 client 在這些大 key 寫緩存之前,進行序列化構建,然后通過 restore 一次性寫入;
  • 將大 key 分拆為多個 key,盡量減少大 key 的存在。同時由于大 key 一旦穿透到 DB,加載耗時很大,所以可以對這些大 key 進行特殊照顧,比如設置較長的過期時間,比如緩存內部在淘汰 key 時,同等條件下,盡量不淘汰這些大 key。

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

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

相關文章

生產環境中安裝和配置 Nginx 以部署 Flask 應用的詳細指南

在生產環境中部署 Flask 應用時,Nginx 常被用作反向代理服務器,與 WSGI 服務器(如 Gunicorn)協同工作。Nginx 可以處理靜態文件、提供 SSL/TLS 加密、實現負載均衡等功能。本文將詳細介紹如何在 Ubuntu/Debian 系統上安裝 Nginx&a…

鴻蒙進階——Mindspore Lite AI框架源碼解讀之模型加載詳解(一)

文章大綱 引言一、模型加載概述二、核心數據結構三、模型加載核心流程 引言 Mindspore 是一款華為開發開源的AI推理框架,而Mindspore Lite則是華為為了適配在移動終端設備上運行專門定制的版本,使得我們可以在OpenHarmony快速實現模型加載和推理等功能&…

AI煉丹日志-24 - MCP 自動操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory

點一下關注吧!!!非常感謝!!持續更新!!! Java篇: MyBatis 更新完畢目前開始更新 Spring,一起深入淺出! 大數據篇 300: Hadoop&…

【仿muduo庫實現并發服務器】實現時間輪定時器

實現時間輪定時器 1.時間輪定時器原理2.項目中實現目的3.實現功能3.1構造定時任務類3.2構造時間輪定時器每秒鐘往后移動添加定時任務刷新定時任務取消定時任務 4.完整代碼 1.時間輪定時器原理 時間輪定時器的原理類似于時鐘,比如現在12點,定一個3點的鬧…

Windows10下搭建sftp服務器(附:詳細搭建過程、CMD連接測試、連接失敗問題分析解決等)

最終連接sftp效果 搭建sftp服務器 1、這里附上作者已找好的 freeSSHd安裝包 ,使用它進行搭建sftp服務器。 2、打開freeSSHd安裝包,進行安裝 (1)、選擇完全安裝 (2)、安裝完成后,對提示窗口選擇關閉 (3)、安裝完成后,提示是否安裝私有密鑰。我們選擇"是" (4)、安…

推薦幾個不錯的AI入門學習視頻

引言:昨天推薦了幾本AI入門書(AI入門書),反響還不錯。今天,我再推薦幾個不錯的AI學習視頻,希望對大家有幫助。 網上關于AI的學習視頻特別多。有收費的,也有免費的。我今天只推薦免費的。 我們按…

點擊啟動「高效模式」:大騰智能 CAD 重構研發設計生產力

在制造業數字化轉型浪潮中,設計工具的革新正成為企業突破效率瓶頸的關鍵。傳統CAD軟件因本地硬件依賴、協作壁壘高筑、復雜場景響應遲緩等問題,長期困擾設計團隊。 大騰智能CAD依托華為云底座、自研幾何引擎及AI技術深度融合,為制造行業各細…

cursor如何開啟自動運行模式

在Cursor中,開啟自動運行模式即啟用“Yolo Mode”,具體操作如下: 按下Ctrl Shift J(Windows/Linux)或Cmd Shift J(Mac)打開Cursor設置。導航到“Features”(功能)選…

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程(不通過微軟商店安裝)

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程(不通過微軟商店安裝) 下載 v2020.4(最后一個兼容 1809 的版本): TranslucentTB安裝包(下載不了上面有安裝包)安裝依賴項(如未安裝&#x…

分布式拜占庭容錯算法——實現工作量證明(PoW)算法詳解

Java 實現工作量證明(PoW)算法詳解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…

黑馬Java面試筆記之框架篇(Spring、SpringMvc、Springboot)

一. 單例bean Spring框架中的單例bean是線程安全的嗎? Spring框架中的bean是單例的,可以在注解Scope()進行設置 singleton:bean在每一個Spring IOC容器中只有一個實例。prototype:一個bean的定義可以有多個實例 總結 二. AOP AOP稱…

electron下載文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下載文件函數 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(開始下載…

快速掌握 GO 之 RabbitMQ 結合 gin+gorm 案例

更多個人筆記見: (注意點擊“繼續”,而不是“發現新項目”) github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習,學習過程中還會不斷補充&…

android FragmentManager 刪除所有Fragment 重建

在Android開發中,管理Fragment是一項常見任務,有時需要刪除所有Fragment并重新創建。這在某些場景下,例如用戶需要重置應用狀態或切換內容時,顯得尤為重要。本文將詳細介紹如何通過 FragmentManager刪除所有Fragment并重建。 一、…

ubuntu之開機自啟frpc

在 Ubuntu 系統中為 frpc 設置開機自啟(以 frpc -c frpc.toml 命令為例),可以通過 systemd 服務實現。以下是詳細步驟: 創建 systemd 服務文件 sudo vim /etc/systemd/system/frpc.service 寫入以下內容(根據你的路…

推薦一款PDF壓縮的工具

今天一位小伙伴找來,問我有沒有辦法將PDF變小的辦法。 詳細了解了一下使用場景: 小伙伴要在某系統上傳一個PDF文件,原文件是11.6MB,但是上傳時系統做了限制,只能上傳小于10MB的文件,如圖: 我聽…

JDK21深度解密 Day 11:云原生環境中的JDK21應用

【JDK21深度解密 Day 111】云原生環境中的JDK21應用 本文是《JDK21深度解密:從新特性到生產實踐的全棧指南》專欄的第11天內容,聚焦云原生環境中的JDK21應用。我們將深入探討如何在容器化、微服務、Serverless等云原生架構中充分發揮JDK21的技術優勢,提升Java應用的性能、穩…

Java-redis實現限時在線秒殺功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql數據庫表設…

QT- QML Layout+anchors 布局+錨點實現窗口部件權重比例分配

布局管理 簡單比較兩種界面管理錨點布局實現比例布局布局管理實現比例布局循環依賴問題簡談 在日常打螺絲中&#xff0c;我們偶爾會需要實現界面各組件能按比例放置&#xff0c;自適應各種分辨率的需求。我用錨點和布局都實現過相關界面&#xff0c;記錄下來兩種方式實現的差異…

Java項目OOM排查

排查思路 Java項目出現OOM&#xff08;Out Of Memory&#xff0c;內存溢出&#xff09;問題時&#xff0c;排查思路如下&#xff1a; 確認OOM類型&#xff1a; Java Heap Space&#xff1a;堆內存溢出&#xff0c;通常是對象創建過多或內存泄漏。PermGen Space&#xff1a;永久…