from __future__ import annotations import time from collections import OrderedDict class AliyunSmsDeduplicator: def __init__(self, max_size: int = 10000, ttl: int = 86400): self._cache: OrderedDict[str, float] = OrderedDict() self._max_size = max_size self._ttl = ttl @property def ttl_seconds(self) -> int: return self._ttl @property def max_entries(self) -> int: return self._max_size def is_duplicate(self, key: str) -> bool: if not key: return False self._gc() return key in self._cache def mark_seen(self, key: str): if not key: return self._gc() self._cache[key] = time.time() self._evict_oldest() def reset(self): self._cache.clear() def _gc(self): now = time.time() expired = [k for k, ts in self._cache.items() if now - ts > self._ttl] for k in expired: del self._cache[k] def _evict_oldest(self): while len(self._cache) > self._max_size: self._cache.popitem(last=False)