redis 穿透 擊穿 雪崩問題

什麼是緩存,爲什麼要使用緩存?

 

緩解關係數據庫(常見的是mysql)併發訪問的壓力,熱點數據。

減少響應時間:內存IO速度比磁盤快

提升吞吐量:redis等內存數據庫單機就可以支撐很大併發。

 

簡述redis 常用數據類型和使用場景

String(字符串):實現簡單的kv鍵值對存儲,比如計數器

List(鏈表):實現雙向鏈表,比如用戶的關注,粉絲列表

Hash(哈希表):用來儲存彼此相關信息的鍵值對

 

Set(集合):儲存不重複元素,比如用戶的關注者

Sorted set(有序集合):實時信息排行榜

 

Redis 實現的跳躍表是什麼結構?

列表不支持隨機查找,可以通過二分法查找

 

Redis的持久化方式:

1 快照方式(rdb):把數據快照放在磁盤二進制文件中,dump.rdb

 

2 AOF 方式,每一個寫命令追加到appendonly.aof中

可以通過修改redis 配置實現

 

什麼是redis 事務

 將多個請求打包,一次性,按序執行多個命令的機制

Redis 通過 MULTI(開始),EXEC(執行)。WATCH(併發空值)等命令實現事務功能

 

Redis 如何實現分佈式鎖

使用setnx 實現加鎖 ,可以通過expire添加超市時間

所得value值可以通過一個隨機的uuid或者特點的命名

釋放鎖的時候,通過判斷uuid是否是該鎖,是則執行delete釋放鎖

 

使用緩存的模式

同時更新緩存和數據庫(常用)

先更新緩存,緩存釋放負責同步更新數據庫

先更新緩存,緩存定期一步更新數據庫

 (一般先更新數據庫然後刪除緩存)

 

如何解決緩存穿透問題?

緩存穿透:大量查詢不到的數據的請求落到後端數據庫,數據庫壓力增大

由於大量緩存查不到就去數據庫取,數據庫也沒有要查詢的數據

解決方法:

對於沒有查到的數據返回爲None的數據進行緩存

插入數據的時候刪除相應緩存,或者設置較短的超時時間

 

如何解決緩存擊穿問題?

緩存擊穿:某些熱點的數據key過期,大量請求打到後端數據庫(微博明星離婚)

解決:

1:熱點數據key失效導致大量請求打到數據庫增加數據庫的壓力:

2:分佈式鎖,獲取鎖的線程從數據庫拉取數據更新緩存,其他線程等待

3:異步更新後臺:後臺任務指針對過期的key自動刷新

 

如何解決緩存雪崩問題?

緩存雪崩:緩存不可用或者大量緩存key同時失效,大量請求直接打到數據庫

解決:

1:多級緩存,不同級別的key設置不同的超時時間

2:超時隨機,key的超時時間隨時設置,防止同時超時

3:架構層:提升系統可用性。監控,報警完善。

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章