from collections import OrderedDict from threading import Lock class LRUCache: """In-memory LRU cache. Thread-safe via lock.""" def __init__(self, max_size: int = 512): self._cache: OrderedDict = OrderedDict() self._max_size = max_size self._lock = Lock() self.hits = 0 self.misses = 0 def get(self, key: str): with self._lock: if key not in self._cache: self.misses += 1 return None self._cache.move_to_end(key) self.hits += 1 return self._cache[key] def set(self, key: str, value) -> None: with self._lock: if key in self._cache: self._cache.move_to_end(key) else: if len(self._cache) >= self._max_size: self._cache.popitem(last=False) self._cache[key] = value def __len__(self) -> int: return len(self._cache) def stats(self) -> dict: total = self.hits + self.misses rate = round(self.hits / total, 3) if total else 0.0 return {"size": len(self), "hits": self.hits, "misses": self.misses, "hit_rate": rate}