Sobes.tech
Back to questions
Middle
3

Как инвалидировать кэш, чтобы он не разрастался бесконечно? Как добавить TTL (time-to-live)?

Companies where asked
Лига Цифровой ЭкономикиЛига Цифровой Экономики

Answer from AI

sobes.tech AI

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

Как добавить TTL (time-to-live):

  • При сохранении значения в кэш сохраняйте вместе с ним время истечения срока действия (например, текущее время + TTL).
  • При получении значения проверяйте, не истёк ли срок действия. Если истёк — удаляйте элемент и возвращайте отсутствие значения.

Пример простого кэша с TTL на Python:

import time

class TTLCache:
    def __init__(self, ttl_seconds):
        self.ttl = ttl_seconds
        self.store = {}

    def set(self, key, value):
        expire_at = time.time() + self.ttl
        self.store[key] = (value, expire_at)

    def get(self, key):
        item = self.store.get(key)
        if not item:
            return None
        value, expire_at = item
        if time.time() > expire_at:
            del self.store[key]
            return None
        return value

    def cleanup(self):
        now = time.time()
        keys_to_delete = [k for k, (_, exp) in self.store.items() if exp <= now]
        for k in keys_to_delete:
            del self.store[k]

Как ограничить размер кэша:

  • Используйте структуры данных с ограничением размера, например, LRU-кэш (Least Recently Used).
  • При достижении максимального размера удаляйте наименее используемые элементы.

В Python для этого можно использовать functools.lru_cache или сторонние библиотеки, например cachetools.