Help us understand the problem. What is going on with this article?

Redisの利用メモリが最大メモリ超えた時の挙動

More than 3 years have passed since last update.

背景

最近ElasticCacheのRedisを利用して、メモリ使用量が常に高い状態になって、メモリ増加した.
その後、メモリ利用量もアイテム数もずっと増え続きしてた

 調査

メモリ増加前にメモリ利用量がピックになって、アイテム数がずっと同じ数値でした。

おかしいので、仮説としてRedis利用メモリがMAXメモリ超えた時点で、アイテムがredisから削除されたではないか

REDIS を LRU キャッシュとして使う
こちらを見ると、volatile-lruの場合はexpireが設定されてるアイテムなら、期限切れるかどうかと関係なく利用頻度が少ないアイテムから削除

ローカルで検証してみる

前準備

  1. こちらを参考にredisインストールMacにRedisをインストールして使ってみる
$ brew install redis 

メモリサイズを2MBにして、maxmemory-policyをvolatile-lruにする

期限付きがないアイテムを追加して、最大メモリ超えると、エラーになる

  1. 設定変更 /usr/local/etc/redis.conf
    • maxmemory 2MB
    • maxmemory-policy volatile-lru
  2. 再起動 brew services restart redis
  3. 有効期限設定しないで10000個アイテムセット
(1..10000).each do |i|
   Redis.current.set(SecureRandom.uuid, '1111111111111111111111111111111111')
end

エラーで落ちる

Redis::CommandError: OOM command not allowed when used memory > 'maxmemory'.

redis-cliで追加されるアイテム数確認

dbsize

1570個追加できた

期限付きのアイテムを追加して、最大メモリ超えると、後で回収される

  • 1000個の有効期限付きで追加
time = 3.months.seconds
(1..1000).each do |i|
   id = SecureRandom.uuid
   Redis.current.set(id, '1111111111111111111111111111111111')
   Redis.current.expire(id, time)
end

dbsizeで確認、0個、メモリ使いすぎて、削除された?

  • 100個を追加

    • 正常に追加できた
  • 300個を追加

    • 正常に追加できた
    • 1分ぐらい待つと、207個になってる
    • 5分ぐらい待つと、14個
    • 回収アルゴリズムがよくわからん
  • 500個を追加

    • 正常に追加できたが、1分後に0個になった、回収された

結論

  • volatile-lruの場合はexpireが設定されてるアイテムなら、期限切れるかどうかと関係なく利用頻度が少ないアイテムから削除、削除アルゴリズムがよくわかってない
  • 全部expireが設定されてるアイテムだったら、メモリが少なくなって、redisが落ちることがないが、正確な有効期限までじゃなくても、削除される
heroyct
medley
医療ヘルスケア分野の課題を解決する
https://www.medley.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした