1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| from datetime import datetime, timedelta from typing import Optional, Callable, Any import functools import json
class TTLCache: """基于时间过期的高级缓存""" def __init__(self, ttl: int = 60): """ Args: ttl: 缓存过期时间(秒) """ self._store: dict[str, tuple[Any, datetime]] = {} self._ttl = ttl def get(self, key: str) -> Optional[Any]: """获取缓存值""" if key in self._store: value, expire = self._store[key] if datetime.now() < expire: return value del self._store[key] return None def set(self, key: str, value: Any) -> None: """设置缓存值""" expire = datetime.now() + timedelta(seconds=self._ttl) self._store[key] = (value, expire) def delete(self, key: str) -> None: """删除缓存""" if key in self._store: del self._store[key] def clear(self) -> None: """清空所有缓存""" self._store.clear() def __call__(self, fn: Callable) -> Callable: """作为装饰器使用""" @functools.wraps(fn) def wrapper(*args, **kwargs): key = json.dumps({ "args": str(args), "kwargs": sorted(kwargs.items()) }) cached = self.get(key) if cached is not None: return f"[HIT] {cached}" result = fn(*args, **kwargs) self.set(key, result) return f"[MISS] {result}" return wrapper
|