説明したように、メモリは固定サイズのページ(1MBまたは最大アイテム構成サイズ)で分割され、各ページは粒状スラブクラスに属します。当初、これらのページは実際に特定のスラブクラスに割り当てられていません。リクエストが来ると、サイズ範囲ごとにスラブクラスが作成され、ページがそれらに添付されます。
最適なスラブクラスを特定することが重要です。そのアルゴリズムはおおよそ次のようになります。
- テールページ(このスラブクラスの最後に割り当てられたページ)で、開いている/空いているチャンクがあるかどうかを確認します。
- 見つかった場合は、このオブジェクトをそのページに格納して戻ります。
- それ以外の場合は、未割り当てのページを見つけて、このスラブクラスに割り当てます。
- 割り当てられていないページがない場合(これはすべてのメモリが完全にいっぱいであるとは限りません)、LRUロジックを使用して、使用されていない(または期限切れの)チャンクを解放します。
- このオブジェクトは、解放されたチャンク(手順4)または空のページ(手順3)のいずれかに格納します。
今、あなたの質問にお答えします。
すべてのページが一部のスラブクラスに割り当てられている場合にのみ、エビクションが発生します。以来、すべてのページはいくつかのスラブクラスにバインドされ、そのサイズ範囲内のオブジェクト/アイテムを受け入れる準備ができています。残りの空きメモリは、他のサイズのオブジェクトには使用できません。つまり、サイズ変更することはできません。これは簡単にするために実装されています。このメソッドは、オブジェクトのサイズがクエリ結果、レンダリングされたhtmlページとほぼ同じサイズである多くのWebアプリケーションに最適です。その場合、Memcacheは使用しているクラスをほとんど使用しないで、すべてのページを割り当てます。
私はどこかで読んでいたことを覚えています。このサイズのメモリのサイズは、Redisがより柔軟です。
希望すると助かります!