From 62710a572076e1d2bcf41f7899fdc747a0a13cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Thu, 15 Jan 2026 22:10:23 +0800 Subject: [PATCH] a --- backend/api/routes/recommendations.py | 35 ++++++++++++++++++++++++++- trading_system/redis_cache.py | 13 ++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/backend/api/routes/recommendations.py b/backend/api/routes/recommendations.py index 2c1e3b8..2885ac8 100644 --- a/backend/api/routes/recommendations.py +++ b/backend/api/routes/recommendations.py @@ -75,11 +75,13 @@ async def get_recommendations( # 从Redis读取推荐 recommendations = [] + cache_available = False try: import time cache_key = "recommendations:realtime" cached_data = await client.redis_cache.hgetall(cache_key) if cached_data: + cache_available = True current_time = time.time() max_age = 3600 * 2 # 推荐最大保留时间:2小时 @@ -96,7 +98,37 @@ async def get_recommendations( recommendations.sort(key=lambda x: x.get('timestamp', 0), reverse=True) logger.info(f"从Redis读取到 {len(recommendations)} 个有效推荐(已过滤过期)") except Exception as e: - logger.debug(f"从Redis读取推荐失败: {e}") + logger.warning(f"从Redis读取推荐失败: {e}") + + # 如果Redis中没有推荐,实时生成 + if not recommendations: + logger.info("Redis中没有推荐,实时生成推荐...") + try: + from market_scanner import MarketScanner + from risk_manager import RiskManager + from trade_recommender import TradeRecommender + + await client.connect() + + try: + scanner = MarketScanner(client) + risk_manager = RiskManager(client) + recommender = TradeRecommender(client, scanner, risk_manager) + + # 生成推荐(会自动保存到Redis) + recommendations = await recommender.generate_recommendations( + min_signal_strength=min_signal_strength, + max_recommendations=limit, + add_to_cache=True, + min_quality_score=0.0 + ) + logger.info(f"实时生成了 {len(recommendations)} 个推荐") + finally: + await client.disconnect() + except Exception as e: + logger.error(f"实时生成推荐失败: {e}") + import traceback + logger.error(traceback.format_exc()) # 方向过滤 if direction: @@ -109,6 +141,7 @@ async def get_recommendations( "success": True, "count": len(recommendations), "type": "realtime", + "from_cache": cache_available, "data": recommendations } diff --git a/trading_system/redis_cache.py b/trading_system/redis_cache.py index b3a604f..da89aa8 100644 --- a/trading_system/redis_cache.py +++ b/trading_system/redis_cache.py @@ -300,13 +300,22 @@ class RedisCache: if isinstance(k, bytes): k = k.decode('utf-8') if isinstance(v, bytes): - v = json.loads(v.decode('utf-8')) + try: + v = json.loads(v.decode('utf-8')) + except: + v = v.decode('utf-8') else: - v = json.loads(v) + try: + v = json.loads(v) + except: + pass result[k] = v return result except Exception as e: logger.debug(f"Redis Hash获取全部失败 {name}: {e}") + # Redis失败时,尝试重新连接 + if not self._connected: + await self.connect() # 降级到内存缓存 if name in self._memory_cache: