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.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:

@ -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

Loading…
Cancel
Save