Redis資料庫一些問題的出現場景以及解決辦法

2021-10-06 23:17:59 字數 716 閱讀 1727

1.redis的擊穿:某個key非常的熱點,訪問非常頻繁,當處於幾種高併發的時候,這個key失效的瞬間,大量的請求就擊穿了快取。直接請求了資料庫與快取雪崩的不同點在於快取雪崩是多個key在同一時間段過期造成了db壓力過大崩潰。

解決辦法:1.將key設為永不過期 2.使用互斥鎖,首先判斷redis中存放的資料是否為空,如果為空則使用setnx對他加乙個互斥鎖,加鎖成功的時候,從資料庫讀取資料設定到redis中,然後刪除setnx設定的鎖,如果加鎖失敗,則認為其他執行緒已經將資料庫的值設定到快取了,設定一定延遲讀取即可。

2.redis的穿透:查詢乙個一定不存在的資料,這樣快取中就不會有這個資料記錄,會直接從資料庫中查詢,如果查詢不到則不會寫入快取,當使用者進行惡意攻擊的時候會導致資料崩潰。

解決辦法:每次從資料庫中沒有查到資料,就直接寫乙個空值到快取中去,然後設定乙個過期時間,這樣下次有相同的key的話,在快取失效之前都可以直接從快取中獲取資料。

3.redis的雪崩:快取雪崩是指在我們設定快取時採用了相同的過期時間,導致快取在某一時刻同時失效,請求全部**到db,db瞬時壓力過重雪崩。

解決辦法:在原有的失效時間基礎上增加乙個隨機值,比如1-5分鐘隨機,這樣每乙個快取的過期時間的重複率會降低,就會降低,就很難引發集體失效的事件。

資料庫的一些問題

什麼是事務?事務的acid特性 事務的併發控制可能產生哪些問題 為了解決併發控制,定義了4種事務隔離級別 mysql innodb預設實現可重複讀級別 如何解決高併發場景下的插入重複 什麼是樂觀鎖,什麼是悲觀鎖 innodb vs myisam常見的區別 為什麼需要索引?查詢結構進化史 什麼是b t...

資料庫設計的一些問題

原則 如果列中要儲存的資料長度差不多一致的,則因該考慮用char 否則因該考慮用varchar。如果列中的最大資料長度小於50byte,則一般也考慮用char。當然如果這個列很少用,則基於節省空間和減少i o的考慮,還是可以選擇varchar 一般不宜定義大於50byte的char型別列。原則 de...

redis的一些問題

一 redis的併發競爭問題如何解決?redis為單程序單執行緒模式,採用佇列模式將併發訪問變為序列訪問。redis本身沒有鎖的概念,redis對於多個客戶端連線並不存在競爭,但是在jedis客戶端對redis進行併發訪問時會發生連線超時 資料轉換錯誤 阻塞 客戶端關閉連線等問題,這些問題均是由於客...