redis緩存設計及經常使用問題node
緩存的收益與成本分析 緩存更新策略的選擇以及使用場景 緩存粒度控制法 穿透問題優化 無底洞問題優化 雪崩問題優化 熱點key重建優化 收益與成本redis
收益編程
加速讀寫後端
下降後端負載 成本數組
數據不一致性緩存
代碼維護成本markdown
運維成本 緩存更新策略網絡
lru,ttl,random,allkey-lru,allkey-random,no-enviction(內存達到最大值時的緩存策略) 2.超時刪除 (設定過時時間) 3.主動更新(用於數據一致性較高) 緩存粒度多線程
所有數據緩存以及部分數據緩存的選擇架構
思考緩存粒度從幾個維度考慮: 數據通用性,空間佔用比,代碼維護性 一般緩存所有數據 通用性好,代碼維護簡單,可是空間佔用大,而緩存部分數據則相反 穿透問題
緣由:cache miss 後直接請求後端服務,常發生在業務代碼異常,或者大量惡意攻擊致使的
解決方法:
用途:快速查詢一個元素是否在一個集合中
入參:失敗率,集合個數
原理:用k個hash函數將結果存在一個位數組中,檢查的時候對比每個位上是不是1 若是全是的話 則說明命中
說明:結果在,有可能不在 結果不在,則必定不在 無底洞問題
表現:集羣增長節點依然性能不佳。耗時有可能還有增長
緣由:客戶端使用mget之類批量獲取key的命令時候,會致使更多的io請求。在redis cluster中 key是分佈在各個slot中,批量操做的話會增長更多的網絡io
解決方式:
相同節點key 合併。總時間 = node + n次命令時間
redis 強制將這些key 寫入同一個slot中
性能比較
表現:在緩存層中服務不可以使用,致使後端服務負載太高,出現宕機的狀況
解決辦法:
表現:一般 緩存key+過時時間,能保證絕大部分需求,可是有2種狀況下,這樣的作法會引發性能問題
緣由。熱點key中 會有大量的線程嘗試重建緩存,致使後端負載過大,甚至引發宕機 解決方式: