首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 熱點數據緩存策略:LRU 算法演進與 Redis 過期時間實現原理

     編輯:Java 綜合教學

Java 熱點數據緩存策略:LRU 算法演進與 Redis 過期時間實現原理

一、LRU (Least Recently Used) 算法演進

基礎版:單向鏈表

LRU鏈表

  • 新數據插入頭部
  • 命中移動到頭部
  • 滿時丟棄尾部
  • 缺點: 命中需遍歷鏈表 O(n),移動節點麻煩

優化版:雙向鏈表 + HashMap

  • 雙向鏈表:每節點含 prev/next,O(1) 斷開/插入頭部
  • HashMap:Key → 節點引用,O(1) 定位節點
  • 流程:
    1. 新增:頭部插入 + Map put
    2. 獲取:Map get → 命中則斷開節點 → 移至頭部
    3. 淘汰:刪除尾部節點 + Map remove
  • 結果: 獲取/更新/淘汰均 O(1),工業級標準實現(如 LinkedHashMap、Guava Cache、Caffeine)

二、Redis 熱點緩存:過期時間機制

Redis過期

核心策略

  • 限制 maxmemory,啟用淘汰策略(allkeys-lru 等)
  • 業務層:每次命中 EXPIRE key TTL 續期 → 熱點數據永不超時,冷數據自然過期清理

底層原理:DelayQueue 延時隊列

  1. 設置過期時間 = 放入 DelayQueue,按過期時間排序(小頂堆)
  2. 一個/多個執行線程循環 poll() 獲取到期任務
  3. 多線程爭搶頭元素:CAS 自旋 + wait(delay) + 喚醒
  4. Redis 實際採用惰性過期 + 定期掃描混合模式,非純 DelayQueue

三、工程建議

  • 本地緩存:Caffeine(高性能、W-TinyLFU、統計完善)
  • 分佈式緩存:Redis + 合理 TTL + 監控命中率
  • 多級緩存:本地(Caffeine)+ 分佈式,降低 Redis 壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved