Как я могу получить время истечения для конкретного элемента в memcached - PullRequest
8 голосов
/ 01 апреля 2010

Во время выполнения я хочу получить информацию об истечении срока действия некоторых элементов в memcached. Я не нашел никакого связанного интерфейса на memcached. Я могу это сделать? что-то вроде: mc.get_expire_time ( 'ключ')

Спасибо

Ответы [ 4 ]

12 голосов
/ 02 апреля 2012

Python memcache API не предоставляет таких функций. Однако вы можете использовать telnet в memcached для вывода всех ключей и времени истечения.

> telnet localhost 11211

stats items показывает плиты, содержащие ваши данные.

stats items
STAT items:12:number 1108
...
END

Затем используйте stats cachedump slab_id count, чтобы увидеть ключ и время истечения. Установите значение 0, чтобы получить все ключи.

stats cachedump 12 1
ITEM abc [100 b; 1528336485 s]
END
6 голосов
/ 23 января 2014

Досадно, что эта информация представляется только в статистике плиты. Начните с этого:

[$]> (sleep 1; echo "stats cachedump 1 0"; sleep 1; echo "quit";) | telnet localhost 11211 | grep 'my_key'

и увеличивайте плиту (первое число после 'cachedump'), пока не найдете соответствующую плиту. Как только вы получите результат, он будет иметь вид

ITEM my_key [2 b; 1389767076 s]

Последнее число (1389767076 в данном случае) - это unixtime , когда срок действия ключа истечет. Вы можете преобразовать это число в нечто более понятное человеку с помощью Python time.localtime() или «на лету», используя Wolfram Alpha .

5 голосов
/ 01 апреля 2010

В соответствии с протоколом memcache (оба текст и бинарный ) ни get, ни gets не возвращают время истечения. И нет другого способа получить его. Но, конечно, вы можете упаковать время истечения в значение вместе с тем, что вы храните сейчас, когда вы set / add, чтобы сделать его доступным для извлечения.

0 голосов
/ 22 марта 2019

Если вы не критично относитесь к точности, я подумал о создании вашего собственного клиента, который общается по двоичному протоколу, и о сохранении времени истечения в поле «Флаг» ExtraLength. https://github.com/memcached/memcached/wiki/BinaryProtocolRevamped#set-add-replace

Здесь, в дополнительных 8 байтах, последние четыре хранят TTL, вы можете использовать первые 4 для хранения времени истечения. И когда вы получаете его обратно, он все еще находится в этом поле флага.

Обратная сторона этого:

  • Написание собственного клиента.
  • Вы должны основываться на местных часах, чтобы рассчитать время истечения
  • У вас есть только 4 байта для хранения времени истечения в целых числах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...