Обновляет ли установка ключа memcached, который уже существует, время истечения срока действия?

#memcached

#сохраненный в памяти #memcached

Вопрос:

Допустим, у меня есть следующий код:

 Memcached->set('key', 'value', 60); (expire in one minute)

while (1) {
    sleep 1 second;
    data = Memcached->get('key');
    // update data
    Memcached->set('key', data, 60);
}
  

После 60 итераций цикла истечет ли срок действия ключа, и при его чтении я получу NULL? Или непрерывная настройка будет продолжать увеличивать время истечения каждый раз на 1 минуту после последнего установленного?

В документации упоминается об этом, и я тестировал это в разных контекстах, и я почти уверен, что получил разные результаты.

Комментарии:

1. Из этого вопроса я предполагаю «Да». Но это не является авторитетным, и я не использую memcached. Удачного кодирования.

Ответ №1:

Хорошо, в конце концов, я нашел свой ответ путем экспериментов…

Оказывается, «Set» действительно продлевает срок действия, это в основном то же самое, что удалить элемент и установить его снова с новым сроком действия.

Однако приращение не продлевает срок действия. Если вы увеличиваете ключ, он сохраняет исходное время истечения срока действия, которое было, когда вы устанавливали его в первую очередь.

Комментарии:

1. У вас есть источник для вашего ответа?

2. Было бы лучше, если бы вы прикрепили обновленный исходный код.

Ответ №2:

Если вы просто хотите продлить время истечения срока действия для определенного ключа вместо того, чтобы каждый раз по существу сбрасывать данные, вы можете просто использовать Memcached::touch

С оговоркой, что у вас должен быть включен двоичный протокол в соответствии с комментарием на странице выше.

 $memcached = new Memcached();
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memcached->touch('key', 120);
  

Комментарии:

1. Протокол ascii также поддерживает touch с более свежими версиями php -memcached и memcached. Вы больше не ограничены только двоичным протоколом.

Ответ №3:

Set вообще не заботится о том, что могло там быть, и не может предположить, что это даже пришло из того же приложения.

Что все вы тестировали и какие результаты вы получили? Memcached никогда не гарантирует возврат значения, поэтому, если вы заметили, что оно пропало, вполне возможно создать тест, который потеряет его независимо от истечения срока действия.

Комментарии:

1. … предполагая, что значение удаляется только по истечении срока действия (представьте, что это строго соблюдается ради вопроса) и всегда возвращается в противном случае…

2. Я не уверен, что понимаю… Вы говорите, что срок действия продлевается для этого набора?

3. Я говорю, что это совершенно другой элемент. Нет никакой связи между тем, что там было, и тем, что вы установили. Это не продлевает его, это создает что-то совершенно новое.

Ответ №4:

Лучшим источником документации является описание протокола Memcached

 First, the client sends a command line which looks like this:

<command name> <key> <flags> <exptime> <bytes> [noreply]rn

- <command name> is "set", "add", "replace", "append" or "prepend"
  

Как вы можете видеть, в каждой из приведенных выше команд есть exptime поле, которое является обязательным.

Итак, да — это обновит время истечения срока действия. Более того, memcached создает новый элемент со своим собственным ключом / флагами / сроком действия / значением и заменяет им старый.

Ответ №5:

Если ваша цель — просто продлить время истечения срока действия, используйте команду touch , которая была создана для установки нового времени истечения срока действия для ключа.

Смотрите https://manned.org/memctouch или http://docs.libmemcached.org/bin/memtouch.html

Пакет Debian: libmemcached-tools

Из командной строки: man memctouch

другие дистрибутивы используют «memtouch» в качестве названия инструмента командной строки

1 Ссылка из протокола memcached в качестве ссылки вручную:https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L318

Пример:

 memctouch --servers=localhost --expire=60 $key
  

Где $key — это ваш ‘key’, это установит время истечения на 60 секунд, как в вашем примере, но без необходимости выполнять «get» И повторно устанавливать ключ. Что, если ваш ‘key’ еще не установлен и ваш ‘get’ не возвращает некоторые данные?