2009-09-13 1 views

ответ

41

Вы можете установить срок действия ключа на дату, указав временную метку Unix вместо количества дней. Эта дата может быть более 30 дней в будущем:

Время истечения срока указывается в целых числах без знака. Их можно установить от 0, что означает «никогда не истекает», до 30 дней (60 * 60 * 24 * 30). В любое время более 30 дней интерпретируется как дата отметки времени unix. Если вы хотите закончить объект 1 января следующего года, так вы это сделаете.

https://github.com/memcached/memcached/wiki/Programming#expiration

Но as you say, если вы устанавливаете срок действия ключа на количество времени, а не даты, максимум 2,592,000 секунд, или 30 дней.

+2

OMG. У нас было множество случаев в Rails of: expires_in => 1.month. Перейдите на 1.month.from_now, чтобы использовать дату. –

+2

Ссылка, на которую ссылается, мертва :( – marcgg

+1

@marcgg: aha да, хорошо замечен, спасибо. Исправлено. –

15

Если вы не предоставите истечения срока действия кэша и получает полный то старые ключевые значения истек первый:

памяти также отозваны, когда пришло время, чтобы сохранить новый элемент. Если нет свободных фрагментов и свободных страниц в соответствующем классе slab, memcached будет смотреть на конец LRU для элемента, который будет «возвращаться». Он будет искать последние несколько элементов в хвосте для того, который уже истек, и, следовательно, свободен для повторного использования. Если он не может найти истекший элемент, он будет «выселять» тот, который еще не истек. Затем это отмечено в нескольких статистических счетчиков

https://github.com/memcached/memcached/wiki/UserInternals#when-are-items-evicted

+2

Вы на 100% уверены в этом? –

+1

Да, @DeeJay ', просто нашел эту статью: http://code.google.com/p/memcached/wiki/NewUserInternals – Brett

+2

'Память также исправлена, когда пришло время для хранения нового элемента. Если нет свободных фрагментов и свободных страниц в соответствующем классе slab, memcached будет смотреть на конец LRU для элемента, который будет «возвращаться». Он будет искать последние несколько элементов в хвосте для того, который уже истек, и, следовательно, свободен для повторного использования. Если он не может найти истекший элемент, он будет «выселять» тот, который еще не истек. Это затем отмечается в нескольких статистических счетчиках. « – Brett

0

ОК, я обнаружил, что число секунд, не может превышать 2592000 (30 дней). Таким образом, максимальное время истечения составляет 30 дней.

+11

Нет, это не так. Количество секунд в форме * длительности * не может превышать 30 дней. Вы можете указать срок действия три месяца, если вы хотите как абсолютное время. Вы также можете указать 0, чтобы не было срока действия. – Dustin

+2

Я также обнаружил, что если вы предоставляете слишком длительное время истечения срока действия, значение не сохраняется вообще. – Datageek

+1

Я обнаружил, что 30 дней не работает (не пишет кеш), но 29 дней работает. – Zubin

9

Нет никаких ограничений. Ограничение на 30 дней - если вы укажете количество секунд, в течение которых оно должно оставаться там, но если вы укажете временную метку, на машине будет только максимальная длина или значение int, которое может быть предел.

->set('key', 'value', time() + 24*60*60*365) сделает ключевое пребывание там в течение года, например, но если кеш заполняется или перезапускается между ними, это значение можно удалить.

0

На Laravel config.session.lifetime установки, что, если установлено, чтобы быть эквивалентом 30days выше, будет рассматриваться как метку времени (это даст ошибку из token mismatch каждый раз при условии, что memcached используется).

Чтобы ответить, истечение срока действия memcached можно установить в любое время. (По умолчанию параметр Laravel (в версии 5.0) установит вам отметку с истекшим сроком действия). Если вы его не установили, будет использоваться defualt.

0

Похоже, что некоторые ответы больше не действительны.

Я обнаружил, что ключ не устанавливается вообще, когда TTL слишком высок. Например, 2992553564.

Протестировано со следующим кодом PHP:

var_dump($memcached->set($id, "hello", 2992553564); // true 
var_dump($memcached->get($id));      // empty! 

var_dump($memcached->set($id, "hello", 500); // true 
var_dump($memcached->get($id));    // "hello" 

версия memcached 1.4.14-0ubuntu9.

Смежные вопросы