File size: 1,309 Bytes
37ae25d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import time
from typing import Any, Dict, Optional


class CacheService:
    def __init__(self, max_size: int = 500):
        self._cache: Dict[str, tuple[Any, float]] = {}
        self.max_size = max_size

    def _prune(self) -> None:
        now = time.time()
        expired = [k for k, (_, expiry) in self._cache.items() if expiry <= now]
        for key in expired:
            self._cache.pop(key, None)
        if len(self._cache) > self.max_size:
            ordered = sorted(self._cache.items(), key=lambda item: item[1][1])
            for key, _ in ordered[: max(0, len(self._cache) - self.max_size)]:
                self._cache.pop(key, None)

    def get(self, key: str) -> Optional[Any]:
        item = self._cache.get(key)
        if not item:
            return None
        value, expiry = item
        if time.time() >= expiry:
            self._cache.pop(key, None)
            return None
        return value

    def set(self, key: str, value: Any, ttl: int = 3600) -> None:
        self._prune()
        self._cache[key] = (value, time.time() + ttl)

    def clear(self) -> None:
        self._cache.clear()

    def get_stats(self) -> dict:
        self._prune()
        return {"size": len(self._cache), "keys": list(self._cache.keys())[:10]}