|
7 | 7 | from redis.asyncio import Redis |
8 | 8 |
|
9 | 9 | from app.core.config import settings |
10 | | -from app.core.event import eventmanager, Event |
11 | 10 | from app.log import logger |
12 | | -from app.schemas import ConfigChangeEventData |
13 | | -from app.schemas.types import EventType |
| 11 | +from app.utils.mixins import ConfigReloadMixin |
14 | 12 | from app.utils.singleton import Singleton |
15 | 13 |
|
16 | 14 | # 类型缓存集合,针对非容器简单类型 |
@@ -74,16 +72,17 @@ def deserialize(value: bytes) -> Any: |
74 | 72 | raise ValueError("Unknown serialization format") |
75 | 73 |
|
76 | 74 |
|
77 | | -class RedisHelper(metaclass=Singleton): |
| 75 | +class RedisHelper(ConfigReloadMixin, metaclass=Singleton): |
78 | 76 | """ |
79 | 77 | Redis连接和操作助手类,单例模式 |
80 | | - |
| 78 | +
|
81 | 79 | 特性: |
82 | 80 | - 管理Redis连接池和客户端 |
83 | 81 | - 提供序列化和反序列化功能 |
84 | 82 | - 支持内存限制和淘��策略设置 |
85 | 83 | - 提供键名生成和区域管理功能 |
86 | 84 | """ |
| 85 | + CONFIG_WATCH = {"CACHE_BACKEND_TYPE", "CACHE_BACKEND_URL", "CACHE_REDIS_MAXMEMORY"} |
87 | 86 |
|
88 | 87 | def __init__(self): |
89 | 88 | """ |
@@ -114,25 +113,17 @@ def _connect(self): |
114 | 113 | self.client = None |
115 | 114 | raise RuntimeError("Redis connection failed") from e |
116 | 115 |
|
117 | | - @eventmanager.register(EventType.ConfigChanged) |
118 | | - def handle_config_changed(self, event: Event): |
119 | | - """ |
120 | | - 处理配置变更事件,更新Redis设置 |
121 | | - :param event: 事件对象 |
122 | | - """ |
123 | | - if not event: |
124 | | - return |
125 | | - event_data: ConfigChangeEventData = event.event_data |
126 | | - if event_data.key not in ['CACHE_BACKEND_TYPE', 'CACHE_BACKEND_URL', 'CACHE_REDIS_MAXMEMORY']: |
127 | | - return |
128 | | - logger.info("配置变更,重连Redis...") |
| 116 | + def on_config_changed(self): |
129 | 117 | self.close() |
130 | 118 | self._connect() |
131 | 119 |
|
| 120 | + def get_reload_name(self): |
| 121 | + return "Redis" |
| 122 | + |
132 | 123 | def set_memory_limit(self, policy: Optional[str] = "allkeys-lru"): |
133 | 124 | """ |
134 | 125 | 动态设置Redis最大内存和内存淘汰策略 |
135 | | - |
| 126 | +
|
136 | 127 | :param policy: 淘汰策略(如'allkeys-lru') |
137 | 128 | """ |
138 | 129 | try: |
@@ -310,17 +301,18 @@ def close(self) -> None: |
310 | 301 | logger.debug("Redis connection closed") |
311 | 302 |
|
312 | 303 |
|
313 | | -class AsyncRedisHelper(metaclass=Singleton): |
| 304 | +class AsyncRedisHelper(ConfigReloadMixin, metaclass=Singleton): |
314 | 305 | """ |
315 | 306 | 异步Redis连接和操作助手类,单例模式 |
316 | | - |
| 307 | +
|
317 | 308 | 特性: |
318 | 309 | - 管理异步Redis连接池和客户端 |
319 | 310 | - 提供序列化和反序列化功能 |
320 | 311 | - 支持内存限制和淘汰策略设置 |
321 | 312 | - 提供键名生成和区域管理功能 |
322 | 313 | - 所有操作都是异步的 |
323 | 314 | """ |
| 315 | + CONFIG_WATCH = {"CACHE_BACKEND_TYPE", "CACHE_BACKEND_URL", "CACHE_REDIS_MAXMEMORY"} |
324 | 316 |
|
325 | 317 | def __init__(self): |
326 | 318 | """ |
@@ -351,25 +343,17 @@ async def _connect(self): |
351 | 343 | self.client = None |
352 | 344 | raise RuntimeError("Redis async connection failed") from e |
353 | 345 |
|
354 | | - @eventmanager.register(EventType.ConfigChanged) |
355 | | - async def handle_config_changed(self, event: Event): |
356 | | - """ |
357 | | - 处理配置变更事件,更新Redis设置 |
358 | | - :param event: 事件对象 |
359 | | - """ |
360 | | - if not event: |
361 | | - return |
362 | | - event_data: ConfigChangeEventData = event.event_data |
363 | | - if event_data.key not in ['CACHE_BACKEND_TYPE', 'CACHE_BACKEND_URL', 'CACHE_REDIS_MAXMEMORY']: |
364 | | - return |
365 | | - logger.info("配置变更,重连Redis (async)...") |
| 346 | + async def on_config_changed(self): |
366 | 347 | await self.close() |
367 | 348 | await self._connect() |
368 | 349 |
|
| 350 | + def get_reload_name(self): |
| 351 | + return "Redis (async)" |
| 352 | + |
369 | 353 | async def set_memory_limit(self, policy: Optional[str] = "allkeys-lru"): |
370 | 354 | """ |
371 | 355 | 动态设置Redis最大内存和内存淘汰策略 |
372 | | - |
| 356 | +
|
373 | 357 | :param policy: 淘汰策略(如'allkeys-lru') |
374 | 358 | """ |
375 | 359 | try: |
|
0 commit comments