天天看點

推薦8-設定Redis的LRU政策

概念

LRU(Least Recently Used)最近最少使用算法是衆多置換算法中的一種。

maxmemory

Redis中有一個maxmemory概念,主要是為了将使用的記憶體限定在一個固定的大小。Redis用到的LRU 算法,是一種近似的LRU算法。

設定maxmemory

127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 100MB
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "104857600"           

複制

注意,在64bit系統下,maxmemory設定為0表示不限制Redis記憶體使用,在32bit系統下,maxmemory隐式不能超過3GB。當Redis記憶體使用達到指定的限制時,就需要選擇一個置換的政策。

置換政策

當Redis記憶體使用達到maxmemory時,需要選擇設定好的maxmemory-policy進行對老資料的置換。

下面是可以選擇的置換政策:

  1. noeviction: 不進行置換,表示即使記憶體達到上限也不進行置換,所有能引起記憶體增加的指令都會傳回error
  2. allkeys-lru: 優先删除掉最近最不經常使用的key,用以儲存新資料
  3. volatile-lru: 隻從設定失效(expire set)的key中選擇最近最不經常使用的key進行删除,用以儲存新資料
  4. allkeys-random: 随機從all-keys中選擇一些key進行删除,用以儲存新資料
  5. volatile-random: 隻從設定失效(expire set)的key中,選擇一些key進行删除,用以儲存新資料
  6. volatile-ttl: 隻從設定失效(expire set)的key中,選出存活時間(TTL)最短的key進行删除,用以儲存新資料

volatile-lru和volatile-random經常在一個Redis執行個體既做cache又做持久化的情況下用到,然而,更好的選擇使用兩個Redis執行個體來解決這個問題。設定是失效時間expire會占用一些記憶體,而采用allkeys-lru就沒有必要設定失效時間,進而更有效的利用記憶體。

3 置換政策是如何工作的

了解置換政策的執行方式是非常重要的,比如:

  1. 用戶端執行一條新指令,導緻資料庫需要增加資料(比如set key value)
  2. Redis會檢查記憶體使用,如果記憶體使用超過maxmemory,就會按照置換政策删除一些key
  3. 新的指令執行成功

我們持續的寫資料會導緻記憶體達到或超出上限maxmemory,但是置換政策會将記憶體使用降低到上限以下。

如果一次需要使用很多的記憶體(比如一次寫入一個很大的set),那麼,Redis的記憶體使用可能超出最大記憶體限制一段時間。

設定轉換政策

127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory-policy allkeys-lru
OK
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"           

複制