memcahcedの名前空間

ここにいる多くの人が、プロジェクトでデータをキャッシュする問題に既に直面していると確信しています。 また、多くの人がすでにこのためにmemcachedを使用していると確信しています。 最近、誰もがこれに直面しなければならなかった、と私=)。 しかし、memcachedで名前空間を操作する機能にも興味がありました。

残念ながらmemcahcedはこの便利な機能をサポートしていませんが、これは絶望して落ち込んでしまう理由ではありません=)





このデータの一部がすでに無効とマークされている場合、キャッシュ内のデータの一部を無効とマークするために、ネームスペースが必要でした。 以下に簡単な例を示します。

私は、単独で、または大規模なSELECTを使用して他のオブジェクトの中からデータベースから選択できるオブジェクトを持っています。 したがって、データベースから単一のオブジェクトと大量のサンプルをキャッシュする場合、単一のオブジェクトを更新してそのキャッシュを無効にすると、サンプルキャッシュを無効にするという問題が発生します。 また、キャッシュに保存されているこのようなサンプルは、1つよりもはるかに大きくなる可能性があります。



長い間頭を痛め、あらゆる種類のキーの組み合わせを考えた後、memcachedのドキュメントに戻ることにしました。



$ns_key = $memcache->get("foo_namespace_key");



// if not set, initialize it

if($ns_key===false) $memcache->set("foo_namespace_key", rand(1, 10000));



// cleverly use the ns_key

$my_key = "foo_".$ns_key."_12345";

$my_val = $memcache->get($my_key);



//To clear the namespace do:

$memcache->increment("foo_namespace_key");







このコードを読んだ後、誰かがすぐにすべてを理解しなかったかもしれないので、ここで何が起こっているのかを説明します。



$ns_key = $memcache->get("foo_namespace_key");







ここではすべてが簡単です。キー " foo_namespace_key "によってキャッシュから名前空間キーを取得します(これは名前空間名と呼ぶことができます)。



if($ns_key===false) $memcache->set("foo_namespace_key", rand(1, 10000));







これはネームスペースの初期化です(私の場合、初期値として0を使用しました)。 名前空間は整数値で初期化する必要があります。 なんで? 少し後で調べてください。



$my_key = "foo_".$ns_key."_12345";

$my_val = $memcache->get($my_key);








これは、ネームスペースの使用例です。 つまり キー「 foo_namespace_key 」を使用してキャッシュから受け取った値、データを保存するためのキーと結合(「埋め込み」)し、このキーに必要なデータを保存します。 例:

  1. リストは最初は初期化されていません
  2. 値0を名前空間キャッシュに書き込みます
  3. その結果、 $ my_keyの値は「 foo_0_12345 」になります
  4. このキーのデータを保存します


$memcache->increment("foo_namespace_key");







さて、これは名前空間の無効化です( インクリメント関数は、指定されたキーによって格納された値を1か、2番目のパラメーターとして指定された量だけ増やします)。 したがって、私の例では、キー「 foo_namespace_key 」によってキャッシュに格納される値は1になります。したがって、キー$ my_key = "foo _"。$ Ns_key。 "_ 12345"のキャッシュセルは空になります。 「 foo_1_12345 」、および古いデータはキー「 foo_0_12345 」で保存され、名前空間を介したアクセスではアクセスできなくなります。アクセスされなくなり、最終的にキャッシュからプッシュされます。



私のオブジェクトとバルクサンプリングの場合、このメソッドは次の場合にその場所を見つけます。すべてのバルクサンプリングはObjects名前空間に格納され、単一のオブジェクトはObjectに格納されます。 したがって、1つのオブジェクトを変更または削除する場合、Objects名前空間を無効にし、一括更新または削除する場合、ObjectsとObjectの両方を無効にします。これにより、キャッシュ内のデータを最新に保つことができます。



All Articles