1 導讀
Redis 是當前最流行的 NoSQL數據庫。Redis主要用來做緩存使用,在提高數據查詢效率、保護數據庫等方面起到了關鍵性的作用,很大程度上提高系統的性能。當然在使用過程中,也會出現一些異常情景,導致Redis失去緩存作用。
2 異常類型
異常主要有 緩存雪崩 緩存穿透 緩存擊穿。
2.1 緩存雪崩
2.1.1 現象
緩存雪崩是指大量請求在緩存中沒有查到數據,直接訪問數據庫,導致數據庫壓力增大,最終導致數據庫崩潰,從而波及整個系統不可用,好像雪崩一樣。
2.1.2 異常原因
- 緩存服務不可用。
- 緩存服務可用,但是大量KEY同時失效。
2.1.3 解決方案
1.緩存服務不可用
redis的部署方式主要有單機、主從、哨兵和 cluster模式。
-
單機
只有一臺機器,所有數據都存在這臺機器上,當機器出現異常時,redis將失效,可能會導致redis緩存雪崩。 -
主從
主從其實就是一臺機器做主,一個或多個機器做從,從節點從主節點復制數據,可以實現讀寫分離,主節點做寫,從節點做讀。
優點:當某個從節點異常時,不影響使用。
缺點:當主節點異常時,服務將不可用。 -
哨兵
哨兵模式也是一種主從,只不過增加了哨兵的功能,用于監控主節點的狀態,當主節點宕機之后會進行投票在從節點中重新選出主節點。
優點:高可用,當主節點異常時,自動在從節點當中選擇一個主節點。
缺點:只有一個主節點,當數據比較多時,主節點壓力會很大。 -
cluster模式
集群采用了多主多從,按照一定的規則進行分片,將數據分別存儲,一定程度上解決了哨兵模式下單機存儲有限的問題。
優點:高可用,配置了多主多從,可以使數據分區,去中心化,減小了單臺機子的負擔.
缺點:機器資源使用比較多,配置復雜。 -
小結
從高可用得角度考慮,使用哨兵模式和cluster模式可以防止因為redis不可用導致的緩存雪崩問題。
2.大量KEY同時失效
可以通過設置永不失效、設置不同失效時間、使用二級緩存和定時更新緩存失效時間
-
設置永不失效
如果所有的key都設置不失效,不就不會出現因為KEY失效導致的緩存雪崩問題了。redis設置key永遠有效的命令如下:
PERSIST key
缺點:會導致redis的空間資源需求變大。 -
設置隨機失效時間
如果key的失效時間不相同,就不會在同一時刻失效,這樣就不會出現大量訪問數據庫的情況。
redis設置key有效時間命令如下:
Expire key
示例代碼如下,通過RedisClient實現
/**
* 隨機設置小于30分鐘的失效時間
* @param redisKey
* @param value
*/
private void setRandomTimeForReidsKey(String redisKey,String value){
//隨機函數
Random rand = new Random();
//隨機獲取30分鐘內(30*60)的隨機數
int times = rand.nextInt(1800);
//設置緩存時間(緩存的key,緩存的值,失效時間:單位秒)
redisCl