【Java面試】一、Redis篇(上)

文章目錄

  • 0、準備
  • 1、緩存穿透:不存在的key
  • 2、緩存擊穿:熱點key過期
  • 3、緩存雪崩:大批key同時過期
  • 4、雙寫一致性
    • 4.1 要求高一致性
    • 4.2 允許一定的一致延遲
  • 5、面試

0、準備

Redis相關概覽:

在這里插入圖片描述

以簡歷上所列的項目為切入點,展開Redis相關的問題:

在這里插入圖片描述

1、緩存穿透:不存在的key

Client ? Redis ? MySQL,緩存穿透,即中間的Redis形同虛設,請求每次過來都查庫。一般是網站被攻擊時,瘋狂造不存在數據,然后發起請求,沖擊數據庫,消耗數據庫連接池資源,直到服務不可用。

在這里插入圖片描述

解決方案一:緩存空數據

在這里插入圖片描述

查到的結果為空也寫進Redis。實現簡單但消耗內存,可能會發生不一致的問題(即庫里有數據了,但緩存里依舊是null,導致查不到最新數據)

解決方案二:布隆過濾器

緩存預熱的時候,往布隆過濾器中添加數據。后面請求過來時,先經過布隆過濾器,判斷ID不存在的話,直接返回,都走不到Redis。

在這里插入圖片描述
如此,內存占用少,但實現復雜,且存在誤判(即有的ID不存在,但布隆過濾器會判斷為存在)

在這里插入圖片描述
bitmap(位圖):一個bit數組,每個單元非0即1。預熱ID的時候,用多個hash函數獲取該ID的hash值,并把bitmap對應位置改為1。后面查數據是否存在時,就用相同的hash函數獲取hash值,查看對應的位置是否都為1。由此,布隆過濾器實現了檢索一個元素是否在一個集合中。

在這里插入圖片描述

如上,id1和id2點亮了1、3、7和9、12、15的位置為1,id3雖然不存在,但其hash值所在位置都為1,判定為是存在的ID,即誤判。數組越大,誤判率越低。

2、緩存擊穿:熱點key過期

給一個熱點key設置了過期時間,當這個key過期的時候,恰好有大量請求查這個key,這些請求自然都走到了數據庫,可能導致DB服務不可用。如下圖,比如查詢一次MySQL再寫到Redis需要50ms,熱點數據過期后,這50ms內的大量請求都會沖到數據庫

在這里插入圖片描述

解決方案一:添加互斥鎖

在這里插入圖片描述
緩存未命中,查庫前,獲取一個互斥鎖,獲取不到則一直重試,如此,后面的線程走不到查庫這一步,直到線程1完成查庫+寫入Redis,其余線程就會命中緩存。如此,保護了數據庫服務且保證了數據強一致性,但性能不好

解決方案二:邏輯過期

Redis層面,不設置過期時間,但業務層面加一個過期時間,如

keyvalue
001{“id”:“123”,“title”:“標題1”,"expire":1716368322}

在這里插入圖片描述
即明天16:58的時候,這條數據邏輯過期,但你在Redis中還能查到,不過是查到了過期數據,不是最新的。具體流程:

在這里插入圖片描述
線程1過來查緩存,發現當前時間超過了緩存的邏輯過期時間,于是線程1獲取一個互斥鎖,再開啟一個線程2去查庫 + 更新緩存,自己則先把過期數據返回。此過程中,即使有線程3進來,并發現了已超過邏輯過期時間,它也不會重復去查庫重建緩存,因為它獲取不到互斥鎖,此時線程3會先返回過期數據。 因此,這種方式性能好,但數據一致性不保證。

3、緩存雪崩:大批key同時過期

同一時間段,大量緩存的key過期,或者Redis服務宕機,導致大量請求沖到數據庫
在這里插入圖片描述

解決思路是:給不同的key添加隨機的TTL(過期時間),如此,大量的key不會同時過期。至于Redis宕機,則可以用Redis哨兵模式或者集群模式、給業務添加多級緩存等方式解決。

最后,降級限流,可用于解決緩存穿透、擊穿、雪崩的解決。即服務請求失敗次數到一定閾值,直接走降級策略(比如不查庫,直接返回空)

//Tips:穿透無中生有key,布隆過濾null隔離緩存擊穿過期key,鎖與非期解難題雪崩大量過期key,過期時間要隨機面試必考三兄弟,可用限流來保底

4、雙寫一致性

相關問題:MySQL和Redis的數據如何進行同步。兩種追求:

  • 一致性高
  • 允許一定的一致延遲

4.1 要求高一致性

在這里插入圖片描述

讀操作:命中直接返回。未命中緩存則 查庫 + 寫入緩存

寫操作:數據庫更新時,進行延時雙刪

在這里插入圖片描述
有數據庫的寫操作時,為了數據一致性,如果不雙刪,只刪一次緩存 + 改庫,則實現方式可以是:

  • 先刪緩存,再改庫
  • 先改庫,再刪緩存
1)若先刪緩存,再改庫:

理想狀態為:線程1刪緩存,再更新數據庫,后面請求過來(對應線程2),先查緩存,未命中,去查庫 + 寫入緩存,一切正常

