auto_trade_sys/docs/Redis缓存问题修复说明.md
薇薇安 9fe028d704 a
2026-01-27 10:36:56 +08:00

167 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Redis缓存问题修复说明
## 🔍 问题分析
即使执行了数据迁移,日志中仍然显示格式转换警告。原因是:
1. **Redis缓存中还有旧数据**即使数据库已经迁移为比例形式0.30Redis缓存中可能还存储着百分比形式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),不需要转换
- ✅ 日志中不再出现格式转换警告