緩存設計導致的問題測試要點總結

小黑測試員 2021-08-15 15:02:56 阅读数:457

本文一共[544]字,预计阅读时长:1分钟~

一、什麼是緩存

緩存實質就是一個臨時的存儲數據的容器。數據在這個容器中可以提高讀取速度。

二、緩存的分類

緩存分為硬件緩存和軟件緩存

硬件緩存是比特於CPU和內存之間的臨時存儲器

軟件緩存又分為內存緩存、數據庫緩存、網絡緩存

內存緩存 內存緩存的範圍比較寬泛,這裏只討論RAM緩存即預先將數據寫到容器(list,map,set)等數據存儲單元中並將數據存儲在RAM緩存中。一般應用設計中最常用的就是Redis。 數據庫緩存 數據緩存是數據庫本身的緩存,並不是外部緩存例如Redis/Memcache等等。 數據庫的數據分為冷數據和熱數據庫,通俗的講冷數據是存儲在磁盤上不經常查詢的數據;而熱數據是頻繁查詢的數據,這部分數據會被緩存到內存中。 網絡緩存 網絡緩存是一種降低Internet流量和提高終端用戶響應時間的網絡技術。如CPU中的緩存,用於提高內存存取的速率;各種操作系統在進行磁盤存取時也會利用緩存來提高速率; 分布式文件系統通常也通過緩存來提高客戶機和服務器之間的速率,如瀏覽器緩存、CDN,DNS緩存等等。

三、使用緩存的目的

使用緩存主要的目的有兩個:實現高性能、高並發

舉個栗子: 假設有一個查詢功能,一個查詢請求過來應用就會鏈接到數據庫查詢結果,然後數據庫返回查詢結果。整個查詢從開始到獲得響應整個過程耗時100ms,而且查詢的數據在短時間內是不變或者是更新不頻繁的。當某一時刻有10000個相同的查詢過來時,處理全部的請求總耗時是100*10000ms。

在這裏插入圖片描述

使用緩存方案,即將第一次查詢的結果以K-V形式存儲到內存中,當有相同的查詢請求時直接通過K從內存中查詢出結果,從內存中查詢結果耗時1ms,當在有10000個相同的查詢過來時,處理請求的總耗時是100+1*9999ms,則相比沒有使用緩存時性能提昇大約100倍。
複制代碼

在這裏插入圖片描述

四、使用緩存潜在的問題

1、問題一、緩存與數據庫的一致性

在使用緩存時不可避免會涉及到緩存與數據庫數據讀寫的一致性,如何保持緩存的數據和數據庫數據的一致。 串行化讀寫緩存和數據庫可以保證數據强一致性,但是串行讀寫效率低,耗時長,無法支撐高並發請求場景。 緩存與數據庫數據不一致的原因

造成緩存與數據庫數據不一致的場景是在更新數據的時候發生的,更新數據的操作有以下幾種方式。

在這裏插入圖片描述

方式一:更新數據時先更新數據庫中的數據,更新成功之後再删除緩存中對應的數據

存在問題:當更新數據庫數據成功,更新或删除緩存數據失敗時,後續的查詢操作取到的數據是舊數據

解决方案

先更新數據庫,成功後往消息隊列發消息,消費到消息後再删除緩存,借助消息隊列的重試機制來實現,達到最終一致性的效果。

在這裏插入圖片描述

方式二:更新數據時先删除緩存中的數據,删除成功之後再更新數據庫中對應的數據

存在問題: 在高並發場景下兩個請求幾乎同時到達 請求一是更新操作,先删除了緩存,正在查詢數據庫,請求二是查詢操作,在請求一查詢數據庫的時候請求二查詢緩存沒有找到數據,就去數據庫查詢此時請求一還沒更新完畢,請求二查到了就數據並將舊數據放到了緩存中,後續的查詢操作查詢到的數據都是舊數據

解决方案: 延遲雙删,為了避免更新數據庫數據的時候,其他線程從緩存中讀取不到數據而從數據庫取到舊數據更新緩存,就在更新完數據庫之後,再 Sleep 一段時間,然後判斷緩存中是否有數據有就再次將緩存中的數據删除。

sleep的時間=其他線程讀數據時間+寫緩存時間

3、問題二、緩存穿透

在這裏插入圖片描述 緩存穿透一般是應用在遭受黑客攻擊時出現的場景,當黑客故意去請求緩存中不存在的數據,從而去數據庫中查,數據庫中也沒有,所以無法加到緩存,當黑客瘋狂發起這類請求時超高並發的查詢將導致數據庫崩潰。

解决方案: 1)利用互斥鎖,緩存失效的時候,先去獲得鎖,得到鎖了,再去請求數據庫。沒得到鎖,則休眠一段時間重試。 2)數據庫沒查到數據,也往緩存中寫入一個空值,但是設置失效時間短一點,防止惡意攻擊。

4、問題三、緩存擊穿

在這裏插入圖片描述 緩存擊穿是指緩存的熱點數據剛好過期時(失效),大量並發查詢請求到達,此時讀緩存沒讀到數據,應用就直接在數據庫中查詢數據,引起數據庫壓力瞬間增大,造成過大壓力 ,可能導致數據庫崩潰。

解决方案:

1、當多個線程同時去查詢數據庫的這條數據,那麼我們可以在第一個查詢數據的請求上使用一個互斥鎖來鎖住它 ,其他的線程走到這一步拿不到鎖就等著,等第一個線程查詢到了數據,然後做緩存。後面的線程進來發現已經有緩存了,就直接走緩存 2、可以將爆款的緩存失效時間設置為永久。

5、問題四、緩存雪崩

在這裏插入圖片描述 緩存雪崩是出現的場景一般是指正常使用的緩存組件突然發生不可用情况,導致系統處理能力大幅度降低此時有需要處理大量請求時導致數據庫壓力過大進而導致系統的崩潰。 導致緩存突然不可用的情况有很多比如上述提到緩存熱點數據同時失效、緩存節點故障等等

解决方案: 緩存預熱就是系統上線後,將相關的緩存數據直接加載到緩存系統。這樣就可以避免在用戶請求的時候,先查詢數據庫,然後再將數據緩存的問題。 設置不同的過期時間,讓緩存失效的時間點盡量均勻。 設置熱點數據永遠不過期。

五、緩存測試點

在一個系統中如果使用了緩存方案就不可避免存在上述問題。 測試前需要清楚知道被測系統采用的緩存實現方案以及更新策略,根據方案及策略的特點編寫有針對性測試用例。

緩存問題在測試過程中不容易被發現,因為在測試環境中使用系統的用戶都是測試員,對系統產生的壓力都非常小,只有在開展壓測場景下才有可能出現緩存導致的問題。

測試場景:

1、出現數據不一致時對業務的影響

2、是否考慮到系統在發生緩存擊穿場景下處理方案

3、是否考慮到了系統在發生緩存穿透情况下的處理方案

4、當系統發生緩存組件服務异常時或是緩存全部失效時在正常的業務量下系統是否撐得住。

​ 歡迎大家關注我的訂閱號,會定期分享一些關於測試相關的文章,有問題也歡迎一起討論學習!

版权声明:本文为[小黑測試員]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815150253216b.html