web-dev-qa-db-ja.com

「User *」で始まるすべてのmemcacheエントリを無効にする方法はありますか?

最近、Userクラス(memcached)に変更を加えました。キャッシュ全体を無効にすることなく、キーがUserで始まるすべてのエントリを無効にできる方法はありますか?

回避策がない場合は?私はすべてを削除したくない。

2
Thomas Bonini

memcached FAQネームスペースによる削除

Memcachedは、名前空間によるワイルドカードの削除や削除をサポートしていませんが(名前空間がないため)、これをシミュレートするために使用できるいくつかのトリックがあります。ただし、me​​mcachedサーバーへの追加の旅行が必要です。

Fooという名前空間を使用するためのPHPの例:

$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");

キャッシュの一部のみをブランケットクリアすることを計画している場合は、有効期限をより短い期間に設定することを検討できます。

3
artlung

Memcachedには名前空間やワイルドカードによる削除/クエリのようなものがないので、このトリックを行うことができます。すべてのキーを名前空間「user_」でキーに保存します。

例えば

$keys = array('user_1', 'user_2', 'user_3');
$memcache->set('user_', $keys);

これで、「user_」で始まるすべてのキーを削除する場合は、最初にキー「user_」を取得します。それにより、削除したいすべてのキーがあります

$all_keys = $memcache->get('user_');
if($all_keys){
    foreach($all_keys as $key){
        $memcache->delete($key);
    }
}
2
Ha Doan Ngoc