redisメモリ回収メカニズム
2663 ワード
メモリ回収
redis内の各オブジェクトは、redisObjectによって表され、redisObjectのtype属性とptr属性こそ、最下位実装データ構造へのポインタである.redisObjectでは参照カウントに使用するrefcount属性も維持されており、オブジェクトが作成されると参照カウントは1に初期化され、オブジェクトが新しいプログラムで使用されるとrefcount+1、プログラムで使用されなくなるとrefcount-1、この値が0の場合、オブジェクトが占有するメモリは回収されます.参照カウントは、メモリに使用されるほか、オブジェクト共有にも使用されます.例えばkey aの値が10、key bの値も10であると、redisはメモリを節約するためにデータベースキーの値を同じ文字列オブジェクトに向け、共有された値オブジェクトの参照カウント+1を指す.前述した秩序化されたセットのskiplist実装辞書とホップテーブル共有オブジェクトもこのように実装され、実際にはredisのデフォルトでは0-9999の文字列が共有のために初期化されます.
期限切れキー削除ポリシー
期限切れの削除には主に2つのポリシーがあります.タイミング削除、不活性削除、実は定期削除もあります.タイミング削除:タイミング削除、メモリに優しいが、キーが多い場合はcpuを消費する.不活性削除:使用時に期限切れを検出して削除し、cpuに友好的ですが、期限切れキーが多い場合は、メモリが多すぎます.定期削除:前と2種類、期限切れのキーを一定時間ごとに削除し、削除操作の頻度と時間を制限します.しかし、制御がうまくいかないと、タイミング削除または不活性削除に劣化する可能性があります.redosは、期限切れキーの削除ポリシーには主に不活性削除と定期削除の組み合わせを採用し、redisコマンドを実行するたびにexpireIfNeeded関数を呼び出してキーをチェックし、期限切れの場合は削除します.定期的な操作はactiveExpireCycle関数で実現され、redisデータベースを複数回に分けて所定時間にわたって遍歴し、一部のキーをランダムにチェックし、期限切れキーを削除します.各ライブラリのデフォルトで20個のキーをチェックします.実際には、このプロセスは、遅いモードと速いモードに分けられ、遅いモードではタイムアウト時間が25ミリ秒であり、タイムアウトした場合、再び速いモードで期限切れキーが回収され、速いモードではタイムアウト時間が1ミリ秒で、2 s以内に1回しか実行できません.
メモリ回収ポリシー
redisのメモリ回収メカニズムは,主に期限切れキーの削除ポリシー,およびメモリ使用が上限に達した場合のメモリ回収ポリシーである.redisはmaxmemoryを構成することによって最大使用可能メモリを制御し、
info memory
を介してredisメモリ情報を表示することができる.主な構成をいくつか示します.used_memory: Redis , redis ,
used_memory_human:
used_memory_rss: 。 top、ps 。
maxmemory:Redis
maxmemory_policy: maxmemory
mem_fragmentation_ratio: ,used_memory_rss/ used_memory
実際にはメモリの破片のため、redisが最大メモリに達するのはmaxmemoryを超えることが多い.32ビットのredisを間違えなければ最大3 gしか配置できません.redisのメモリ回収ポリシーには主に以下の6種類があります.
ポリシー
詳細
noeviction
デフォルトポリシーでは、淘汰は禁止されています.メモリが不足している場合は、読み書きしかできません.書くとエラーが返されます.
volatile-lru
タイムアウトしたキー値ペアに対して最近最も使用されている淘汰ポリシー(lru)を用いて回収する
allkeys-lru
すべてのキー値ペアに対して、最近最も使用されている淘汰ポリシー(lru)を使用して回収
volatile-random
タイムアウトしたキー値ペアをランダム淘汰ポリシーで回収
allkeys-random
すべてのキー値ペアをランダム淘汰ポリシーで回収
volatile-ttl
生存時間が最も短いキー値ペアの削除ポリシー
ここでは、Least Recenly Usedが最近最もアルゴリズムを使用しているLRU、つまり、多くのキャッシュポリシーがこのポリシーを使用して空間的に解放されています.Redisはデフォルトでnoevictionポリシーを使用し、maxmemory_を介してpolicyパラメータ構成.実際に上記のLRUまたはTTLアルゴリズムでは、redisは正確に実現されていない.なぜかというと、redisには多くのキー値ペアがある可能性があるため、redisは毎回すべてのキー値ペアを比較してどのキー値ペアを削除するかを決定することはできない.これにより、cpuが消費され、時間がかかるため、redisはmaxmemory-samplesパラメータによって制御され、このパラメータのデフォルト5では、このパラメータ構成は固定数のkeyをサンプルとして比較する.その後、淘汰ポリシーに従って回収します.maxmemory-samplesが大きいほど,lruアルゴリズムは厳密なlruアルゴリズムに近づき,精度は高くなるが,オーバーヘッドも大きくなる.資料を探して、redisの作者はテストを経て、この値は10に配置してすでに本当のlruに近いことを知っています.
本文は『redis設計と実現』からまとめた.