from contextlib import contextmanager from typing import Any, Optional from inference.core import logger class BaseCache: """ BaseCache is an abstract base class that defines the interface for a cache. """ def get(self, key: str): """ Gets the value associated with the given key. Args: key (str): The key to retrieve the value. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def set(self, key: str, value: str, expire: float = None): """ Sets a value for a given key with an optional expire time. Args: key (str): The key to store the value. value (str): The value to store. expire (float, optional): The time, in seconds, after which the key will expire. Defaults to None. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def zadd(self, key: str, value: str, score: float, expire: float = None): """ Adds a member with the specified score to the sorted set stored at key. Args: key (str): The key of the sorted set. value (str): The value to add to the sorted set. score (float): The score associated with the value. expire (float, optional): The time, in seconds, after which the key will expire. Defaults to None. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def zrangebyscore( self, key: str, min: Optional[float] = -1, max: Optional[float] = float("inf"), withscores: bool = False, ): """ Retrieves a range of members from a sorted set. Args: key (str): The key of the sorted set. start (int, optional): The starting index of the range. Defaults to -1. stop (int, optional): The ending index of the range. Defaults to float("inf"). withscores (bool, optional): Whether to return the scores along with the values. Defaults to False. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def zremrangebyscore( self, key: str, start: Optional[int] = -1, stop: Optional[int] = float("inf"), ): """ Removes all members in a sorted set within the given scores. Args: key (str): The key of the sorted set. start (int, optional): The minimum score of the range. Defaults to -1. stop (int, optional): The maximum score of the range. Defaults to float("inf"). Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def acquire_lock(self, key: str, expire: float = None) -> Any: raise NotImplementedError() @contextmanager def lock(self, key: str, expire: float = None) -> Any: logger.debug(f"Acquiring lock at cache key: {key}") l = self.acquire_lock(key, expire=expire) try: yield l finally: logger.debug(f"Releasing lock at cache key: {key}") l.release() def set_numpy(self, key: str, value: Any, expire: float = None): """ Caches a numpy array. Args: key (str): The key to store the value. value (Any): The value to store. expire (float, optional): The time, in seconds, after which the key will expire. Defaults to None. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError() def get_numpy(self, key: str) -> Any: """ Retrieves a numpy array from the cache. Args: key (str): The key of the value to retrieve. Raises: NotImplementedError: This method must be implemented by subclasses. """ raise NotImplementedError()