4

これらの変数がapc、memcached、eacceleratorに保存されていると仮定しましょう。

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

article_3_(最大10000に達する可能性がある)で始まるすべてのキャッシュ変数を削除するにはどうすればよいですか?

キャッシュされた変数を一覧表示する方法はありますか?

4

5 に答える 5

11

遅い解決策

APCの場合:

$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
    apc_delete($entry_name);
}

加速器の場合:

foreach(eaccelerator_list_keys() as $name => $infos) {
    if (preg_match('#^article_3_#', $name)) {
        eaccelerator_rm($name);
    }
}

memcachedについては、@rikの回答をご覧ください

適切な解決策

複数のキーを一度に期限切れにするための一般的な解決策は、それらに名前空間を付けることです。それらを期限切れにするには、名前空間を変更する必要があります。

キーのグループ「article_3_1」、「article_3_2」、...があるとします。これらは次のように保存できます。

$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);

このようにそれらをフェッチします:

$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");

そして、名前空間をインクリメントするだけで、それらすべてを期限切れにします。

apc_inc('article_3_namespace');
于 2011-01-24T17:47:17.940 に答える
2

ドキュメントには、APCIteratorはapc> = 3.1.1で利用可能であると記載されていますが、私はapc 3.1.9を使用していると主張するいくつかのシステムを使用していますが、APCIteratorは存在しません。APCIteratorを自由に使用できない場合は、次のようなものを回転させてください。

$aCacheInfo = apc_cache_info('user');

foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
    if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
        apc_delete($_aCacheInfo['info']);

この例では、キーのプレフィックスをチェックしていますが、preg_matchetを使用できます。そして、APCIteratorが提供するものに近い何かを達成します。

于 2011-11-07T09:27:13.770 に答える
1

memcacheからすべてのキーを取得する方法はありますが、非常にコストがかかります。

于 2011-01-24T17:47:06.570 に答える
1

memcachedの代替を使用する可能性がある場合、scacheは構造化キースペースをサポートします。これを使用すると、ネストされたパスにデータを保存できます。

scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);

最終的に親ノードを削除してデータを破棄します

scache_shunset($conn, 'article/3');
于 2011-09-14T18:45:24.770 に答える
1

APCのキーを検索するのに役立つAPCIteratorがあります。APCIteratorをインスタンス化します。

APCIterator :: valid()は、トラフを反復処理するためのキーがまだあることを意味します。APCIterator :: key()はapcキーを返します。APCIterator :: next()は、イテレータの位置を次の項目に移動します。

// APC
$iterator = new APCIterator('user', '/^article_3_/');

while($iterator->valid()) {
     apc_delete($iterator->key());
     // You can view the info for this APC cache value and so on by using 
     // $iterator->current() which is array
     $iterator->next();
}

memcacheの場合、Memcachedを使用してgetAllKeysメソッドを使用できます

// Memcached 
$m = new Memcached();
$m->addServer('mem1.domain.com', 11211);

$items = $m->getAllKeys();

foreach($items as $item) {
    if(preg_match('#^article_3_#', $item)) {
        $m->delete($item);
    }
}  
于 2014-12-02T11:34:51.777 に答える