memcache и подстановочные знаки
Мне просто интересно, есть ли способ очистить memcache, используя подстановочные знаки для значений ключей.
Допустим, у меня есть кэш с ключом "1234~foo" и другим "1234~foo~bar".
Можно ли как-то сказать очистить кеш, используя что-то вроде clear("1234*") и сделать так, чтобы оба были сверху?
Я надеюсь, что в этом есть смысл.
Благодарю.
4 ответа
Нет, прямого простого способа сделать это не существует. 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");
Примечание относительно решения пространства имен Эрика Петроэля:
Помните, что вы не знаете, когда memcached выселит ваш ключ пространства имен. Memcache может высвободить ваш ключ пространства имен, а затем при попытке установить новый ключ имеет вероятность от 1 до 10000, что он выберет тот же индексный ключ - что означает, что вы получите "грязные" результаты. Это маловероятно, но суть в том, что это небезопасно.
Та же проблема с решением Пола Вернона.
Безопасным решением будет использование надежного хранилища (например, диска) для "ключа указателя"/"ключа пространства имен".
Как насчет этой функции в 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;
}
Удаляет ключи, начинающиеся с префикса $, и возвращает список всех удаленных ключей. Я только что запустил это на более чем 30000 клавиш на общем сервере, и это было довольно быстро - вероятно, менее чем за одну секунду.
Создайте запись memcache для "1234" и сохраните в ней массив связанных ключей. В вашей процедуре удаления прочитайте и переберите те ключи для удаления.