当Redis使用的内存超过最大内存限制时的行为 options: 当Redis使用的内存超过最大内存限制时, 会发生什么?
背景:
最近ElasticCacheのRedisを利用して、メモリ使用量が常に高い状態になって、メモリ増加した.
その後、メモリ利用量もアイテム数もずっと増え続きしてた
调查
在内存增加之前,内存使用量一直处于峰值,并且项目数量始终保持着相同的数值。
因为这个情况很奇怪,假设是在Redis使用的内存超过了最大内存时,会将项目从Redis中删除。
REDIS を LRU キャッシュとして使う
こちらを見ると、volatile-lruの場合はexpireが設定されてるアイテムなら、期限切れるかどうかと関係なく利用頻度が少ないアイテムから削除
在本地进行验证试验
预备工作
- 参照这个,试着在Mac上安装Redis并使用它。
$ brew install redis
将内存大小设为2MB,并将最大内存策略设为volatile-lru。
如果添加了没有期限的项目,并且超过了最大内存,将会出现错误。
-
- 在/usr/local/etc/redis.conf中更改设置
最大内存为2MB
最大内存策略为易失性LRU
重新启动
用brew命令重新启动redis服务
设置10000个项目而不设置过期时间
(1..10000).each do |i|
Redis.current.set(SecureRandom.uuid, '1111111111111111111111111111111111')
end
在Redis使用的内存超过’maxmemory’时,出现了OOM错误,导致程序崩溃。
使用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が落ちることがないが、正確な有効期限までじゃなくても、削除される