Cache durch Präfix in apc / memcache / eaccelerator löschen
-
24-10-2019 - |
Frage
Nehmen wir an, ich habe diese Variablen in APC, Memcached und EacCelerator gespeichert:
article_1_0
article_1_1
article_3_2
article_3_3
article_2_4
Wie kann ich alle zwischengespeicherten Variablen löschen, die mit beginnen article_3_
(Sie können bis zu 10000 erreichen)?
Gibt es eine Möglichkeit, die zwischengespeicherten Variablen aufzulisten?
Lösung
Die langsame Lösung
Für APC:
$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
apc_delete($entry_name);
}
Für EacCelerator:
foreach(eaccelerator_list_keys() as $name => $infos) {
if (preg_match('#^article_3_#', $name)) {
eaccelerator_rm($name);
}
}
Schauen Sie sich für Memcached an @Riks Antwort
Die richtige Lösung
Die allgemeine Lösung für die gleichzeitige Auslassung mehrerer Schlüssel besteht darin, sie zu namensspace. Um sie abzulaufen, müssen Sie nur den Namespace ändern:
Angenommen, Sie haben eine Gruppe von Schlüssel "article_3_1", "article_3_2", .... Sie können sie wie folgt speichern:
$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);
Holen sie so:
$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");
Und leugnen sie alle, indem sie einfach den Namespace erhöhen:
apc_inc('article_3_namespace');
Andere Tipps
Obwohl die Dokumente sagen, dass Apciterator in APC> = 3.1.1 verfügbar ist, bin ich auf mehreren Systemen, die behaupten, APC 3.1.9 zu haben. Es gibt jedoch keinen Apciterator vorhanden. Wenn Sie keinen Apciterator zur Verfügung haben, geben Sie so etwas wie diesen einen Wirbel:
$aCacheInfo = apc_cache_info('user');
foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
apc_delete($_aCacheInfo['info']);
In diesem Beispiel prüfen wir nach einem Präfix im Schlüssel, aber Sie könnten Preg_match ET verwenden. Al und erreichen etwas näher an dem, was Apciterator bietet.
Es gibt Eine Möglichkeit, alle Schlüssel aus Memcache abzurufen Aber es ist sehr teuer.
Wenn es Möglichkeiten gibt, Alternativen für Memcached zu verwenden, scache Unterstützt strukturierte Schlüsselspazitäten. Damit können Sie Daten auf verschachtelte Pfade speichern:
scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);
und zerstören Sie schließlich Daten, indem Sie den übergeordneten Knoten löschen
scache_shunset($conn, 'article/3');
Es gibt einen Apciterator, der Ihnen hilft, die Schlüssel in APC zu durchsuchen. Sofortieren Sie den Apkiterator.
Apciterator :: Valid () bedeutet, dass noch Schlüsse zum ITROUGE aufgenommen werden. Apciterator :: Key () gibt Ihnen den APC -Schlüssel zurück. Apciterator :: Next () verschiebt die Iteratorposition in das nächste Element.
// 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();
}
Für Memcache können Sie verwenden Memcached und verwenden Getallkeys Methode
// 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);
}
}