Memcache и подстановочные знаки
Мне просто интересно, есть ли способ очистить memcache с помощью подстановочных знаков для значений ключа.
Так сказать, у меня есть кеш с ключом "1234 ~ foo" и еще один "1234 ~ foo ~ bar".
Можно ли очистить кеш, используя что-то вроде clear ( "1234 *" ) и очистить ли он оба сверху?
Надеюсь, это имеет смысл.
Спасибо.
Ответы
Ответ 1
Нет, нет прямого способа сделать это. FAQ разрешает это и предоставляет своего рода обходное решение:
Удаление по пространству имен
В то время как memcached не поддерживает какой-либо тип удаления или удаления подстановочных символов в пространстве имен (поскольку нет пространств имен), есть некоторые трюки, которые можно использовать для имитации этого. Однако они требуют дополнительных поездок на сервер memcached.
Пример, в PHP, для использования пространства имен, называемого foo:
$ns_key = $memcache->get("foo_namespace_key");
// if not set, initialize it
if($ns_key===false) {
$ns_key=rand(1, 10000);
$memcache->set("foo_namespace_key", $ns_key);
}
// 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");
Ответ 2
Замечание относительно решения пространства имен Эриком Петроледже:
Помните, что вы не знаете, когда memcached вытеснит вам ключ пространства имен. Memcache может вытеснить ваш ключ пространства имен, а затем, когда вы пытаетесь установить новый ключ, у него есть вероятность от 1 до 10000, что он выберет тот же самый индексный ключ, что означает, что вы получите "грязные" результаты. Это маловероятно, но в нижней строке это не безопасно.
То же самое касается решения Poul Vernon.
Безопасным решением будет использование надежного хранилища (например, диска) для ключа "указателя ключа" / "пространства имен".
Ответ 3
Как насчет этой функции в php:
function deleteKeysByIndex($search) {
$m = new Memcached();
$m->addServer('localhost', 11211);
$keys = $m->getAllKeys();
foreach ($keys as $index => $key) {
if (strpos($key,$search) !== false) {
$m->delete($key);
} else {
unset($keys[$index]);
}
}
// returns an array of keys which were deleted
return $keys;
}
Удаляет ключи, начинающиеся с префикса $, и возвращает список всех удаленных ключей. Я запускал это на 30 000 + ключей только сейчас на общем сервере, и это было довольно быстро - возможно, менее одной секунды.
Ответ 4
Создайте запись memcache для "1234" и внутри нее сохраните массив связанных ключей. В вашей процедуре удаления прочитайте и повторите эти ключи для удаления.