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