diff --git a/app/chain/recommend.py b/app/chain/recommend.py index e42b3c3c..e9ff4e54 100644 --- a/app/chain/recommend.py +++ b/app/chain/recommend.py @@ -156,7 +156,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): logger.debug(f"Failed to write cache file {cache_path} for URL {url}: {e}") @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def tmdb_movies(self, sort_by: str = "popularity.desc", with_genres: str = "", with_original_language: str = "", page: int = 1) -> Any: """ @@ -170,7 +170,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [movie.to_dict() for movie in movies] if movies else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def tmdb_tvs(self, sort_by: str = "popularity.desc", with_genres: str = "", with_original_language: str = "zh|en|ja|ko", page: int = 1) -> Any: """ @@ -184,7 +184,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [tv.to_dict() for tv in tvs] if tvs else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def tmdb_trending(self, page: int = 1) -> Any: """ TMDB流行趋势 @@ -193,7 +193,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [info.to_dict() for info in infos] if infos else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def bangumi_calendar(self, page: int = 1, count: int = 30) -> Any: """ Bangumi每日放送 @@ -202,7 +202,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in medias[(page - 1) * count: page * count]] if medias else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_movie_showing(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣正在热映 @@ -211,7 +211,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in movies] if movies else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_movies(self, sort: str = "R", tags: str = "", page: int = 1, count: int = 30) -> Any: """ 豆瓣最新电影 @@ -221,7 +221,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in movies] if movies else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_tvs(self, sort: str = "R", tags: str = "", page: int = 1, count: int = 30) -> Any: """ 豆瓣最新电视剧 @@ -231,7 +231,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in tvs] if tvs else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_movie_top250(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣电影TOP250 @@ -240,7 +240,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in movies] if movies else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_tv_weekly_chinese(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣国产剧集榜 @@ -249,7 +249,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in tvs] if tvs else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_tv_weekly_global(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣全球剧集榜 @@ -258,7 +258,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in tvs] if tvs else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_tv_animation(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣热门动漫 @@ -267,7 +267,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in tvs] if tvs else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_movie_hot(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣热门电影 @@ -276,7 +276,7 @@ class RecommendChain(ChainBase, metaclass=Singleton): return [media.to_dict() for media in movies] if movies else [] @log_execution_time(logger=logger) - @cached(maxsize=16, ttl=recommend_ttl, region=recommend_cache_region) + @cached(ttl=recommend_ttl, region=recommend_cache_region) def douban_tv_hot(self, page: int = 1, count: int = 30) -> Any: """ 豆瓣热门电视剧 diff --git a/app/core/cache.py b/app/core/cache.py index 5009ebe3..2b187163 100644 --- a/app/core/cache.py +++ b/app/core/cache.py @@ -70,7 +70,15 @@ class CacheBackend(ABC): class CacheToolsBackend(CacheBackend): """ - 基于 `cachetools.TTLCache` 实现的缓存后端,支持动态 TTL 和 Maxsize + 基于 `cachetools.TTLCache` 实现的缓存后端 + + 特性: + - 支持动态设置缓存的 TTL(Time To Live,存活时间)和最大条目数(Maxsize) + - 缓存实例按区域(region)划分,不同 region 拥有独立的缓存实例 + - 同一 region 共享相同的 TTL 和 Maxsize,设置时只能作用于整个 region + + 限制: + - 不支持按 `key` 独立隔离 TTL 和 Maxsize,仅支持作用于 region 级别 """ def __init__(self, maxsize: int = 1000, ttl: int = 1800):