メモリ回収#
Redis の性能が高い主な理由は、メモリストレージに基づいていることですが、単一ノードの Redis ではメモリサイズが大きすぎると、永続化や主従同期の性能に影響を与えます。
設定ファイルで Redis の最大メモリを設定できます maxmemory <bytes>
例えば maxmemory 1gb
、メモリが上限に達するとデータを保存できなくなります。
これがメモリ回収戦略を導入する理由です。
有効期限戦略#
expire <key> <expireTime>
でキーに生存時間 TTL を設定できます。有効期限が切れた後にアクセスすると、得られるのは nil です。
Redis はどのようにしてキーが期限切れかどうかを知るのでしょうか?
2 つの Dict を利用して、それぞれ key-value および key-ttl を記録します。
TTL が切れたらすぐに削除されるのでしょうか?
例えば:
遅延削除
周期削除
遅延削除#
TTL が切れた時にすぐに削除するのではなく、KEY にアクセスした際にその KEY の生存時間をチェックし、期限切れであれば削除します。
周期削除#
周期削除:明らかに、定期的なタスクを通じて、周期的に一部の期限切れのキーをサンプリングし、削除を実行します。実行周期には 2 つの方法があります:
- Redis の初期化時に定期的なタスク serverCron () が設定され、server.hz の頻度で期限切れのキーのクリーンアップを実行します。モードは SLOW です。
- Redis の各イベントループの前に beforeSleep () 関数が呼び出され、期限切れのキーのクリーンアップを実行します。モードは FAST です。
淘汰戦略#
メモリ淘汰:Redis のメモリ使用量が設定された閾値に達したときに、積極的に一部のキーを選択して削除し、より多くのメモリを解放するプロセスです。
コマンドを処理する際に、メモリが不足している場合、maxmemory が設定されていて、Lua スクリプトが実行されていない場合は、まずメモリ淘汰を試みます。
淘汰戦略
LRU と LFU をどのように知るのでしょうか?
淘汰戦略フローチャート
TTL に関しては、生存時間が長いほど削除されるべきです;LRU に関しては、アクセスが遠いほど削除されるべきです;LFU に関しては、アクセスが少ないほど削除されるべきです。
この記事は Mix Space によって xLog に同期更新されました。元のリンクは https://blog.0xling.cyou/posts/redis/redis-6