🇨🇳 简体中文
🇺🇸 English
🇯🇵 日本語
Skip to the content.

Redis配置文档

概述

量化交易系统使用Redis作为主数据存储和会话缓存,支持开发环境和生产环境的不同配置。

重要说明:Redis 在本系统中是持久化存储,而非临时缓存。所有核心业务数据(用户、账户、配置等)均永久保存,通过 RDB + AOF 双重持久化机制保证数据安全。

环境配置

开发环境

生产环境

配置参数

环境变量

# 基础配置
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.setex() 保存,具有明确的过期时间:

数据类型 Key 模式 TTL 说明
交易会话费率 trading:session:fee_config:{session_id} 24小时 交易会话级别的费率缓存

设计原则

代码约束

在 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

监控指标

故障排除

常见问题

  1. Redis连接失败
    • 检查Redis服务是否启动
    • 验证网络连接和端口
    • 确认认证信息
  2. 数据丢失
    • 检查持久化配置
    • 查看备份文件
    • 恢复数据
  3. 性能问题
    • 检查内存使用
    • 优化配置参数
    • 监控慢查询
  4. 数据意外过期(认证失败、数据丢失等)
    • 症状:用户无法登录(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

最佳实践

开发规范

  1. 数据持久化原则
    • 核心业务数据使用 redis.set() 永久保存
    • 仅对会话、临时数据使用 redis.setex() 设置 TTL
    • 更新操作必须同步刷新所有索引
    • 禁止对核心业务数据设置任何形式的过期时间
  2. Code Review 检查清单
    • 新增的数据保存操作是否正确选择了 set()setex()
    • 是否同步更新了所有相关的索引键
    • 缓存数据的 TTL 时长是否合理
    • 是否在表格中记录了新的数据类型和 Key 模式
  3. 数据备份: 定期备份重要数据

  4. 监控告警: 设置内存和连接数告警

  5. 性能调优: 根据业务需求调整配置

  6. 安全加固: 设置强密码和网络限制

  7. 高可用: 生产环境使用Redis集群