2

アプリケーションにmemcachedレイヤーを追加し始めています。ここまでは順調ですね。

しかし、データの関連性を維持するために、誰かがファイルをサイトにアップロードするときに、一度に大量のキーを無効化/削除する必要があることにすぐに気付きました。

私はいくつかの読書をしました、そしてこの問題を回避する最も一般的な方法は各キーにバージョン番号を設定することであるようです、そしてユーザーがアップロードするときにキーを削除するのではなく(非常に多くの順列があるかもしれないので)あなたはバージョン番号を増やします、次にデータにアクセスしたときにキャッシュミスを引き起こします。

私はこれをコード化するためにどこから始めればよいのか分かりませんし、とにかく完全に頭を悩ませているかどうかはよくわかりません。

私のコードは現在次のようになっています:-

$memcache = new Memcache;


$memcache->connect('localhost', 11211) or die ("Could not connect");


$key = md5("songsearch_$textSearch.$rangeSearch");

上記のキー変数の2つの変数は、大量のJSONを取得するgetリクエストから取得されます。(製品カタログを考えてください)。

これらの変数は、これらの変数に応じて動的にまとめられるクエリ自体も決定します。同じスクリプトから何百ものキーを生成できたとしても、最終的には、これらすべてが個々のクエリに固有のキーを提供します。

上記が明確であることを願っています。そうでない場合は、私の質問に答えるのに役立つように、ポイントを明確にするように依頼してください。

明らかに後で、キャッシュを設定するために、私はこれを使用しています:-

$memcache->set($key, $output, MEMCACHE_COMPRESSED, time() + 24*60*60*365);

JSONをエンコードする直前。

だから私の質問は本当に...ユーザーがファイルをアップロードした場合にこのスクリプトによって生成された多くのキーを無効にできるように、これに何らかの形式のインクリメンタルバージョンを追加するにはどうすればよいですか?

少なくとも私を正しい方向に導いてくれた人に感謝します。

4

2 に答える 2

10

あなたは明らかに正しい方向に進んでいます。不足しているのは、キーを作成する前に取得するバージョン番号をmemcacheに保存することだけです。

$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");

// fetch the current version number
$version = $memcache->get('version_number');

// and add the version to the key
$key = md5("songsearch_$textSearch.$rangeSearch") . 'v' . $version;

したがって、誰かが新しいコンテンツをアップロードするたびに、バージョン番号をインクリメントするだけです。

$memcache->increment('version_number');

これにより、既存のすべてのクエリが自動的に無効なエントリに遭遇します。

アクセスを簡素化するために、これを新しいMemcacheハンドラークラス(テストされていない)でラップすることをお勧めします。

class VersionedMemcache extends Memcache {

    const VERSION_KEY = 'version_number';

    private $version = 1;

    public function __construct() {
        $version = parent :: get(self :: VERSION_KEY);
        if ($version === false) {
            $version = 1;
            $this->set(self :: VERSION_KEY, $version);
        }
        $this->version = $version;
    }

    public function get($key, &$flags = null) {
        $key = $key . '_v' . $this->version;
        return parent :: get($key, $flags);
    }

    public function incVersion() {
        $this->version = $this->increment(self :: VERSION_KEY);
        return $this->version;
    }

}

したがって、スクリプトを次のように修正するだけです。

$memcache = new VersionedMemcache();

$memcache->connect('localhost', 11211) or die ("Could not connect");

$key = md5("songsearch_$textSearch.$rangeSearch");

// this will now result in a fetch on 'ab23...232afe_v1' instead of 'ab23...232afe'
$result = $memcache->get($key);

// when an upload happens, simply
$memcache->incVersion();
于 2011-12-08T23:58:02.503 に答える
0

配列を保存して、キーの地獄を回避することができます。

于 2011-12-08T23:08:02.307 に答える