a
This commit is contained in:
parent
b2860f8fdb
commit
62710a5720
|
|
@ -75,11 +75,13 @@ async def get_recommendations(
|
||||||
|
|
||||||
# 从Redis读取推荐
|
# 从Redis读取推荐
|
||||||
recommendations = []
|
recommendations = []
|
||||||
|
cache_available = False
|
||||||
try:
|
try:
|
||||||
import time
|
import time
|
||||||
cache_key = "recommendations:realtime"
|
cache_key = "recommendations:realtime"
|
||||||
cached_data = await client.redis_cache.hgetall(cache_key)
|
cached_data = await client.redis_cache.hgetall(cache_key)
|
||||||
if cached_data:
|
if cached_data:
|
||||||
|
cache_available = True
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
max_age = 3600 * 2 # 推荐最大保留时间:2小时
|
max_age = 3600 * 2 # 推荐最大保留时间:2小时
|
||||||
|
|
||||||
|
|
@ -96,7 +98,37 @@ async def get_recommendations(
|
||||||
recommendations.sort(key=lambda x: x.get('timestamp', 0), reverse=True)
|
recommendations.sort(key=lambda x: x.get('timestamp', 0), reverse=True)
|
||||||
logger.info(f"从Redis读取到 {len(recommendations)} 个有效推荐(已过滤过期)")
|
logger.info(f"从Redis读取到 {len(recommendations)} 个有效推荐(已过滤过期)")
|
||||||
except Exception as e:
|
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:
|
if direction:
|
||||||
|
|
@ -109,6 +141,7 @@ async def get_recommendations(
|
||||||
"success": True,
|
"success": True,
|
||||||
"count": len(recommendations),
|
"count": len(recommendations),
|
||||||
"type": "realtime",
|
"type": "realtime",
|
||||||
|
"from_cache": cache_available,
|
||||||
"data": recommendations
|
"data": recommendations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -300,13 +300,22 @@ class RedisCache:
|
||||||
if isinstance(k, bytes):
|
if isinstance(k, bytes):
|
||||||
k = k.decode('utf-8')
|
k = k.decode('utf-8')
|
||||||
if isinstance(v, bytes):
|
if isinstance(v, bytes):
|
||||||
|
try:
|
||||||
v = json.loads(v.decode('utf-8'))
|
v = json.loads(v.decode('utf-8'))
|
||||||
|
except:
|
||||||
|
v = v.decode('utf-8')
|
||||||
else:
|
else:
|
||||||
|
try:
|
||||||
v = json.loads(v)
|
v = json.loads(v)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
result[k] = v
|
result[k] = v
|
||||||
return result
|
return result
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug(f"Redis Hash获取全部失败 {name}: {e}")
|
logger.debug(f"Redis Hash获取全部失败 {name}: {e}")
|
||||||
|
# Redis失败时,尝试重新连接
|
||||||
|
if not self._connected:
|
||||||
|
await self.connect()
|
||||||
|
|
||||||
# 降级到内存缓存
|
# 降级到内存缓存
|
||||||
if name in self._memory_cache:
|
if name in self._memory_cache:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user