# Redis缓存问题修复说明 ## 🔍 问题分析 即使执行了数据迁移,日志中仍然显示格式转换警告。原因是: 1. **Redis缓存中还有旧数据**:即使数据库已经迁移为比例形式(0.30),Redis缓存中可能还存储着百分比形式(30) 2. **格式转换后没有更新缓存**:当检测到值>1时,代码会转换为比例形式(0.30),但转换后的值没有写回Redis缓存 3. **下次读取时再次触发转换**:下次从Redis读取时,又会读到旧值(30),再次触发转换 --- ## ✅ 修复方案 ### 方案1:在格式转换时更新Redis缓存(已实现) **修改位置**:`backend/config_manager.py:756-777` **修复逻辑**: ```python if value > 1: old_value = value value = value / 100.0 logger.warning(...) # ⚠️ 关键修复:转换后立即更新Redis缓存 try: if key in RISK_KNOBS_KEYS: # 风险旋钮:更新当前账号的Redis缓存 self._set_to_redis(key, value) self._cache[key] = value else: # 全局配置:更新全局配置的Redis缓存 global_config_mgr._set_to_redis(key, value) global_config_mgr._cache[key] = value except Exception as e: logger.debug(f"更新Redis缓存失败(不影响使用): {key} = {e}") ``` **效果**: - ✅ 转换后的值(0.30)会立即写回Redis缓存 - ✅ 下次读取时,直接从Redis读取到正确的值(0.30),不再触发转换 - ✅ 警告日志会逐渐减少,直到所有缓存都更新完成 --- ### 方案2:手动清除Redis缓存(推荐配合使用) **执行命令**: ```bash # 清除所有配置缓存 redis-cli DEL "config:trading_config:*" redis-cli DEL "config:global_strategy_config" # 或者清除特定账号的缓存 redis-cli DEL "config:trading_config:1" redis-cli DEL "config:trading_config:2" redis-cli DEL "config:trading_config:3" redis-cli DEL "config:trading_config:4" ``` **效果**: - ✅ 强制系统从数据库重新加载配置 - ✅ 如果数据库已经迁移,加载的将是正确的比例形式(0.30) - ✅ 新的配置值会写入Redis缓存 --- ## 🔧 实施步骤 ### 步骤1:应用代码修复(已完成) 代码已经修复,格式转换时会自动更新Redis缓存。 ### 步骤2:清除Redis缓存(推荐) ```bash # 清除所有配置缓存 redis-cli DEL "config:trading_config:*" redis-cli DEL "config:global_strategy_config" ``` ### 步骤3:重启服务 ```bash # 重启后端服务 supervisorctl restart backend # 重启交易进程 supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4 ``` ### 步骤4:验证 **检查日志**: ```bash # 查看日志,确认格式转换警告逐渐减少 tail -f /www/wwwroot/autosys_new/logs/trading_*.log | grep "配置值格式转换" ``` **预期结果**: - ✅ 第一次读取时,可能会看到格式转换警告(从Redis读取到旧值) - ✅ 转换后,值会写回Redis缓存 - ✅ 下次读取时,不再触发转换,警告消失 --- ## 📊 数据流 ### 修复前 ``` 从Redis读取:30(旧数据) ↓ 格式转换:30 -> 0.30 ↓ 使用:0.30 ↓ ⚠️ Redis缓存中还是30(没有更新) ↓ 下次读取:30(再次触发转换) ``` ### 修复后 ``` 从Redis读取:30(旧数据) ↓ 格式转换:30 -> 0.30 ↓ 更新Redis缓存:0.30 ✅ ↓ 使用:0.30 ↓ 下次读取:0.30(不再触发转换)✅ ``` --- ## ✅ 总结 ### 修复内容 1. **代码修复**:格式转换时自动更新Redis缓存 2. **手动清除**:清除Redis缓存,强制从数据库重新加载 ### 效果 - ✅ 格式转换警告会逐渐减少 - ✅ Redis缓存会自动更新为正确的值 - ✅ 下次读取时不再触发转换 ### 建议 1. **立即清除Redis缓存**:确保从数据库加载最新数据 2. **重启服务**:让新代码生效 3. **监控日志**:确认警告逐渐减少 --- ## 🎯 最终效果 - ✅ 数据库中统一存储比例形式(0.30) - ✅ Redis缓存中也是比例形式(0.30) - ✅ 前端直接显示小数(0.30),不带%符号 - ✅ 后端直接使用(0.30),不需要转换 - ✅ 日志中不再出现格式转换警告