在這里插入圖片描述

再看非理想狀況:線程1刪除緩存后掛起,此時緩存為null,庫中為10。然后新的請求進來(對應線程2),CPU切到線程2執行,查緩存未命中,線程2去查庫 + 寫入緩存,線程2執行結束,此時緩存為10,庫中為10。最后線程1解除掛起,繼續執行,線程1去更新了數據庫,此時緩存為10,庫中為20 ,數據不一致!

在這里插入圖片描述

總之,高并發下,線程交替執行,這樣實現會出現數據不一致問題。

2)若先改庫,再刪緩存

理想狀態為:線程2更新數據庫,再刪緩存,此時緩存為null,庫中為20。后面請求過來(對應線程1),先查緩存,未命中,去查庫 + 寫入緩存,一切正常

在這里插入圖片描述

非理想狀態下:比如一開始緩存過期,即緩存中為null,庫中為10,線程1進來未命中緩存,查庫得到10,然后掛起。請求2進來(對應線程2),其進行了update,改庫,并刪緩存,此時,庫中為20,緩存中為null。線程2執行結束,線程1解除掛起繼續執行,將查到的數據,寫入緩存。此時緩存中為10,庫中為20,數據不一致。

在這里插入圖片描述

因此,不管先刪緩存還是先改庫,都可能出現數據不一致

==> 延時雙刪:先刪緩存,數據庫更新完后,再刪一次緩存。至于為什么要延時后第二次刪,是因為如果數據庫是主從模式,讀寫分離,那就需要等主節點把數據同步到從節點。但這個延時的大小不好控制,還是可能出現臟數據。想強一致,可用分布式鎖。

在這里插入圖片描述
一個線程在更新數據前,加鎖,update庫 + 刪緩存后,釋放鎖。期間,其余線程不能讀寫。以上可優化為:讀數據的時候,添加共享鎖,讀讀共享,讀寫互斥。寫數據的時候,加排他鎖,阻塞其他線程的讀和寫。如此,實現數據強一致性,但性能低。

4.2 允許一定的一致延遲

異步通知,保證數據的最終一致性。業務服務更新庫后,發消息到MQ,緩存服務監聽MQ,去更新緩存

在這里插入圖片描述
以上實現對業務代碼有一定的侵入性,需要添加發消息的代碼。可把MQ替換為Canal:

在這里插入圖片描述

阿里的Canal基于MySQL的主從同步實現。數據庫一旦發生改變,二進制的binlog記錄DDL語句和DML語句,Canal偽裝成MySQL的一個從節點,監聽讀取MySQL的binlog去更新緩存。此方式不用改業務代碼,無侵入性。

最后,如果不要求實時性和強一致性,如熱點文章數據,可用異步方案同步數據。如果要求數據強一致性,如搶券的庫存,則采用redisson提供的讀寫鎖保證數據同步。

5、面試

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

Steamdeck使用Windows系統游玩雪地奔馳時閃退問題解決方法

我非常喜歡雪地奔馳這款游戲,買sd的一部分也是為了它。可在我打開這個游戲時,游戲發生閃退問題。查閱了網絡各個途徑,基本沒有解決方法。因此我自己分析終于解決該問題。以下是我解決問題的思路,僅供記錄參考: 游戲在崩…

2024提升數字思維能力加快企業數字化轉型(74頁PPT)

方案介紹: 本報告的價值在于為企業提供了一套系統的提升數字思維能力、加快數字化轉型的理論框架和實踐指南。通過本報告的學習和應用,企業可以更加清晰地認識到數字化轉型的重要性和緊迫性,明確自身在數字化轉型中的優勢和不足,并…

已解決java.nio.charset.CoderMalfunctionError: 編碼器故障錯誤的正確解決方法,親測有效!!!

已解決java.nio.charset.CoderMalfunctionError: 編碼器故障錯誤的正確解決方法,親測有效!!! 目錄 問題分析 報錯原因 解決思路 解決方法 確認與檢查字符集 驗證輸入數據 嘗試使用不同字符集 更新或更換編碼器/解碼器版本…

ES升級--02--kibana安裝與啟動

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 Kibana官網文檔https://www.elastic.co/guide/cn/kibana/current/targz.html 1.官網下載https://www.elastic.co/cn/downloads/past-releases#kibana 2.解壓軟件3.配…

python四舍五入(round精度不夠,有時不能實現四舍五入)

Python 所有文章傳送門【Python】所有文章傳送門 目錄 簡述 / 前言1. Python 實驗2. 自定義函數3. 總結 簡述 / 前言 最近心血來潮,剛復習到折半插入排序時,發現算法的mid(中間點)選擇的公式是:(low high)/2&#xf…

基于VMware安裝Linux虛擬機

1.準備Linux環境 首先,我們要準備一個Linux的系統,成本最低的方式就是在本地安裝一臺虛擬機。為了統一學習環境,不管是使用MacOS還是Windows系統的同學,都建議安裝一臺虛擬機。 windows采用VMware,Mac則采用Fusion …

