緩存與后端系統(tǒng)
通常后端會采用Mysql等磁盤數(shù)據(jù)庫,可以持久化但是訪問慢,高并發(fā)時性能差,需要設置Nosql內(nèi)存型數(shù)據(jù)庫緩存:Redis等
但緩存可能出現(xiàn):緩存穿透、緩存擊穿、緩存雪崩等問題
認識緩存穿透、擊穿、雪崩
-
熱點key:常被訪問的key,如熱搜榜
-
緩存穿透
查找數(shù)據(jù)的順序是:先查找緩存,再查找數(shù)據(jù)庫
當查找一個數(shù)據(jù)時,緩存沒有都會請求數(shù)據(jù)庫,當查找的數(shù)據(jù)為熱點key,高并發(fā)時緩存就起不到作用,會壓垮數(shù)據(jù)庫
如果黑客利用這個不存在的key進行攻擊可能壓垮數(shù)據(jù)庫
-
緩存擊穿
緩存中沒有數(shù)據(jù)但數(shù)據(jù)庫里有(例如緩存過期),會進入后端訪問數(shù)據(jù)庫并回設到緩存,高并發(fā)的請求key,會壓垮數(shù)據(jù)庫
-
緩存雪崩
當緩存服務器重啟或者緩存短時間內(nèi)大量失效,高并發(fā)時,引起數(shù)據(jù)庫壓力過大甚至宕機。
和緩存擊穿不同的是, 緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫
緩存穿透解決方案
緩存穿透是查詢不存在的數(shù)據(jù)時會訪問數(shù)據(jù)庫
有兩種方法:
-
布隆過濾器:將數(shù)據(jù)庫中的數(shù)據(jù)哈希映射到bitmap(0、1表示存在、不存在),查詢時先訪問bitmap,查詢不存在的數(shù)據(jù)就會被bitmap攔截,就不用進入數(shù)據(jù)庫查詢
-
返回空值給緩存:當查詢不存在數(shù)據(jù)訪問數(shù)據(jù)庫返回值為空,仍然將空值進行緩存(Redis中value為空值會被回收,可以設置empty字符串等),當然插入值時要替代掉空值
緩存擊穿解決方案
緩存擊穿是數(shù)據(jù)緩存沒有而數(shù)據(jù)庫有,查詢時需要進入數(shù)據(jù)庫查詢,高并發(fā)時會壓垮數(shù)據(jù)庫
有兩種解決方案:
-
設置熱點key永不過期
-
加互斥鎖(mutex key)
互斥鎖:在緩存失效的時候(判斷拿出來的值為空),第1個進入的線程,獲取鎖并從數(shù)據(jù)庫去取數(shù)據(jù),沒釋放鎖之前,其他并行進入的線程會等待,再重新去緩存取數(shù)據(jù)
Redis:使用setnx操作去set一個mutex key,當操作返回成功時,再進行l(wèi)oad db的操作并回設緩存;否則,就重試整個get緩存的方法。
setnx key value
:當key不存在時才設置值,key存在不操作。setnx可以實現(xiàn)互斥鎖
通過互斥鎖,高并發(fā)也僅查詢一次數(shù)據(jù)庫
緩存雪崩解決方案
緩存雪崩是緩存服務器重啟或者大量緩存失效,引起數(shù)據(jù)庫壓力過大
這里的問題是多個key緩存,有兩種方案:
-
盡量設置緩存失效時間均勻分布,別在短時間內(nèi)大量緩存過期文章來源:http://www.zghlxwxcb.cn/news/detail-493516.html
-
考慮用加鎖隊列的方式來保證不會有大量的線程對數(shù)據(jù)庫一次性進行讀寫,從而避免失效時大量的并發(fā)請求數(shù)據(jù)庫(在高并發(fā)下線程阻塞,用戶體驗差)文章來源地址http://www.zghlxwxcb.cn/news/detail-493516.html
到了這里,關(guān)于Redis什么是緩存穿透、擊穿、雪崩?如何解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!