fix(storage): use CACHE_TTL_SECONDS for is_fresh and REDIS_TTL_SECONDS for cache TTL

refactor3.0
Lxy 2 weeks ago
parent e17a183262
commit d9bda2c4cf

@ -7,13 +7,13 @@ from datetime import datetime
from sqlalchemy import text from sqlalchemy import text
from sqlalchemy.orm import sessionmaker 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 from app.models import MarketData, SymbolTimestamp
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Redis 缓存 TTL读取自 app.config.REDIS_TTL_SECONDS默认 30 天) # Redis 缓存 TTL读取自 app.config.REDIS_TTL_SECONDS默认 30 天)
CACHE_TTL_SECONDS = REDIS_TTL_SECONDS # 业务缓存有效期:读取自 app.config.CACHE_TTL_SECONDS默认 300 秒)
class StorageManager: class StorageManager:
@ -188,7 +188,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
cache_key, cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(result, ensure_ascii=False), json.dumps(result, ensure_ascii=False),
) )
except Exception as e: except Exception as e:
@ -383,7 +383,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
cache_key, cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(result, ensure_ascii=False), json.dumps(result, ensure_ascii=False),
) )
except Exception as e: except Exception as e:
@ -471,7 +471,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
cache_key, cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(cache_value, ensure_ascii=False), json.dumps(cache_value, ensure_ascii=False),
) )
except Exception as e: except Exception as e:
@ -542,7 +542,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
cache_key, cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(cache_value, ensure_ascii=False), json.dumps(cache_value, ensure_ascii=False),
) )
except Exception as e: except Exception as e:
@ -654,7 +654,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
cache_key, cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(cache_value, ensure_ascii=False), json.dumps(cache_value, ensure_ascii=False),
) )
except Exception as e: except Exception as e:
@ -667,7 +667,7 @@ class StorageManager:
try: try:
self.redis_client.setex( self.redis_client.setex(
timestamp_cache_key, timestamp_cache_key,
CACHE_TTL_SECONDS, REDIS_TTL_SECONDS,
json.dumps(timestamp_cache_value, ensure_ascii=False), json.dumps(timestamp_cache_value, ensure_ascii=False),
) )
except Exception as e: except Exception as e:

@ -2,7 +2,7 @@ import importlib
import json import json
import logging import logging
import time import time
from datetime import datetime from datetime import datetime, timedelta
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import pytest 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: class TestStorageManagerWriteLogic:
"""StorageManager 双写一致性测试。""" """StorageManager 双写一致性测试。"""
@ -792,18 +843,22 @@ class TestStorageManagerConfig:
"""配置读取相关测试。""" """配置读取相关测试。"""
def test_redis_ttl_reads_config_value(self): 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.config as config
import app.storage_manager as sm 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 original_singleton = sm._storage_manager
config.REDIS_TTL_SECONDS = 1234 config.REDIS_TTL_SECONDS = 1234
config.CACHE_TTL_SECONDS = 5678
try: try:
importlib.reload(sm) importlib.reload(sm)
assert sm.CACHE_TTL_SECONDS == 1234 assert sm.REDIS_TTL_SECONDS == 1234
assert sm.CACHE_TTL_SECONDS == 5678
finally: finally:
config.REDIS_TTL_SECONDS = original_ttl config.REDIS_TTL_SECONDS = original_redis_ttl
config.CACHE_TTL_SECONDS = original_cache_ttl
importlib.reload(sm) importlib.reload(sm)
sm._storage_manager = original_singleton sm._storage_manager = original_singleton

Loading…
Cancel
Save