Redis 注意事項及使用優化

2021-10-22 14:49:43 字數 1958 閱讀 1243

快取穿透指查詢乙個根本不存在的資料導致快取層和儲存層都無法命中, 快取穿透導致每次查詢都要去儲存層查詢,失去了快取層保護後端儲存層的意義;

可能造成快取穿透的兩個原因:

1. 自身**或者資料原因

2. 惡意攻擊 或者爬蟲軟體

快取穿透的解決方案:

1.空物件快取,當查詢穿透到儲存層,查到為null時,將這個物件快取起來並設定過期時間;以下是偽**

string gek

(string key)

}}

2.使用布隆過濾器

對於惡意攻擊,向伺服器請求大量不存在的資料造成的快取穿透,還可以用布隆過濾器先做一次過濾,對於不 存在的資料布隆過濾器一般都能夠過濾掉,不讓請求再往後端傳送。當布隆過濾器說某個值存在時,這個值可 能不存在;當它說不存在時,那就肯定不存在。

布隆過濾器就是乙個超大的bitmap 和幾個不一樣的hash函式;

當新增乙個key時,布隆過濾器會分別使用hash函式得到hash值,再與bitmap的長度做取模運算得到乙個陣列下標,將下標位置標記為1;

向布隆過濾器去查詢時,也是執行新增的邏輯,找到下標所在位置,如果幾個位置都為1 則認為這個key存在,如果有乙個為0則不存在;

布隆過濾器在bitmap比較擁擠時概率較低,因為在計算key時可能產生hash碰撞;

使用布隆過濾器的幾點注意:

1.使用前需要把所有需要過濾的key新增到布隆過濾器;

2.當完成布隆過濾器的初始化後,布隆過濾器將無法修改,只能銷毀重新初始化;

3.布隆過濾器採用的bitmap, 占用的記憶體空間並不算大;可以根據轉換公式計算 8bit=1byte 1024byte=1kb 1024kb=1mb

由於大批量快取在同一時間失效可能導致大量請求同時穿透快取直達資料庫,可能會造成資料庫瞬間壓力過大 甚至掛掉,對於這種情況我們在批量增加快取時最好將這一批資料的快取過期時間設定為乙個時間段內的不同時間.

由於快取層承載著大量請求,有效的保護了儲存層;當快取層因為某種原因不能提供服務導致流浪都到達儲存層,可能造成儲存層宕機繼而引發整個服務崩潰;

解決方案:

1.提高快取層的高可用性,可使用redis哨兵或者rediscluster

2.在web層增加限流元件,比如sentinel 或者 histrix ,流量過大時使用降級的方式引導使用者

在高併發場景下,同時運算元據庫和快取可能造成不一致;

解決方案:

1.對於併發機率很小的資料,幾乎可以不考慮這個問題;可以在快取資料上增加過期時間;

2.對於併發高,但是可以容忍範圍內的資料不一致情況 也可以採用過期時間的方案;

3.對於無法容忍的不一致性情況下,可以使用redis讀寫鎖來控制,使寫操作序列化;

4.也可以用阿里開源的canal通過監聽資料庫的binlog日誌及時的去修改快取,但是引入了新的中介軟體,增加了系統的複雜度。

bigkey主要針對value; 比如乙個string型別的value不應過大;乙個hash,set,list 乙個key的value元素不要過多;切合實際場景來調整;

bigkey可能引發的問題:

1.當使用了getall 等獲取全部資料的函式時可能由於資料量過大導致redis阻塞

2.加入乙個value的資料為1mb,client每秒請求1000次;那麼會占用頻寬每秒就是 1000mb,導致頻寬佔滿,網路擁塞;

redis安裝及注意事項

在linux中使用wget時,若報 bash wget command not found,則表明沒有安裝wget,需要安裝,安裝命令如下 yum y install wget 安裝完成即可以使用。使用 vim 時出現 bash vim command not found.輸入 rpm qa gre...

redis安裝及注意事項

在linux中使用wget時,若報 bash wget command not found,則表明沒有安裝wget,需要安裝,安裝命令如下 yum y install wget 安裝完成即可以使用。使用 vim 時出現 bash vim command not found.輸入 rpm qa gre...

wllvm使用及注意事項

export llvm compiler llvm gcc export llvm gcc prefix export llvm compiler path path to llvm 2.9 release asserts bin 這裡不能填llvm gcc的路徑,不然在extract bc的時候會...