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" и сохраните в ней массив связанных ключей. В вашей процедуре удаления прочитайте и переберите те ключи для удаления.

Другие вопросы по тегам