167 lines
4.2 KiB
Markdown
167 lines
4.2 KiB
Markdown
# 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),不需要转换
|
||
- ✅ 日志中不再出现格式转换警告
|