#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’ не возвращает некоторые данные?