緩存淘汰策略之LRU

Redis內置緩存淘汰策略

  1. 最大緩存

* 在 redis 中,允許用戶設置最大使用內存大小maxmemory,默認爲0,沒有指定最大緩存,如果有新的數據添加,超過最大內存,則會使redis崩潰,所以一定要設置。

* redis 內存數據集大小上升到一定大小的時候,就會實行數據淘汰策略

  1. 淘汰策略

redis淘汰策略配置:maxmemory-policy voltile-lru,支持熱配置

  1. redis 提供 6種數據淘汰策略:
  1. voltile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
  2. volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
  3. volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
  4. allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
  5. allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
  6. no-enviction(驅逐):禁止驅逐數據

LRU原理

LRULeast recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是「如果數據最近被訪問過,那麼將來被訪問的機率也更高」。

LRU實現

最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:

1. 新數據插入到鏈表頭部;

2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;

3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。

 

在Java中可以使用LinkHashMap去實現LRU。

 

分析

【命中率】

當存在熱點數據時,LRU的效率很好,但偶發性的、週期性的批量操作會導致LRU命中率急劇下降,緩存污染情況比較嚴重。

【複雜度】

實現簡單。

【代價】

命中時需要遍歷鏈表,找到命中的數據塊索引,然後需要將數據移到頭部