Files

244 lines
5.6 KiB
Markdown
Raw Permalink Normal View History

# Sub2API Redis 连接池优化配置
## 📊 当前配置分析
根据 `backend/internal/repository/redis.go` 分析,当前 Redis 配置支持:
```go
opts := &redis.Options{
Addr: cfg.Redis.Address(),
Password: cfg.Redis.Password,
DB: cfg.Redis.DB,
DialTimeout: time.Duration(cfg.Redis.DialTimeoutSeconds) * time.Second,
ReadTimeout: time.Duration(cfg.Redis.ReadTimeoutSeconds) * time.Second,
WriteTimeout: time.Duration(cfg.Redis.WriteTimeoutSeconds) * time.Second,
PoolSize: cfg.Redis.PoolSize,
MinIdleConns: cfg.Redis.MinIdleConns,
}
```
## 🎯 推荐配置
### 小规模部署(< 1000 QPS
```yaml
# config.yaml
redis:
dial_timeout_seconds: 5
read_timeout_seconds: 3
write_timeout_seconds: 3
pool_size: 50
min_idle_conns: 10
```
### 中等规模1000-5000 QPS
```yaml
# config.yaml
redis:
dial_timeout_seconds: 3
read_timeout_seconds: 2
write_timeout_seconds: 2
pool_size: 100
min_idle_conns: 20
```
### 大规模部署5000-20000 QPS
```yaml
# config.yaml
redis:
dial_timeout_seconds: 2
read_timeout_seconds: 1
write_timeout_seconds: 1
pool_size: 200
min_idle_conns: 50
```
### 超大规模(> 20000 QPS
```yaml
# config.yaml
redis:
dial_timeout_seconds: 1
read_timeout_seconds: 1
write_timeout_seconds: 1
pool_size: 500
min_idle_conns: 100
```
## 🔧 配置参数详解
### PoolSize
| 场景 | 推荐值 | 说明 |
|------|--------|------|
| 小规模 | 50-100 | 单实例足够 |
| 中等 | 100-200 | 覆盖正常并发 |
| 大规模 | 200-500 | 需要配合应用水平扩展 |
**计算公式**
```
PoolSize = 预期最大并发请求数 × 1.2 (缓冲)
```
### MinIdleConns
| 场景 | 推荐值 | 说明 |
|------|--------|------|
| 小规模 | 10-20 | 减少冷启动延迟 |
| 中等 | 20-50 | 保持热连接 |
| 大规模 | 50-100 | 高可用预热 |
**原则**`MinIdleConns = PoolSize * 0.2 ~ 0.3`
### 超时配置
| 参数 | 推荐值 | 说明 |
|------|--------|------|
| DialTimeout | 2-5秒 | 建连超时,过长会阻塞 |
| ReadTimeout | 1-3秒 | 读取超时,应小于请求超时 |
| WriteTimeout | 1-3秒 | 写入超时,应小于请求超时 |
**重要**:超时配置应小于上游 API 超时,避免级联超时
## 📈 性能调优步骤
### 1. 基准测试
```bash
# 使用 redis-benchmark
redis-benchmark -h localhost -p 6379 -n 100000 -c 50 -t get,set,hget,hset -d 100
# 测试 Pipeline 性能
redis-benchmark -h localhost -p 6379 -n 10000 -P 10 -t get,set
```
### 2. 监控关键指标
```promql
# Redis 连接使用率
sub2api_redis_connections{state="total"} / <pool_size> * 100
# Redis 操作延迟
rate(sub2api_http_request_duration_seconds{path="/metrics"}[5m])
# 缓存命中率
sub2api_cache_operations_total{result="hit"} /
(sub2api_cache_operations_total{result="hit"} + sub2api_cache_operations_total{result="miss"})
```
### 3. 常见问题排查
**问题:高 Redis 延迟**
- 检查网络延迟:`redis-cli --latency-history`
- 检查慢查询:`redis-cli SLOWLOG GET 10`
- 优化 KEY 设计,减少大 Value
**问题:连接池耗尽**
- 增加 `PoolSize`
- 检查是否存在连接泄漏
- 考虑使用 Redis Cluster
**问题:缓存命中率低**
- 分析缓存 Key 访问模式
- 调整 TTL 配置
- 检查缓存失效策略
## 🚀 Redis 服务端优化
### 单机 Redis 配置
```conf
# redis.conf
# 网络优化
tcp-backlog 511
timeout 300
tcp-keepalive 300
# 内存优化
maxmemory 2gb
maxmemory-policy allkeys-lru
# 持久化优化(根据业务选择)
rdbcompression yes
rdbchecksum yes
save 900 1
save 300 10
save 60 10000
# AOF 优化
appendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 客户端优化
client-output-buffer-limit normal 256mb 64mb 60
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
```
### Redis Cluster 配置(大规模)
```yaml
# redis-cluster.yaml
cluster-enabled: yes
cluster-config-file: nodes.conf
cluster-node-timeout: 15000
cluster-replica-validity-factor: 10
cluster-migration-barrier: 1
cluster-require-full-coverage: yes
```
## 📊 Sub2API 缓存策略分析
### 当前缓存层次
1. **L1 缓存**: go-cache (内存)
- `userGroupRateCache`: 30秒 TTL
- `modelsListCache`: 15秒 TTL
2. **L2 缓存**: Redis
- API Key 认证缓存
- 用户组速率限制缓存
- 调度器快照缓存
### 缓存 Key 设计建议
```
# 推荐格式
{sub2api}:{module}:{entity}:{id}:{field}
{sub2api}:auth:apikey:{key_hash}
{sub2api}:ratelimit:user:{user_id}:{window}
{sub2api}:gateway:scheduler:{account_id}
```
### 缓存 TTL 建议
| 缓存类型 | 推荐 TTL | 说明 |
|----------|----------|------|
| API Key 认证 | 5-15分钟 | 平衡一致性和性能 |
| 用户组速率 | 30秒-1分钟 | 需要实时性 |
| 调度器快照 | 1-5分钟 | 允许一定延迟 |
| 模型列表 | 15-30秒 | 变化较频繁 |
| 计费数据 | 5-15分钟 | 允许批处理延迟 |
## ⚠️ 注意事项
1. **不要设置过大的 PoolSize**:每个连接占用约 10KB 内存
2. **监控连接泄漏**:确保连接被正确释放
3. **考虑读写分离**:大量读操作可以分摊到从节点
4. **使用 Pipeline**:批量操作减少 RTT
5. **避免大 Value**:单 Key 建议 < 1MB
## 📊 性能基线参考
| Redis 配置 | 1K QPS | 5K QPS | 10K QPS | 20K QPS |
|-----------|--------|--------|---------|---------|
| 50/10 | 5ms | 15ms | 40ms | 100ms |
| 100/20 | 3ms | 8ms | 20ms | 50ms |
| 200/50 | 2ms | 5ms | 12ms | 30ms |
| 500/100 | 1ms | 3ms | 8ms | 20ms |