""" 数据库和缓存配置 """ import os class MetaRedisConfig(type): """Redis 配置""" @property def HOST(cls): return os.getenv('REDIS_HOST', 'localhost') @property def PORT(cls): return int(os.getenv('REDIS_PORT', 6379)) @property def PASSWORD(cls): return os.getenv('REDIS_PASSWORD', None) @property def DB(cls): return int(os.getenv('REDIS_DB', 0)) @property def CONNECT_TIMEOUT(cls): return int(os.getenv('REDIS_CONNECT_TIMEOUT', 5)) @property def SOCKET_TIMEOUT(cls): return int(os.getenv('REDIS_SOCKET_TIMEOUT', 5)) @property def MAX_CONNECTIONS(cls): return int(os.getenv('REDIS_MAX_CONNECTIONS', 10)) class RedisConfig(metaclass=MetaRedisConfig): """Redis 缓存配置""" @classmethod def get_url(cls) -> str: """获取 Redis 连接 URL""" if cls.PASSWORD: return f"redis://:{cls.PASSWORD}@{cls.HOST}:{cls.PORT}/{cls.DB}" return f"redis://{cls.HOST}:{cls.PORT}/{cls.DB}" class MetaSQLiteConfig(type): """SQLite 配置""" @property def DATABASE_FILE(cls): # 默认放在 backend_api_python/data 目录(更干净,也与 docker-compose 挂载一致) base_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) default_path = os.path.join(base_dir, 'data', 'quantdinger.db') return os.getenv('SQLITE_DATABASE_FILE', default_path) class SQLiteConfig(metaclass=MetaSQLiteConfig): """SQLite 数据库配置""" @classmethod def get_path(cls) -> str: """获取数据库文件路径""" return cls.DATABASE_FILE class MetaCacheConfig(type): """缓存业务配置""" @property def ENABLED(cls): # 强制默认关闭,除非环境变量显式开启 return os.getenv('CACHE_ENABLED', 'False').lower() == 'true' @property def DEFAULT_EXPIRE(cls): return int(os.getenv('CACHE_EXPIRE', 300)) @property def KLINE_CACHE_TTL(cls): return { '1m': 5, # 1分钟K线缓存5秒 '3m': 30, # 3分钟K线缓存30秒 '5m': 60, # 5分钟K线缓存1分钟 '15m': 300, # 15分钟K线缓存5分钟 '30m': 300, # 30分钟K线缓存5分钟 '1H': 300, # 1小时K线缓存5分钟 '4H': 300, # 4小时K线缓存5分钟 '1D': 300, # 日K线缓存5分钟 # 兼容小写 '1h': 300, '4h': 300, '1d': 300, } @property def ANALYSIS_CACHE_TTL(cls): return 3600 @property def PRICE_CACHE_TTL(cls): return 10 class CacheConfig(metaclass=MetaCacheConfig): """缓存配置""" pass