# 缓存策略:全用 Redis,基本不占服务器内存 ## 目标 - **全量缓存以 Redis/Valkey 为主**:有 Redis 时只读只写 Redis,进程内基本不保留缓存,减轻服务器内存压力。 - **Redis 内容全部带过期时间**:所有写入 Redis 的键均设置 TTL,不在 Redis 内无限增长。 ## 一、Redis 键与 TTL 统一配置 所有 TTL 与键前缀集中在 `trading_system/redis_ttl.py` 中定义,**禁止**在 Redis 中写入无过期时间的业务键。 | 用途 | 键/前缀示例 | TTL(秒) | 说明 | |----------------|--------------------------|-----------|----------------| | 持仓缓存 | `ats:positions:cache` | 300 | 5 分钟 | | 余额缓存 | `ats:balance:cache:USDT` | 300 | 5 分钟 | | K 线(WS 写入)| `market:kline:{s}:{i}` | 600 | 10 分钟 | | 24h 行情 | `ticker_24h:{symbol}` | 30 | 单 symbol | | 全市场 24h | `market:ticker_24h` | 120 | 2 分钟 | | BookTicker | `market:book_ticker` | 30 | 30 秒 | | 交易对信息 | `symbol_info:{symbol}` | 3600 | 1 小时 | | listenKey 缓存 | `listen_key:*` | 3300 | 55 分钟 | | 市场 WS Leader | `market_ws_leader` | 30 | 选主续期 | 更多见 `trading_system/redis_ttl.py`(含 K 线按 interval 的 TTL 等)。 ## 二、各模块行为 ### 1. RedisCache 降级内存缓存 **文件**: `trading_system/redis_cache.py` - Redis 不可用时降级到进程内存。 - 内存缓存**有上限**:最多 200 条;单条** 5 分钟**过期,过期或满时淘汰最久未用,避免无限增长。 ### 2. K 线 **文件**: `trading_system/kline_stream.py` - Leader 进程:WebSocket 收到 K 线后写入 Redis(TTL 见 `redis_ttl.TTL_KLINE_STREAM`),**写入成功后从进程内 `_kline_cache` 删除该 key**,以 Redis 为准、基本不占服务器内存。 - 非 Leader / 读路径:从 Redis 读(`get_klines_from_redis`);进程内仅保留未刷写 Redis 的少量缓冲。 ### 3. 持仓 / 余额 **文件**: `trading_system/user_data_stream.py` - **有 Redis 时**:只写 Redis,**不写** `_position_updates_cache` / `_balance_updates_cache`;读时优先从 Redis 读。 - **无 Redis 时**:写进程内存,读时从进程内存读。 - 所有 Redis 键带 TTL(见 `redis_ttl.TTL_POSITIONS` / `TTL_BALANCE`)。 ### 4. 价格与交易对信息 **文件**: `trading_system/binance_client.py` - **价格(get_ticker_24h)**:先读 Redis;REST 回源后只写 Redis;仅当 Redis 写入失败时才写进程内存(降级)。 - **交易对信息(get_symbol_info)**:先读 Redis;从 DB/API 得到后写 Redis;仅当 Redis 不可用时才写入 `_symbol_info_cache`。 ### 5. 其他 - 行情 / BookTicker / listenKey / 推荐结果等:凡写入 Redis 的均带 TTL,见各模块及 `redis_ttl.py`。 ## 三、使用与运维 1. **保证 Redis/Valkey 可用**:配置好 `REDIS_URL`(如 AWS Valkey),确保交易服务能连上。 2. **重启生效**:改缓存逻辑后需重启交易服务。 3. **监控 Redis 内存**:在 Valkey 控制台或 `INFO memory` 查看内存;所有键有过期,不应无限增长。 4. **进程内存**:正常情况下进程内缓存很少;仅 Redis 不可用时才用内存降级(条数/过期受控)。 ## 四、预期效果 - 服务器进程内存占用明显下降(有 Redis 时基本不存大块缓存)。 - Redis/Valkey 内所有业务键有过期,不会无限使用内存。