EDIT2: Уточнение: код УЖЕ обновил кеш при пропущенной логике. То, что я пытаюсь сделать, - уменьшить количество пропущенных кеш-запросов.Обновление кэш-памяти Redis
Я использую Redis в качестве кеша для API. Идея состоит в том, что когда API получает вызов, он сначала проверяет кеш, и если данные не находятся в кеше, API будет извлекать его и кэшировать его впоследствии в следующий раз.
На данный момент конфигурация выглядит следующим образом:
maxmemory 50mb
maxmemory-policy allkeys-lru
То есть, использовать в большинстве 50Мб памяти, продолжайте пробовать ключи там и когда память заполнена начала, удалив наименее недавно использованные ключи (LRU) ,
Теперь я хочу ввести вторую категорию ключей. Для этой второй категории я собираюсь установить определенное время истечения срока действия. Теперь я хотел бы создать такой механизм, чтобы, когда эти ключи истекают, этот механизм запускает и обновляет их (и устанавливает новый срок действия).
Как это сделать?
EDIT: Некоторые успехи. Оказывается, у Redis есть система обмена сообщениями/суб-сообщениями, которая, в частности, может отправлять сообщения на событие. Один из них истекающих ключей, которые могут быть включены в качестве такового:
notify-keyspace-events Ex
Я нашел этот код может описывает блокирующий python process subscribing to Redis' messaging system. Он легко может быть изменен для обнаружения ключей, истекающих и выполняющих вызов API, когда истекает срок действия ключа, а затем API обновит ключ.
def work(self, item):
requests.get('http://apiurl/?q={param}'.format(param=item['data']))
Так что это делает именно то, о чем я просил.
Часто это чувствует себя слишком опасно и выходит из-под контроля. Я могу представить себе кучу различных ситуаций, при которых это очень быстро закончится.
Итак, что лучше?
Уведомления о ключах, такие как Redis PubSub, не гарантируются, например, если ваш рабочий отключен, вам не будут доставлены сообщения. Я по-прежнему рекомендую включить в свой код логику обновления в пропуске. –
Как я уже сказал, в моем коде уже есть логика refresh-catche-on-miss, и я пытаюсь это сделать, избегая промахов. Кроме того, это кеш: если уведомление потеряно, ну, мы не обновим этот ключ, и он будет обновлен, когда он будет пропущен. Но, надеюсь, мы можем избежать этого. – oneloop