[toc]
[toc]
本系列文章整理摘抄自
**維護成本
基於記憶體的快取不可能將所有的資料都做快取,一般針對的都是熱點資料。熱點資料具有時效性,過了一定時間將成為非熱點資料。
所以,快取資料通常具有生命時長,到達指定的時間後,將被更新或者刪除。
熟悉快取的常用更新策略,才能針對業務場景做出合理的選擇。
通常快取量超過了預設的最大值時,將會採取以上策略,具體由maxmemory-policy
引數指定。
一致性最差。
通過給快取資料設定過期時間,讓其在過期時間後自動刪除,例如redis提供的expire
命令。
一致性取決於時間視窗。
當堆資料一致性要求高時,在更新儲存層資料後,需要立即更新快取中的資料。
一致性最好。
配置最大記憶體 + 淘汰策略
超時剔除 + 主動更新
對於快取資料庫的內容時,要考慮快取全部字段,或者部分字段。
部分字段:
在系統剛上線,直接將資料載入進快取系統,提前準備。
快取穿透是指查詢乙個根本不存在的資料,快取層和儲存層都不命中。
如果出現大量的快取穿透,會對後端的資料庫產生大流量的衝擊,嚴重可使得資料庫服務宕機。
統計總呼叫數、 快取層命中數、 儲存層命中數,如果發現大量儲存層空命中, 可能就是出現了快取穿透問題。
問題1的解決. 快取空物件 + 設定短過期時間
實時性高。
儲存層不命中後,仍然將空物件保留到快取層中,之後再訪問這個資料將會從快取中獲取,這樣就保護了後端資料來源。
問題2的解決. 布隆過濾器攔截(快取層之前對存在的key做儲存)
實時性差。
訪問快取層和儲存層之前,將存在的key用布隆過濾器提前儲存起來, 做第一層攔截
發生大規模的快取失效的情況,或者快取層宕機,大量流量衝入儲存層。
快取服務由於各種原因失效了。
資料庫服務宕機。
主從 + 哨兵, 集群。
redis sentinel和rediscluster都實現了高可用
hystrix限流並降級的流程
海量的使用者請求出現:
當熱點資料併發訪問量非常大,由於之前設定了過期時間,失效後難以短時間重建。
比如: 熱點的娛樂新聞。
快取服務由於各種原因失效了。
資料庫服務宕機。
並不是所有的執行緒都需要去重建,第乙個遇到的執行緒重建,其他執行緒等待即可。
互斥鎖的實現1:通過setnx 和 expire命令實現
1234567
891011
1213
1415
1617
1819
2021
22
string get(string key) // 其他執行緒休息50毫秒後重試
else
}return value;
}
互斥鎖的實現2:通過watch和redis的事務命令實現但是會出現資料不一致的情況。
不要讓熱點資料集中失效,而是一批一批,分時間段的失效
Redis快取設計
策略 一致性維護成本 lru lrf fifo最差低 超時剔除 較差較低 主動更新強高 低一致性業務 最大記憶體和淘汰策略的方式,maxmemory policy 高一致性業務 超時剔除和主動更新 解決快取穿透 適用場景 維護成本 快取空物件 資料命中不高,資料頻繁變化實時性高 維護簡單,需要過多的...
redis 快取設計
1 快取穿透 查詢乙個不存在的key 資料,快取層和儲存層都不會命中,將導致不存在的資料每次請求都要到儲存層去查詢,失去快取保護db 的意義。解決方案 有很多種方法可以有效地解決快取穿透問題,最常見的則是採用布隆過濾器 不了解的可以看這裡 將所有可能存在的資料雜湊到乙個足夠大的bitmap中,乙個一...
redis系列 五 redis 快取設計
序號 名稱鏈結位址 1redis系列 一 redis安裝以及基本型別簡介 2redis系列 二 redis持久化 3redis系列 三 redis主從複製 4redis系列 四 redis哨兵模式與集群 5redis系列 五 redis 快取設計 1.1收益 加速讀寫 因為快取通常都是全記憶體的 例...