1. 程式人生 > 其它 >redis常見問題彙總

redis常見問題彙總

1.Redis為什麼這麼快
完全基於記憶體,絕大部分請求是純粹的記憶體操作
據結構簡單,對資料操作也簡單
採用單執行緒,避免了不必要的上下文切換和競爭條件,也避免了鎖的問題
2.redis的5種基本型別:包括String,List,Set,Zset,Hash,滿足大部分的使用要求
3.Redis 提供兩種持久化機制 RDB(預設) 和 AOF 機制
4.過期策略通常有以下三種:
定時過期:每個設定過期時間的key都需要建立一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的資料,對記憶體很友好;但是會佔用大量的CPU資源去處理過期的資料,從而影響快取的響應時間和吞吐量
惰性過期:只有當訪問一個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節省CPU資源,卻對記憶體非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,佔用大量記憶體
定期過期:每隔一定的時間,會掃描一定數量的資料庫的expires字典中一定數量的key,並清除其中已過期的key
5.Redis的記憶體淘汰策略有哪些
noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯。
allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key。(這個是最常用的)
allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,隨機移除某個key。
volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key。
volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個key。
volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除
6.哨兵的核心知識
哨兵至少需要 3 個例項,來保證自己的健壯性。
哨兵 + redis 主從的部署架構,是不保證資料零丟失的,只能保證 redis 叢集的高可用性。
對於哨兵 + redis 主從這種複雜的部署架構,儘量在測試環境和生產環境,都進行充足的測試和演練。
7.Redis實現分散式鎖:為了防止獲取鎖後程序出現異常,導致其他執行緒/程序呼叫SETNX命令總是返回0而進入死鎖狀態,需要為該key設定一個“合理”的過期時間
8.快取雪崩:快取雪崩是指快取同一時間大面積的失效,所以,後面的請求都會落到資料庫上,造成資料庫短時間內承受大量請求而崩掉。解決方案如下:
a.快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
b.一般併發量不是特別多的時候,使用最多的解決方案是加鎖排隊。
c.給每一個快取資料增加相應的快取標記,記錄快取的是否失效,如果快取標記失效,則更新資料快取。
9.快取穿透是指快取和資料庫中都沒有的資料,導致所有的請求都落到資料庫上,造成資料庫短時間內承受大量請求而崩掉,解決方案如下:
a.介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截;
b.從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒,這樣可以防止攻擊使用者反覆用同一個id暴力攻擊
c.採用布隆過濾器,將所有可能存在的資料雜湊到一個足夠大的 bitmap 中,一個一定不存在的資料會被這個 bitmap 攔截掉,從而避免了對底層儲存系統的查詢壓力
10.快取擊穿:
快取擊穿是指快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力和快取雪崩不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫
11.布隆過濾器:引入了k(k>1)k(k>1)個相互獨立的雜湊函式,保證在給定的空間、誤判率下,完成元素判重的過程