Контекст: Приложение предоставляет веб-панель, показывающую ежедневные/еженедельные показатели, и пользователи могут часто обновлять данные. Данные не обязательно должны поступать в режиме реального времени (допускается устаревание в 1–2 минуты).
Вот моя реализация кэша только в памяти:
Код: Выделить всё
"""Simple in-memory cache with TTL."""
import time
from dataclasses import dataclass
from typing import Any
@dataclass
class CacheEntry:
"""Cache entry with expiration."""
value: Any
expires_at: float
class InMemoryCache:
"""Simple in-memory cache with TTL expiration."""
def __init__(self, ttl_seconds: int = 60) -> None:
self.ttl_seconds = ttl_seconds
self._cache: dict[str, CacheEntry] = {}
def get(self, key: str) -> Any | None:
"""Get value from cache if not expired."""
entry = self._cache.get(key)
if entry is None:
return None
if time.time() > entry.expires_at:
del self._cache[key]
return None
return entry.value
def set(self, key: str, value: Any) -> None:
"""Set value in cache with TTL."""
expires_at = time.time() + self.ttl_seconds
self._cache[key] = CacheEntry(value=value, expires_at=expires_at)
def clear(self) -> None:
"""Clear all cache entries."""
self._cache.clear()
- Не слишком ли упрощенно использование dict с ручной проверкой TTL? Должен ли я использовать инструменты кэширования или аналогичные?
- Должен ли я добавить кеш L-2 на уровне каталога файлов?
- Потокобезопасность — приложение FastAPI является асинхронным, но операции с кэшем не блокируются.
- Управление памятью — нет ограничения максимального размера, только вытеснение на основе TTL.
Текущее поведение:
- Попадания в кэш сокращают время запроса с ~50 мс до
Подробнее здесь: https://stackoverflow.com/questions/798 ... y-tracking
Мобильная версия