【Redis記憶體策略】

lijieshare發表於2018-01-31

Redis最大記憶體的設定是通過設定maxmemory來完成的,格式為maxmemory bytes ,當目前使用的記憶體超過了設定的最大記憶體,就要進行記憶體釋放了, 當需要進行記憶體釋放的時候,需要用某種策略對儲存的的物件進行刪除。Redis有六種策略(預設的策略是noeviction)

 

Redis最大記憶體設定

預設情況下,在32位OS中,Redis最大使用3GB的記憶體,在64位OS中則沒有限制。

在使用Redis時,應該對資料佔用的最大空間有一個基本準確的預估,併為Redis設定最大使用的記憶體,

否則在64位OS中Redis會無限制地佔用記憶體(當實體記憶體被佔滿後會使用swap空間),容易引發各種各樣的問題。

通過如下配置控制Redis使用的最大記憶體:

maxmemory 100mb

 

在記憶體佔用達到了maxmemory後,再向Redis寫入資料時,Redis會:

1)根據配置的資料淘汰策略嘗試淘汰資料,釋放空間

2)如果沒有資料可以淘汰,或者沒有配置資料淘汰策略,那麼Redis會對所有寫請求返回錯誤,但讀請求仍然可以正常執行

 

 maxmemory <bytes>

 

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory

# is reached. You can select among five behaviors:

#

# volatile-lru -> remove the key with an expire set using an LRU algorithm

# allkeys-lru -> remove any key accordingly to the LRU algorithm

# volatile-random -> remove a random key with an expire set

# allkeys-random -> remove a random key, any key

# volatile-ttl -> remove the key with the nearest expire time (minor TTL)

# noeviction -> don't expire at all, just return an error on write operations

#

# Note: with any of the above policies, Redis will return an error on write

#       operations, when there are not suitable keys for eviction.

#

#       At the date of writing this commands are: set setnx setex append

#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd

#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby

#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby

#       getset mset msetnx exec sort

#

# The default is:

#

# maxmemory-policy noeviction

 

 

 

 

Redis提供了下面幾種淘汰策略供使用者選擇,其中預設的策略為noeviction策略:

1)noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。

2)allkeys-lru:在主鍵空間中,優先移除最近未使用的key。

3)volatile-lru:在設定了過期時間的鍵空間中,優先移除最近未使用的key。

4)allkeys-random:在主鍵空間中,隨機移除某個key。

5)volatile-random:在設定了過期時間的鍵空間中,隨機移除某個key。

6)volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。

 

 

淘汰策略的選擇可以通過下面的配置指定:

# maxmemory-policy noeviction

相關文章