diff --git a/app/storage_manager.py b/app/storage_manager.py index a3cf410..7a2e05b 100644 --- a/app/storage_manager.py +++ b/app/storage_manager.py @@ -7,13 +7,13 @@ from datetime import datetime from sqlalchemy import text from sqlalchemy.orm import sessionmaker -from app.config import REDIS_TTL_SECONDS +from app.config import CACHE_TTL_SECONDS, REDIS_TTL_SECONDS from app.models import MarketData, SymbolTimestamp logger = logging.getLogger(__name__) # Redis 缓存 TTL:读取自 app.config.REDIS_TTL_SECONDS(默认 30 天) -CACHE_TTL_SECONDS = REDIS_TTL_SECONDS +# 业务缓存有效期:读取自 app.config.CACHE_TTL_SECONDS(默认 300 秒) class StorageManager: @@ -188,7 +188,7 @@ class StorageManager: try: self.redis_client.setex( cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(result, ensure_ascii=False), ) except Exception as e: @@ -383,7 +383,7 @@ class StorageManager: try: self.redis_client.setex( cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(result, ensure_ascii=False), ) except Exception as e: @@ -471,7 +471,7 @@ class StorageManager: try: self.redis_client.setex( cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(cache_value, ensure_ascii=False), ) except Exception as e: @@ -542,7 +542,7 @@ class StorageManager: try: self.redis_client.setex( cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(cache_value, ensure_ascii=False), ) except Exception as e: @@ -654,7 +654,7 @@ class StorageManager: try: self.redis_client.setex( cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(cache_value, ensure_ascii=False), ) except Exception as e: @@ -667,7 +667,7 @@ class StorageManager: try: self.redis_client.setex( timestamp_cache_key, - CACHE_TTL_SECONDS, + REDIS_TTL_SECONDS, json.dumps(timestamp_cache_value, ensure_ascii=False), ) except Exception as e: diff --git a/tests/test_storage_manager.py b/tests/test_storage_manager.py index 9eb77db..18d3874 100644 --- a/tests/test_storage_manager.py +++ b/tests/test_storage_manager.py @@ -2,7 +2,7 @@ import importlib import json import logging import time -from datetime import datetime +from datetime import datetime, timedelta from unittest.mock import MagicMock, patch import pytest @@ -348,6 +348,57 @@ class TestStorageManagerReadLogic: ) + def test_is_fresh_true_within_cache_ttl(self): + """数据在 CACHE_TTL_SECONDS(默认 300 秒)内时 is_fresh 为 True。""" + manager = StorageManager(redis_client=None, mysql_engine=None) + fetched_at = datetime(2026, 7, 4, 10, 0, 0) + now = fetched_at + timedelta(seconds=60) + + mock_datetime = MagicMock() + mock_datetime.now.return_value = now + mock_datetime.fromisoformat = datetime.fromisoformat + + with patch("app.storage_manager.datetime", mock_datetime): + result = manager._merge_period_results( + "AG2606", + "futures", + { + "5min": { + "current_price": 123.45, + "timestamp": fetched_at.isoformat(), + "candles": [], + } + }, + ) + + assert result["is_fresh"] is True + + def test_is_fresh_false_beyond_cache_ttl(self): + """数据超过 CACHE_TTL_SECONDS(默认 300 秒)时 is_fresh 为 False。""" + manager = StorageManager(redis_client=None, mysql_engine=None) + fetched_at = datetime(2026, 7, 4, 10, 0, 0) + now = fetched_at + timedelta(seconds=301) + + mock_datetime = MagicMock() + mock_datetime.now.return_value = now + mock_datetime.fromisoformat = datetime.fromisoformat + + with patch("app.storage_manager.datetime", mock_datetime): + result = manager._merge_period_results( + "AG2606", + "futures", + { + "5min": { + "current_price": 123.45, + "timestamp": fetched_at.isoformat(), + "candles": [], + } + }, + ) + + assert result["is_fresh"] is False + + class TestStorageManagerWriteLogic: """StorageManager 双写一致性测试。""" @@ -792,18 +843,22 @@ class TestStorageManagerConfig: """配置读取相关测试。""" def test_redis_ttl_reads_config_value(self): - """StorageManager 应读取 app.config.REDIS_TTL_SECONDS 作为默认 TTL。""" + """StorageManager 应分别读取 app.config.REDIS_TTL_SECONDS 与 CACHE_TTL_SECONDS。""" import app.config as config import app.storage_manager as sm - original_ttl = config.REDIS_TTL_SECONDS + original_redis_ttl = config.REDIS_TTL_SECONDS + original_cache_ttl = config.CACHE_TTL_SECONDS original_singleton = sm._storage_manager config.REDIS_TTL_SECONDS = 1234 + config.CACHE_TTL_SECONDS = 5678 try: importlib.reload(sm) - assert sm.CACHE_TTL_SECONDS == 1234 + assert sm.REDIS_TTL_SECONDS == 1234 + assert sm.CACHE_TTL_SECONDS == 5678 finally: - config.REDIS_TTL_SECONDS = original_ttl + config.REDIS_TTL_SECONDS = original_redis_ttl + config.CACHE_TTL_SECONDS = original_cache_ttl importlib.reload(sm) sm._storage_manager = original_singleton