使用Spring Boot編寫的小項目

加法計算器 前端代碼 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

若依跳轉(新增)頁面,在菜單中不顯示的頁面

在router.js文件中 跳轉方式 this.$router.push(/monitor/b/b)

有限元之有限元法的實現

目錄 一、單元剛度矩陣及單元荷載 二、總剛度矩陣及總荷載的合成 三、邊界條件處理 四、算例實現 4.1 C代碼 4.2 計算結果 五、結論 前三節我們介紹了有限元的基本概念、變分理論及有限元空間的構造&#xff0c;本節我們探討如何實現有限元法。我們繼續以二維橢圓型方程…

以太坊現貨ETF獲批:引發ETH價格暴漲,市場熱議達到高潮

2024年5月24日&#xff0c;北京時間&#xff0c;以太坊現貨ETF正式獲得美國證券交易委員會&#xff08;SEC&#xff09;的批準&#xff0c;成為繼比特幣之后&#xff0c;美國主權政府承認的又一加密貨幣基金產品。這一意外的利好消息引發了加密貨幣市場的狂歡&#xff0c;以太坊…

JavaWeb開發 2.Web開發 Web前端開發 ①介紹

內心一旦平靜&#xff0c;外界便鴉雀無聲 —— 24.5.27 一、初識Web前端 網頁有哪些部分組成? 文字、圖片、音頻、視頻、超鏈接 ...網頁&#xff0c;背后的本質是什么? 前端代碼前端的代碼是如何轉換成用戶眼中的網頁的? 通過瀏覽器轉化(解析和渲染)成用戶看…

dx11硬件解碼傳遞給opencl并行處理

directx11 解碼 使用ffmpeg進行directx11 解碼 將解碼后的NV12格式數據從D3D11 Texture中通過OpenCL處理需要經過幾個步驟&#xff1a;首先&#xff0c;確保D3D11 Texture正確設置并與OpenCL上下文關聯&#xff1b;然后&#xff0c;將NV12數據分兩個步驟處理&#xff08;Y平面…

調試面對面翻譯小程序

調試面對面翻譯小程序 文章目錄 調試面對面翻譯小程序預覽1.拉取項目2.在微信開發者工具打開使用 微信版本要求微信同聲傳譯插件支持功能 此demo用于學習 預覽 1.拉取項目 git clone https://github.com/Tencent/Face2FaceTranslator或者&#xff08;加速鏡像&#xff09; git …

Warning: Each child in a list should have a unique “key“ prop.

問題描述&#xff1a; 使用ProTable的時候&#xff0c;報錯如下 原因分析&#xff1a; 根據報錯內容可以分析出&#xff0c;表格數據缺少唯一key&#xff0c; <PaginationTablecolumns{columns}pagination{{pageSize: 10,current: 1,showSizeChanger: true,showQuickJum…

kafka 可以脫離 zookeeper 單獨使用嗎?為什么?

Kafka是一個分布式的流式處理平臺&#xff0c;它依賴于Zookeeper來管理集群元數據、選舉Leader以及故障恢復。在Kafka集群中&#xff0c;Zookeeper負責保存和維護分布式系統的信息。 雖然理論上可以將Kafka與Zookeeper分開&#xff0c;但實際上&#xff0c;Kafka在設計時就與Z…

JavaScript中的相等操作符(== vs ===)選擇指南

在使用JavaScript進行比較時,我們經常會遇到相等操作符 == 和嚴格相等操作符 ===。本文將深入探討這兩者之間的區別,并說明在何種情況下應使用 === 而不是 ==。 相等操作符(==) 相等操作符 == 會在進行比較之前對其兩個操作數進行必要的類型轉換。這意味著即使兩個操作數…

網絡安全行為可控定義以及表現內容簡述

在數字化快速發展的今天&#xff0c;網絡安全已成為國家和企業不可或缺的防線。據統計&#xff0c;網絡攻擊事件頻發&#xff0c;給全球經濟帶來了巨大損失。因此&#xff0c;確保網絡安全行為可控顯得尤為重要。今天我們來聊聊網絡安全行為可控定義以及表現內容。 網絡安全行為…

摸魚大數據——Hive表操作——分區表

1、介紹 特點: 分區表會在HDFS上產生目錄。查詢數據的時候使用分區字段篩選數據&#xff0c;可以避免全表掃描&#xff0c;從而提升查詢效率 注意: 如果是分區表&#xff0c;在查詢數據的時候&#xff0c;如果沒有使用分區字段&#xff0c;它回去進行全表掃描&#xff0c;會降低…

說一下 ACID 是什么?

ACID 是數據庫事務的四個特性的首字母縮寫&#xff0c;包括原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。 原子性&#xff08;Atomicity&…

什么是NAND Flash ECC?

在存儲芯片行業&#xff0c;數據完整性和可靠性是至關重要的。為了確保數據的準確性和防止數據丟失&#xff0c;ECC&#xff08;錯誤校正碼&#xff09;在NAND Flash存儲中扮演了關鍵角色。MK米客方德將為您解答NAND Flash ECC的基本概念、工作原理及其在實際應用中的重要性。 …