NoSQL 開發中或多或少都會用到,也是面試必問知識點,最近這幾天的面試每一場都問到了,但是感徑訓答的并不好,還有很多需要梳理的知識點,這里通過幾篇 Redis 筆記整個梳理一遍,后面再加上面試題,
Redis 系列:
- Redis系列(一)Redis入門
- Redis系列(二)Redis的8種資料型別
- Redis系列(三)Redis的事務和Spring Boot整合
- Redis系列(四)Redis組態檔和持久化
- Redis系列(五)發布訂閱模式、主從復制和哨兵模式
- Redis系列(六)Redis 的快取穿透、快取擊穿和快取雪崩
- Redis系列(七)Redis面試題
- Redis命令參考
1、Redis可能的問題
Redis 快取的使用,極大的提升了應用程式的性能和效率,特別是資料查詢方面,但同時,它也帶了一些問題,其中,最要害的是問題,就是資料一致性的問題,從嚴格意義上講,這個問題無解,如果對資料的一致性要求很高,那么久不能使用快取,
另外一些典型的問題就是,快取穿透、快取雪崩快取擊穿,目前,是業界也都有比較流行的解決方案,
2、快取穿透(查不到資料導致)
快取穿透的概念簡單,用戶想要查詢一個資料,發現 Redis 記憶體資料庫沒有,也就是快取沒有命中,于是向持久層資料庫查詢,發現也沒有,于是本次查詢失敗,當用戶很多的時候,快取都沒有命中,于是都去請求了持久層資料庫,這給持久層資料庫造成很大的壓力,這時候就相當于出現了快取穿透,

解決方案:
1、布隆過濾器
布隆過濾器是一種資料結構,對所有可能查詢的引數以 hash 形式存盤,在控制層先進行校驗,不符合則丟棄,從而避免了對底層存盤系統的查詢壓力,

2、快取空物件
當存盤層不命中后,即使回傳的空物件也將其快取起來,同步會同步一個過期時間,之后再訪問這個資料將會從存盤中獲取,保護了后端資料源,

但是這種方法會存在兩個問題:
1、如果控制能夠被快取起來,這就意味著快取需要更多的空間存盤,因為這當中可能會有很多的空值的鍵;
2、即使對空值設定了過期時間,還是會存在快取層和存盤層的資料會有一段時間視窗的不一致,這對于需要保持一致性的業務會有影響,
2、快取擊穿(請求太多,快取過期)
這里需要注意和快取穿透的區別,快取擊穿,是指一個 key 非常熱點,在不停的扛著大并發,大并發集中對這一個點進行訪問,當這個 key 在失效的瞬間,持續的大并發就穿破快取,直接請求資料庫,就像在一個屏障上鑿開了一個洞,
當某個 key 在過期的瞬間,有大量的請求并發訪問,這類資料一般是熱點資料,由于快取過期,會同時訪問資料庫來查詢最新的資料,并回寫快取,會導致資料庫瞬間壓力過大,
解決方案:
1、設定熱點資料永不過期
從快取層來看,沒有設定過期時間,所以不會出現熱點 key 過期后產生的問題,
2、加互斥鎖
分布式鎖:使用分布式鎖,保證對于每個 key 同時只有一個執行緒去查詢后端服務,其他執行緒沒有獲得分布式鎖的權限,因此只需要等待即可,這種方式將高并發的壓力轉移到了分布式鎖,因對分布式鎖的考驗很大,

3、快取雪崩
快取雪崩,是指在某一個時間段,快取集中過期失效,
產生雪崩的原因之一,比如馬上就要雙十二零點,,很快就會有一波搶購,這波商品時間比較集中的放在了快取,假設快取一個小時,那么到了凌晨一點鐘的時候,這批商品的快取就都會過期了,而對這批商品的訪問查詢,都落到資料庫上,對于資料庫而言,就會產生周期性的壓力波峰,于是所有的請求都會到達存盤層,存盤層的呼叫量會暴增,造成存盤層也回掉的情況,

其實集中時期,倒不是非常致命,比較致命的快取雪崩,是快取服務器某個節點宕機或者斷網,因為自然形成 的快取雪崩,一定是某個時間段中創建快取,這個時候也是可以頂住壓力的,無非就是對資料庫產生周期性的壓力而已,而快取服務節點的宕機,對于資料庫服務器的壓力是不可預的,很有可能瞬間就把資料庫壓垮,
解決方案
1、Redis 高可用
這個思想的含義是,既然 redis 有可能掛掉,那我多增設幾臺 redis,這樣一臺掛掉之后其他的還可以繼續作業,其實就是搭建的集群,
2、限流降級
這個解決方案的思想是,在快取失效后,通過加鎖或者佇列來控制資料庫寫快取的執行緒數量,比如對某個 key 只允許一個執行緒查詢資料和寫快取,其他執行緒等待,
3、資料預熱
資料預熱的含義是在正式部署之前,把可能的資料線預先訪問一遍,這樣部分可能大量訪問的資料就會加載到快取,在即將發生大并發訪問前手動觸發加載快取不同的key,設定不同的過期時間,讓快取失效的時間點盡量均勻,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/3174.html
標籤:NoSQL
上一篇:Redis系列(五)發布訂閱模式、主從復制和哨兵模式
下一篇:Redis學習筆記(七) 資料庫
