Redis配置文档
概述
量化交易系统使用Redis作为主数据存储和会话缓存,支持开发环境和生产环境的不同配置。
重要说明:Redis 在本系统中是持久化存储,而非临时缓存。所有核心业务数据(用户、账户、配置等)均永久保存,通过 RDB + AOF 双重持久化机制保证数据安全。
环境配置
开发环境
- 模式: 本地Redis服务
- 持久化: RDB + AOF双重持久化
- 数据目录:
backend/data/redis - 配置文件:
backend/redis.conf
生产环境
- 模式: 远程Redis服务
- 连接: 通过环境变量配置
- 认证: 支持密码认证
- 高可用: 支持Redis集群
配置参数
环境变量
# 基础配置
ENVIRONMENT=development|production
REDIS_HOST=localhost|your-redis-server.com
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
# 可选配置
REDIS_URL=redis://localhost:6379/0
# 系统配置
SECRET_KEY=your-secret-key-here
JWT_SECRET_KEY=your-jwt-secret-key-here
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
Redis持久化配置
RDB快照
save 900 1 # 900秒内至少1个key变化时保存
save 300 10 # 300秒内至少10个key变化时保存
save 60 10000 # 60秒内至少10000个key变化时保存
AOF日志
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
混合持久化
aof-use-rdb-preamble yes
数据管理
数据持久化策略
本系统采用分层持久化策略,区分核心业务数据和临时缓存数据:
核心业务数据(永久保存,无 TTL)
这些数据使用 redis.set() 保存,永不过期:
| 数据类型 | Key 模式 | Repository | 说明 |
|---|---|---|---|
| 用户数据 | user:{user_id} |
UserRepository | 用户基本信息、密码等 |
| 用户名索引 | user_by_username:{username} |
UserRepository | 用户名到 user_id 的映射 |
| 用户账户 | account:{account_id} |
UserRepository | 用户交易账户信息 |
| 券商配置 | broker:{broker_id} |
BrokerRepository | 券商基本信息和配置 |
| 券商代码索引 | broker_by_code:{code} |
BrokerRepository | 券商代码到 broker_id 的映射 |
| 数据源配置 | data_source:{source_id} |
BrokerRepository | 数据源配置信息 |
| 用户设置 | user_settings:{user_id} |
SettingsRepository | 用户个性化设置 |
设计原则:
- 核心业务数据必须永久保存,不设置 TTL
- 更新操作必须同步刷新所有相关索引键
- 使用
redis.set()而非redis.setex() - 依赖 RDB + AOF 持久化保证数据安全
临时缓存数据(有 TTL)
这些数据使用 redis.setex() 保存,具有明确的过期时间:
| 数据类型 | Key 模式 | TTL | 说明 |
|---|---|---|---|
| 交易会话费率 | trading:session:fee_config:{session_id} |
24小时 | 交易会话级别的费率缓存 |
设计原则:
- 仅用于真正的会话级或临时数据
- 必须明确 TTL 时长及过期后的影响
- 过期后可从源数据重新生成
代码约束
在 Repository 中保存数据时,必须遵循以下规则:
# 正确:核心业务数据永久保存
self.redis.set(user_key, user_dict)
# 错误:核心业务数据不应设置 TTL
self.redis.setex(user_key, 86400 * 30, user_dict)
# 正确:临时缓存数据设置合理的 TTL
self.redis.setex(session_key, 86400, session_data) # 24小时会话缓存
更新数据时,必须同步更新所有索引:
# 正确:同时更新数据和索引
def update_user(self, user_id: str, user_data: UserUpdate):
# 更新用户数据
self.redis.set(user_key, user_dict)
# 必须刷新索引!
username_key = self._get_user_by_username_key(user.username)
self.redis.set(username_key, user_id)
数据目录结构
/fire/
├── backend/ # 后端代码
│ ├── data/ # 数据目录
│ │ └── redis/ # Redis持久化数据
│ ├── logs/ # 日志目录
│ ├── backups/ # 备份目录
│ └── redis.conf # Redis配置文件
├── frontend/ # 前端代码
├── scripts/ # 脚本目录
├── output/ # 输出目录
├── .tmp/ # 临时目录
└── .env # 环境配置文件
备份和恢复
自动备份
- 启动时自动检查数据完整性
- 停止时自动保存数据快照
- 支持定时备份
手动备份
# 使用Redis管理脚本备份
./scripts/others/redis_manager.sh --backup
# 查看Redis状态
./scripts/others/redis_manager.sh --status
# 查看Redis详细信息
./scripts/others/redis_manager.sh --info
持久化测试
# 测试Redis持久化功能(包括重启恢复)
python scripts/others/test_redis_persistence.py
# 或通过API测试
curl http://localhost:8000/redis/status
curl http://localhost:8000/redis/test
curl http://localhost:8000/health
性能优化
内存配置
maxmemory 256mb
maxmemory-policy allkeys-lru
网络配置
bind 127.0.0.1
port 6379
timeout 300
tcp-keepalive 60
日志配置
loglevel notice
logfile ./logs/redis.log # 相对于backend目录
slowlog-log-slower-than 10000
slowlog-max-len 128
监控和健康检查
健康检查端点
# 检查Redis状态
curl http://localhost:8000/redis/status
# 测试Redis功能
curl http://localhost:8000/redis/test
# 系统健康检查
curl http://localhost:8000/health
监控指标
- 连接数:
connected_clients - 内存使用:
used_memory_human - 键数量:
dbsize - 持久化状态: RDB和AOF文件状态
故障排除
常见问题
- Redis连接失败
- 检查Redis服务是否启动
- 验证网络连接和端口
- 确认认证信息
- 数据丢失
- 检查持久化配置
- 查看备份文件
- 恢复数据
- 性能问题
- 检查内存使用
- 优化配置参数
- 监控慢查询
- 数据意外过期(认证失败、数据丢失等)
- 症状:用户无法登录(401错误)、数据无故消失
- 原因:代码中错误使用了
setex()给核心业务数据设置了 TTL - 检查方法:
# 检查 key 的 TTL,应该返回 -1(永久) redis-cli TTL "user:USER_ID" redis-cli TTL "user_by_username:USERNAME" - 修复方法:
# 临时修复:移除特定 key 的 TTL redis-cli PERSIST "user:USER_ID" # 永久修复:检查并修改 Repository 代码,使用 set() 而非 setex() - 预防措施:严格遵循本文档的数据持久化策略
日志分析
# 查看Redis日志
tail -f backend/logs/redis.log
# 查看慢查询
redis-cli slowlog get 10
# 查看内存使用
redis-cli info memory
安全配置
认证配置
# 设置密码
requirepass your-strong-password
# 禁用危险命令
rename-command FLUSHDB ""
rename-command FLUSHALL ""
网络安全
# 绑定特定IP
bind 127.0.0.1
# 设置超时
timeout 300
最佳实践
开发规范
- 数据持久化原则
- 核心业务数据使用
redis.set()永久保存 - 仅对会话、临时数据使用
redis.setex()设置 TTL - 更新操作必须同步刷新所有索引
- 禁止对核心业务数据设置任何形式的过期时间
- 核心业务数据使用
- Code Review 检查清单
- 新增的数据保存操作是否正确选择了
set()或setex() - 是否同步更新了所有相关的索引键
- 缓存数据的 TTL 时长是否合理
- 是否在表格中记录了新的数据类型和 Key 模式
- 新增的数据保存操作是否正确选择了
-
数据备份: 定期备份重要数据
-
监控告警: 设置内存和连接数告警
-
性能调优: 根据业务需求调整配置
-
安全加固: 设置强密码和网络限制
- 高可用: 生产环境使用Redis集群