4.2 KiB
4.2 KiB
Redis缓存问题修复说明
🔍 问题分析
即使执行了数据迁移,日志中仍然显示格式转换警告。原因是:
- Redis缓存中还有旧数据:即使数据库已经迁移为比例形式(0.30),Redis缓存中可能还存储着百分比形式(30)
- 格式转换后没有更新缓存:当检测到值>1时,代码会转换为比例形式(0.30),但转换后的值没有写回Redis缓存
- 下次读取时再次触发转换:下次从Redis读取时,又会读到旧值(30),再次触发转换
✅ 修复方案
方案1:在格式转换时更新Redis缓存(已实现)
修改位置:backend/config_manager.py:756-777
修复逻辑:
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缓存(推荐配合使用)
执行命令:
# 清除所有配置缓存
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缓存(推荐)
# 清除所有配置缓存
redis-cli DEL "config:trading_config:*"
redis-cli DEL "config:global_strategy_config"
步骤3:重启服务
# 重启后端服务
supervisorctl restart backend
# 重启交易进程
supervisorctl restart auto_sys_acc1 auto_sys_acc2 auto_sys_acc3 auto_sys_acc4
步骤4:验证
检查日志:
# 查看日志,确认格式转换警告逐渐减少
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(不再触发转换)✅
✅ 总结
修复内容
- 代码修复:格式转换时自动更新Redis缓存
- 手动清除:清除Redis缓存,强制从数据库重新加载
效果
- ✅ 格式转换警告会逐渐减少
- ✅ Redis缓存会自动更新为正确的值
- ✅ 下次读取时不再触发转换
建议
- 立即清除Redis缓存:确保从数据库加载最新数据
- 重启服务:让新代码生效
- 监控日志:确认警告逐渐减少
🎯 最终效果
- ✅ 数据库中统一存储比例形式(0.30)
- ✅ Redis缓存中也是比例形式(0.30)
- ✅ 前端直接显示小数(0.30),不带%符号
- ✅ 后端直接使用(0.30),不需要转换
- ✅ 日志中不再出现格式转换警告