メモリが不足すると、Redisは何をしますか?


111

これは簡単な質問かもしれませんが、答えを見つけるのに苦労しています。Redis 2.0は割り当てられた最大メモリ不足をどのように処理しますか?どのデータを削除するか、どのデータをメモリに保持するかをどのように決定しますか?


回答:


94

仮想メモリ機能がオンになっている場合(バージョン2.0または2.2の新機能だと思います)、Redisはメモリが不足すると、「あまり使用されない」データをディスクに格納し始めます。

Redisの仮想メモリが無効になっている場合は、オペレーティングシステムの仮想メモリが使い果たされ始め(つまり、スワップ)たように見え、パフォーマンスが大幅に低下します。

これで、maxisパラメータを使用してRedisを設定することもできます。これにより、Redisがこれ以上メモリを使用することを防ぎます(デフォルト)。

Redisの新しいバージョンには、maxmemoryに到達したときのさまざまなポリシーがあります。

  • volatile-lruは、有効期限が設定されているキーの中からキーを削除し、最近使用されていないキーを削除しようとします。
  • volatile-ttlは、有効期限が設定されているキーの中からキーを削除し、残りの残り時間が短いキーを削除しようとします。
  • volatile-randomは、有効期限が設定されているキーの中からランダムなキーを削除します。
  • allkeys-lruはvolatile-lruに似ていますが、すべての種類のキー、通常のキーまたは有効期限が設定されたキーの両方を削除します。
  • allkeys-randomはvolatile-randomと似ていますが、すべての種類のキー(通常のキーと有効期限が設定されているキーの両方)を削除します。

EXPIREが設定されたキーのみを削除するポリシーを選択した場合、Redisがメモリ不足になると、プログラムがmalloc()操作を中止したように見えます。つまり、より多くのデータを格納しようとすると、操作はひどく失敗します。

詳細については、いくつかのリンクを参照してください(私の言葉をそのまま受け取らないでください)。


8
Redis Virtual Memoryは非推奨になりました。redis.io/topics/virtual-memoryを
cgaldiolo

19

redis.conf、バージョン2.8

# Don't use more memory than the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU cache, or to set
# a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# 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 according 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 no suitable keys for eviction.
#
#       At the date of writing these 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 volatile-lru

3
maxmemory-policyRedis 3.2 のデフォルトはnoeviction次のとおり
antirez

5

Redis 4.0を更新する

127.0.0.1:6379> MEMORY HELP
1) "MEMORY DOCTOR                        - Outputs memory problems report"
2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
3) "MEMORY STATS                         - Show memory usage details"
4) "MEMORY PURGE                         - Ask the allocator to release memory"
5) "MEMORY MALLOC-STATS                  - Show allocator internal stats"

/usr/local/etc/redis.conf

############################## MEMORY MANAGEMENT ################################

# Set a memory usage limit to the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU or LFU cache, or to
# set a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> Evict using approximated LRU among the keys with an expire set.
# allkeys-lru -> Evict any key using approximated LRU.
# volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
# allkeys-lfu -> Evict any key using approximated LFU.
# volatile-random -> Remove a random key among the ones 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 evict anything, just return an error on write operations.
#
# LRU means Least Recently Used
# LFU means Least Frequently Used
#
# Both LRU, LFU and volatile-ttl are implemented using approximated
# randomized algorithms.
#
# Note: with any of the above policies, Redis will return an error on write
#       operations, when there are no suitable keys for eviction.
#
#       At the date of writing these 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

# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated
# algorithms (in order to save memory), so you can tune it for speed or
# accuracy. For default Redis will check five keys and pick the one that was
# used less recently, you can change the sample size using the following
# configuration directive.
#
# The default of 5 produces good enough results. 10 Approximates very closely
# true LRU but costs more CPU. 3 is faster but not very accurate.
#
# maxmemory-samples 5

4

私は最近Redisについて読み始めたばかりなので、前向きではありません。しかし、役に立つかもしれないいくつかのヒントに出くわしました。

これがhttp://antirez.com/post/redis-as-LRU-cache.htmlからのスニペットです:

Redisをキャッシュとして使用するもう1つの方法は、maxmemoryディレクティブです。これは、使用するメモリの最大量を指定できる機能です。新しいデータがサーバーに追加され、メモリ制限に既に達している場合、サーバーは古いデータを削除し、揮発性キー、つまりEXPIRE(タイムアウト)が設定されたキーを削除します。自動的に期限切れから。

また、Redis 2.0にはVMモードがあり、すべてのキーがメモリに収まる必要がありますが、ほとんど使用されないキーの値はディスク上にある場合があります。


2

Redis(2.8)がその構成で定義された最大値に達したときに実際に何が応答するのか疑問に思う場合、次のようになります。

$ redis-cli
127.0.0.1:6379> GET 5
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
127.0.0.1:6379> SET 5 a
(error) OOM command not allowed when used memory > 'maxmemory'.

1

私は最近、メモリが解放されない状況を経験し、アプリケーションが停止しました(書き込み不可、読み取りは可能でした)、PHPスクリプトの実行は途中でトラックで完全に停止し、kill -9手動で(メモリがあった後でも)実行する必要がありました利用可能になります)。

データの損失(またはデータの不整合)が発生したflushdbと想定していたため、バックアップを復元しました。学んだ教訓?バックアップはあなたの友達です。


-3

Redisはmemcachedのようなキャッシュではありません。デフォルトでは(maxmemory-policyパラメーターがに設定されている場合noeviction)、redisに入れたすべてのデータは削除されません。唯一の例外はEXPIREの使用です。


2
それで、メモリが足りなくなったらどうするのでしょうか?新しいデータをメモリではなくディスクに保存しますか?
コーリー

1
これは(今)間違っている、Redisのは、いくつかの利用可能なポリシーを使用して、キー立ち退き機構を有する:redis.io/topics/lru-cache
LoicAG

@LoicAG:私には完全に正解に聞こえます...期限ポリシーがない限り、Redisはキーを削除しません。そしてそれは良いことです。たとえば、私はRedisに自分でキーを削除させるわけにはいきません。
マイケル、

@Cory:立ち退きポリシーが設定されている場合は、既存のキーが削除されます。ただし、エビクションポリシーを設定しなかった場合は、メモリ不足エラーが発生するはずです。
マイケル、

@Michael用語の問題だと思います。常にmaxmemory-policyが設定されており、デフォルトは「noeviction」です。しかし、「allkeys-lru」および「allkeys-random」ポリシーは、セット全体からキーを削除し、他の(「volatile- *」)ポリシーは、TTLが定義されているキーのサブセットからキーを削除します。
LoicAG 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.