Подтвердить что ты не робот

Memcache и подстановочные знаки

Мне просто интересно, есть ли способ очистить memcache с помощью подстановочных знаков для значений ключа.

Так сказать, у меня есть кеш с ключом "1234 ~ foo" и еще один "1234 ~ foo ~ bar".

Можно ли очистить кеш, используя что-то вроде clear ( "1234 *" ) и очистить ли он оба сверху?

Надеюсь, это имеет смысл.

Спасибо.

4b9b3361

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