refactor: 加密货币默认不缓存,简化分层缓存策略

问题:
- 加密货币分钟级数据量大,不适合全量缓存
- 原分层策略过于复杂

优化方案:
- 日级别数据(股票/指数/ETF/期货): 缓存全量数据,切片返回
- 加密货币: 每次实时下载,不缓存

代码简化:
- 删除 CRYPTO_CACHE_DAYS 配置
- 删除 _get_crypto_cache_start 函数
- _fetch_full_data_cached: 加密货币直接返回None
- fetch_data_with_ttl: 加密货币分支直接下载

优势:
- 日级别数据:减少重复下载
- 加密货币:避免内存爆炸,实时获取最新价格
This commit is contained in:
2026-05-12 23:27:44 +08:00
parent 1d3483bc02
commit fb755fc31e

View File

@@ -119,20 +119,30 @@ def get_fetcher() -> UniversalDataFetcher:
@lru_cache(maxsize=CACHE_MAXSIZE)
def _fetch_full_data_cached(code: str, today: str) -> Optional[str]:
"""
缓存全量数据(从 DEFAULT_START_DATE 到 today
缓存全量数据(仅日级别数据
缓存策略:
- 日级别数据(股票/指数/ETF/期货): 从 DEFAULT_START_DATE 到 today
- 加密货币: 不缓存,每次实时下载
缓存Key: (code, today_date)
- today: 实际的今天日期,用于每日更新缓存
- 每天下载一次全量数据,避免重复请求
Returns:
JSON 序列化的全量数据
JSON 序列化的全量数据(仅日级别数据)
"""
f = get_fetcher()
# 检查资产类型
asset_type = AssetTypeDetector.detect(code)
# 加密货币不缓存
if asset_type == AssetType.CRYPTO:
return None # 不缓存加密货币
try:
with f:
# 下载全量数据:从默认起点到今天
# 下载数据:从默认起点到今天
df = f.fetch(code, DEFAULT_START_DATE, today)
if df is None or len(df) == 0:
@@ -142,9 +152,10 @@ def _fetch_full_data_cached(code: str, today: str) -> Optional[str]:
result = {
'df_json': dataframe_to_json(df),
'code': code,
'asset_type': AssetTypeDetector.detect(code).value,
'asset_type': asset_type.value,
'data_start': df.index.min().strftime('%Y-%m-%d') if len(df) > 0 else None,
'data_end': df.index.max().strftime('%Y-%m-%d') if len(df) > 0 else None,
'cache_strategy': 'full_history',
}
return json.dumps(result)
@@ -215,12 +226,11 @@ def fetch_data_with_ttl(
nocache: bool = False
) -> Tuple[Optional[Dict], bool]:
"""
获取数据,支持 TTL 缓存
获取数据,支持 TTL 缓存(加密货币不缓存)
缓存策略:
- Key: (code, today_date) 缓存全量数据
- 每天下载一次全量数据(从 DEFAULT_START_DATE 到今天)
- 用户请求时从缓存切片 start-end 范围返回
- 日级别数据(股票/指数/ETF/期货): Key=(code, today), 缓存全量数据,切片返回
- 加密货币: 每次实时下载,不缓存
Args:
code: 标的代码
@@ -229,10 +239,32 @@ def fetch_data_with_ttl(
nocache: 是否跳过缓存
Returns:
(data, is_cached): 切片后的数据和是否命中缓存
(data, is_cached): 数据和是否命中缓存
"""
# 获取今天的实际日期用于缓存Key
today = datetime.now().strftime('%Y-%m-%d')
# 检查资产类型
asset_type = AssetTypeDetector.detect(code)
# 加密货币:直接下载,不缓存
if asset_type == AssetType.CRYPTO:
f = get_fetcher()
try:
with f:
df = f.fetch(code, start, end)
if df is None or len(df) == 0:
return None, False
result = dataframe_to_json(df)
result['code'] = code
result['asset_type'] = asset_type.value
result['cache_strategy'] = 'no_cache_crypto'
result['requested_range'] = {'start': start, 'end': end}
return result, False
except Exception as e:
return {'error': str(e), 'code': code, 'asset_type': asset_type.value}, False
# 日级别数据:使用缓存
full_cache_key = (code, today)
# 跳过缓存:清理缓存后重新下载