最近工做上遇到個問題,從用戶A切換到用戶B,結果用戶B顯示的仍是用戶A的數據;前端
問題的緣由很簡單,用戶B使用的仍是用戶A的緩存數據,解決方案也很簡單,獨立保存一份緩存便可;redis
可是,不禁的想問,緩存測試這塊,須要注意什麼?數據庫
那先慢慢了解,到底什麼是緩存?後端
緩存是咱們在生活中常常聽到一個詞,如怎麼清理瀏覽器的緩存
,手機空間不夠了,得刪除緩存
,硬盤的緩存是否是越大越好
等等的問題;瀏覽器
其實這些緩存
能夠分紅3種:緩存
後兩種更像是一種技術或者是服務;bash
緩存是臨時存放數據(使用頻繁的數據)的地方,介於外部請求和真實數據之間;服務器
從一個用戶的角度來看,體驗最好的確定是無論什麼狀況下,都能成功訪問這個頁面,而且打開的速度很快,也就是保證正常工做的前提下時間儘量短;網絡
若是沒有緩存,咱們的體驗多是這樣的:併發
用戶請求一個數據,這個數據得從數據庫中去取,隨着用戶愈來愈多和數據量愈來愈大,每次用戶請求的時間就會愈來愈長,並且數據庫無時不刻都在工做;
這樣用戶和數據庫都很痛苦,時間一長,就有可能發生下面兩件事情:
1)用戶很煩,抱怨頁面加載太慢或者打不開,最後放棄了這個應用;
2)數據庫滿負荷工做,偶爾崩潰(致使頁面錯誤);
分析緣由,是因爲數據庫的鏈接數和鏈接時長是有限制的,但請求過多,超出了數據庫能承受的範圍,致使數據庫崩潰;
那爲何不把一部分數據放在別的地方,這樣有用戶請求這些數據時,就不用從數據庫中取了?
複製代碼
當客戶端向服務器請求一個資源時,服務器首先在緩存中找,若是在緩存中,那麼直接返回,不須要鏈接數據庫;
若是請求的資源不在緩存中,這時再去數據庫中找,找到後返回給客戶端,並將這個資源加入緩存中;
這樣下次請求相同資源時,就不須要鏈接數據庫了。並且若是把緩存放在內存中,由於對內存的操做要比對數據庫操做快得多,這樣請求時間也會縮短;
複製代碼
因此,經過使用緩存,就能夠保證知足用戶的需求,在正常工做的前提下響應時間儘量短;
特別須要注意緩存失效的場景,如:
緩存分爲兩類:強制緩存和協商緩存,定義以下:
緩存由http報文的內容決定,關係以下:
max-age
或者expires
都決定了緩存的過時時間,會使客戶端再次請求數據時先判斷緩存是否過時,未過時則直接從緩存中讀取數據(強制緩存);
二者的區別是前者是個相對值,相對於客戶端的時間,後者直接定義了截止時間,且相對於服務端的時間;
協商緩存由Last-Modified
、If-Modified-Since
或 ETag
、If-None-Match
兩組報文決定;
字段的意思分別以下:
Last-Modified
:表示服務器上某文件最近的修改時間,存在於響應報文;If-Modified-Since
:值等於Last-Modified
,存在於請求報文,用於將Last-Modified
值返回給服務端做比較;首次請求資源:
非首次請求資源:
在第一次請求資源後,瀏覽器會將資源連同響應報文一塊兒緩存到本地,其中響應報文可能包含了關於緩存的頭信息;
於是後續請求的時候,瀏覽器能夠根據本地緩存的頭信息知道資源的緩存決策,判斷是否強制緩存,或者移交服務器判斷是否協商緩存;
在服務器緩存裏面,有3個特殊的名詞:緩存穿透、緩存擊穿、緩存雪崩;
這3個究竟是什麼?
正常狀況下,查詢的數據都存在,若是請求一個不存在的數據,也就是緩存和數據庫都查不到這個數據,每次都會去數據庫查詢,這種查詢不存在數據的現象稱爲緩存穿透;
穿透帶來的問題
若是每次都拿一個不存在的id去查詢數據庫,可能會致使你的數據庫壓力增大;
如何發現緩存穿透
解決辦法--緩存空值
之因此發生穿透,是由於緩存中沒有存儲這些數據的key,從而每次都查詢數據庫;
能夠爲這些key在緩存中設置對應的值爲null,後面查詢這個key的時候就不用查詢數據庫了;
固然爲了健壯性,咱們要對這些key設置過時時間,以防止真的有數據;
複製代碼
在高併發的狀況下,大量的請求同時查詢同一個key時,此時這個key正好失效了或者不存在,就會致使同一時間,這些請求都會去查詢數據庫,這樣的現象稱爲緩存擊穿;
好比請求一些特殊字符,就會出現該狀況;
引發的緣由
帶來的問題
會形成某一時刻數據庫請求量過大;
解決辦法
採用分佈式鎖,只有拿到鎖的第一個線程去請求數據庫,而後插入緩存,若其它線程獲取鎖失敗,則等待一段時間後重試;
當某一時刻發生大規模的緩存失效的狀況,好比緩存服務宕機了;
解決方法
在設置緩存的時候,通常會給緩存設置一個失效時間,過了這個時間,緩存就失效了;
對於一些熱點的數據來講,當緩存失效之後會存在大量的請求過來,而後打到數據庫去,從而可能致使數據庫崩潰的狀況;
解決辦法
功能:
自動化:
性能及穩定性:
擴容:
環境:
無網絡&有數據:
無網絡&無數據:
有網絡&有數據:
有網絡&無數據:
緩存存儲:
異常狀況:
以前沒深刻了解過緩存,真的沒有覆蓋那麼多場景,基本都須要瞭解技術細節,才能設計出這樣的測試場景,偏後臺內部邏輯的測試;