From 0a86b72110289fd1abf723a8148823fe17f03989 Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:03:41 +0800 Subject: [PATCH] feat(redis): add encoding for keys and optimize deletion --- app/core/cache.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/core/cache.py b/app/core/cache.py index 1a96c545..482e7d0a 100644 --- a/app/core/cache.py +++ b/app/core/cache.py @@ -2,6 +2,7 @@ import inspect from abc import ABC, abstractmethod from functools import wraps from typing import Any, Dict, Optional +from urllib.parse import quote import redis from cachetools import TTLCache @@ -213,7 +214,7 @@ class RedisBackend(CacheBackend): """ # 使用 region 作为缓存键的一部分 region = self.get_region(region) - return f"region:{region}:key:{key}" + return quote(f"region:{region}:key:{key}") def set(self, key: str, value: Any, ttl: int = None, region: str = DEFAULT_CACHE_REGION, **kwargs) -> None: """ @@ -270,9 +271,12 @@ class RedisBackend(CacheBackend): """ try: if region: - pattern = f"region:{region}:key:*" - for key in self.client.scan_iter(pattern): - self.client.delete(key) + redis_key = self.get_redis_key(region, "*") + # self.client.delete(*self.client.keys(redis_key)) + with self.client.pipeline() as pipe: + for key in self.client.scan_iter(redis_key): + pipe.delete(key) + pipe.execute() logger.info(f"Cleared Redis cache for region: {region}") else: self.client.flushdb()