Замена элемента в memcached без изменения срока действия - PullRequest
3 голосов
/ 16 сентября 2009

У меня есть несколько элементов в memcached, срок действия которых истекает через 24 часа после времени создания. Мне нужно обновить эти предметы, сохранив срок действия без изменений.

Как я могу это сделать? По-видимому, функция замены требует параметра срока действия.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2009

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

Способ, которым это обычно выполняется, - через слой сериализации. Записи, записанные в memcached, хранятся в виде самой записи и метки времени. Когда запись десериализуется, проверяется временная метка, и, если срок ее действия истек, прочитанная запись отбрасывается и обрабатывается как ошибка кэша.

[ entry, expiresAt ]

TTL для необработанных записей memcached обычно устанавливается в бесконечность, и записи удаляются только из кэша вручную или с помощью политики LRU .

В memcached FAQ есть раздел на , запрещающий запросы штамповки , касающийся этой техники.

0 голосов
/ 31 июля 2013

Вам необходимо сохранить время кэширования значения вместе с его исходным значением времени ожидания. Вот реализация Python:

class ExpiringCache(BaseCache):
    """A cache that allows you to update values without changing when the
    data will expire. We do this by storing when the value was
    inserted in the cache and decrementing the timeout when we update.

    """
    def get(self, key, *args, **kwargs):
        raw_value = super(ExpiringCache, self).get(key, *args, **kwargs)

        # we get None on a cache miss, but otherwise it's a 3-tuple
        if raw_value is None:
            return None

        value, start_time, timeout = raw_value
        return value

    def set(self, key, value, *args, **kwargs):
        timeout = kwargs.get('timeout')

        raw_value = (value, now(), timeout)
        super(ExpiringCache, self).set(key, raw_value, *args, **kwargs)

    def update(self, key, value, timeout=None):
        """If this value is still in the cache, update it but reduce the
        timeout. If it's not present, just set it.

        """
        raw_value = super(ExpiringCache, self).get(key)

        if raw_value is None:
            self.set(key, value, timeout=timeout)
            return

        original_value, start_time, original_timeout = raw_value

        if not original_timeout:
            # we are caching without a timeout, so just set the new value
            self.set(key, value, timeout=original_timeout)
            return

        elapsed_time = (now() - start_time).total_seconds()
        remaining_timeout = timeout - elapsed_time

        if remaining_timeout > 0:
            self.set(key, value, timeout=remaining_timeout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...