Обновляет ли уже существующий ключ memcached время истечения срока действия? - PullRequest
11 голосов
/ 20 мая 2011

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

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 минуты после последнего набора?

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

Ответы [ 5 ]

7 голосов
/ 20 мая 2011

Хорошо, наш эксперимент экспериментально нашел мой ответ ...

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

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

5 голосов
/ 30 мая 2015

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

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

$memcached = new Memcached();
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memcached->touch('key', 120);
0 голосов
/ 04 апреля 2016

Если ваша цель - просто продлить срок действия, используйте команду 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 - ваш «ключ», для него будет установлено время истечения60 секунд, как в вашем примере, но без необходимости «получить» и заново установить ключ.Что если ваш «ключ» еще не установлен, а «get» не возвращает некоторые данные?

0 голосов
/ 09 июня 2015

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

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

<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n

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

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

Итак, да - будет обновляться время истечения. Кроме того, memcached создает новый элемент со своим собственным ключом / flags / expiration / value и заменяет им старый.

0 голосов
/ 20 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...