refactor: route cache settings through runtime

This commit is contained in:
jxxghp
2026-08-23 02:02:31 +08:00
parent b4e003f098
commit d0ebdd60c0
5 changed files with 43 additions and 25 deletions
+22 -13
View File
@@ -9,11 +9,16 @@ import redis
from redis.asyncio import BlockingConnectionPool as AsyncBlockingConnectionPool
from redis.asyncio import Redis
from app.runtime.config import settings
from app.runtime import config as _runtime_config
from app.runtime.log import logger
from app.runtime.reload import ConfigReloadMixin
from app.runtime.settings import get_runtime_setting
from app.foundation.singleton import Singleton
# 兼容旧插件和测试对模块级 Settings 的覆盖,Redis 连接逻辑统一读取 runtime 端口。
settings = _runtime_config.settings
# 类型缓存集合,针对非容器简单类型
_complex_serializable_types = set()
_simple_serializable_types = set()
@@ -97,7 +102,7 @@ class RedisHelper(ConfigReloadMixin, metaclass=Singleton):
"""
初始化Redis助手实例
"""
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
self.client = None
self._connect_lock = threading.RLock()
@@ -112,15 +117,15 @@ class RedisHelper(ConfigReloadMixin, metaclass=Singleton):
with self._connect_lock:
if self.client is not None:
return
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
connection_pool = redis.BlockingConnectionPool.from_url(
self.redis_url,
decode_responses=False,
socket_timeout=_socket_timeout,
socket_connect_timeout=_socket_connect_timeout,
health_check_interval=_health_check_interval,
max_connections=settings.CACHE_REDIS_MAX_CONNECTIONS,
timeout=settings.CACHE_REDIS_POOL_TIMEOUT,
max_connections=get_runtime_setting("CACHE_REDIS_MAX_CONNECTIONS"),
timeout=get_runtime_setting("CACHE_REDIS_POOL_TIMEOUT"),
)
client = redis.Redis(connection_pool=connection_pool)
# 测试连接,确保Redis可用
@@ -138,7 +143,7 @@ class RedisHelper(ConfigReloadMixin, metaclass=Singleton):
def on_config_changed(self):
"""缓存配置变化后重建同步 Redis 连接。"""
with self._connect_lock:
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
self.close()
self._connect()
@@ -154,7 +159,9 @@ class RedisHelper(ConfigReloadMixin, metaclass=Singleton):
"""
try:
# 如果有显式值,则直接使用,为0时说明不限制,如果未配置,开启BIG_MEMORY_MODE时为"1024mb",未开启时为"256mb"
maxmemory = settings.CACHE_REDIS_MAXMEMORY or ("1024mb" if settings.BIG_MEMORY_MODE else "256mb")
maxmemory = get_runtime_setting("CACHE_REDIS_MAXMEMORY") or (
"1024mb" if get_runtime_setting("BIG_MEMORY_MODE") else "256mb"
)
self.client.config_set("maxmemory", maxmemory)
self.client.config_set("maxmemory-policy", policy)
logger.debug(f"Redis maxmemory set to {maxmemory}, policy: {policy}")
@@ -364,7 +371,7 @@ class AsyncRedisHelper(ConfigReloadMixin, metaclass=Singleton):
"""
初始化异步Redis助手实例
"""
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
self.client: Optional[Redis] = None
self._loop: Optional[asyncio.AbstractEventLoop] = None
self._connect_lock: Optional[asyncio.Lock] = None
@@ -394,15 +401,15 @@ class AsyncRedisHelper(ConfigReloadMixin, metaclass=Singleton):
await self._close_client()
if self.client is not None:
return
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
connection_pool = AsyncBlockingConnectionPool.from_url(
self.redis_url,
decode_responses=False,
socket_timeout=_socket_timeout,
socket_connect_timeout=_socket_connect_timeout,
health_check_interval=_health_check_interval,
max_connections=settings.CACHE_REDIS_MAX_CONNECTIONS,
timeout=settings.CACHE_REDIS_POOL_TIMEOUT,
max_connections=get_runtime_setting("CACHE_REDIS_MAX_CONNECTIONS"),
timeout=get_runtime_setting("CACHE_REDIS_POOL_TIMEOUT"),
)
client = Redis(connection_pool=connection_pool)
self._loop = current_loop
@@ -433,7 +440,7 @@ class AsyncRedisHelper(ConfigReloadMixin, metaclass=Singleton):
async def on_config_changed(self):
"""缓存配置变化后异步重建 Redis 连接。"""
self.redis_url = settings.CACHE_BACKEND_URL
self.redis_url = get_runtime_setting("CACHE_BACKEND_URL")
await self._close_client()
await self._connect()
@@ -449,7 +456,9 @@ class AsyncRedisHelper(ConfigReloadMixin, metaclass=Singleton):
"""
try:
# 如果有显式值,则直接使用,为0时说明不限制,如果未配置,开启BIG_MEMORY_MODE时为"1024mb",未开启时为"256mb"
maxmemory = settings.CACHE_REDIS_MAXMEMORY or ("1024mb" if settings.BIG_MEMORY_MODE else "256mb")
maxmemory = get_runtime_setting("CACHE_REDIS_MAXMEMORY") or (
"1024mb" if get_runtime_setting("BIG_MEMORY_MODE") else "256mb"
)
await self.client.config_set("maxmemory", maxmemory)
await self.client.config_set("maxmemory-policy", policy)
logger.debug(f"Redis maxmemory set to {maxmemory}, policy: {policy} (async)")