第 8 课:Redis 性能优化与最佳实践
8.1 性能优化
Redis 性能优化的核心目标是:
- 提高吞吐量
- 降低延迟
- 减少内存占用
- 提升系统稳定性
常见优化方案
| 优化项 | 说明 |
|---|---|
| 使用连接池 | 避免频繁创建和销毁连接 |
| 合理设置过期时间 | 及时清理过期数据 |
| 批量操作 | 减少网络往返次数 |
| 避免使用 Keys | 防止阻塞 Redis |
| 合理选择数据结构 | 提高性能和节省内存 |
| 开启持久化 | 提高数据安全性 |
| 使用集群 | 提高系统容量和并发能力 |
推荐做法
使用连接池
避免:
new Jedis("localhost",6379);
推荐:
JedisPool pool = new JedisPool(config);
Jedis jedis = pool.getResource();
批量操作
避免:
set user:1 zhangsan
set user:2 lisi
set user:3 wangwu
推荐:
mset user:1 zhangsan user:2 lisi user:3 wangwu
读取:
mget user:1 user:2 user:3
避免使用 Keys
危险:
keys *
原因:
- O(N) 时间复杂度
- 数据量大时会阻塞 Redis
推荐:
scan 0
合理使用数据结构
| 场景 | 推荐结构 |
|---|---|
| 用户信息 | Hash |
| 阅读量 | String |
| 消息队列 | List |
| 标签系统 | Set |
| 排行榜 | ZSet |
持久化最佳配置
同时开启:
- RDB
- AOF
推荐配置:
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000
使用 Redis 集群
适用于:
- 数据量超过单机容量
- QPS 过高
- 需要高可用
8.2 内存优化
Redis 是内存数据库,因此内存优化十分重要。
使用 Hash 代替 String
不推荐:
set user:1001:name zhangsan
set user:1001:age 20
set user:1001:gender male
推荐:
hset user:1001 name zhangsan age 20 gender male
优点:
- 节省内存
- 查询方便
- 更新灵活
设置合理过期时间
示例:
setex code 300 123456
避免:
set user:1001 data
永不过期的数据会长期占用内存。
压缩大 Value
例如:
- JSON
- 图片信息
- 大文本内容
压缩方式:
- GZIP
- Snappy
- LZ4
示例:
String compressData = gzip(jsonString);
redisUtil.set(key, compressData);
避免存储大 Value
建议:
| 数据类型 | 推荐大小 |
|---|---|
| String | < 1MB |
| Hash Field | < 10KB |
| List 元素 | < 10KB |
避免:
set article:1 [10MB内容]
使用内存淘汰策略
配置:
# 最大内存
maxmemory 1gb
# 淘汰策略
maxmemory-policy allkeys-lru
常见淘汰策略
| 策略 | 说明 |
|---|---|
| allkeys-lru | 淘汰最近最少使用键(推荐) |
| volatile-lru | 淘汰设置过期时间的键 |
| allkeys-random | 随机淘汰 |
| volatile-random | 随机淘汰带过期时间键 |
| volatile-ttl | 淘汰即将过期键 |
| noeviction | 不淘汰,直接报错 |
推荐:
maxmemory-policy allkeys-lru
8.3 安全配置
生产环境 Redis 必须进行安全加固。
设置密码
配置:
requirepass yourpassword
连接:
redis-cli -a yourpassword
绑定 IP
仅允许本机访问:
bind 127.0.0.1
如果需要远程连接:
bind 0.0.0.0
同时配合防火墙限制访问来源。
禁用危险命令
配置:
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command KEYS ""
rename-command CONFIG ""
作用:
防止误操作导致:
- 数据清空
- 配置泄露
- 性能问题
使用防火墙
Linux:
ufw allow 6379/tcp
或者:
iptables -A INPUT -p tcp --dport 6379 -j DROP
建议:
仅开放给业务服务器访问。
8.4 最佳实践
键命名规范
推荐:
user:1001
product:2001
order:3001
cart:1001
article:view:100
命名规则:
业务名:对象ID[:属性]
示例:
user:1001
user:1001:token
product:2001
order:5001
不存储敏感数据
避免:
密码
银行卡号
身份证号
手机号明文
推荐:
加密后存储
脱敏后存储
定期备份
备份文件:
dump.rdb
appendonly.aof
建议:
- 每日备份
- 异地备份
- OSS 备份
监控 Redis
常用命令:
info
查看:
内存使用情况
CPU占用
连接数
命中率
主从状态
慢查询分析
开启:
slowlog-log-slower-than 10000
slowlog-max-len 128
查看:
slowlog get
避免耗时操作
不要:
keys *
flushall
lrange key 0 1000000
推荐:
scan
8.5 常见问题排查
Redis 连接超时
排查:
检查服务状态
ps -ef | grep redis
测试端口
telnet ip 6379
查看配置
redis-cli ping
返回:
PONG
说明连接正常。
Redis 内存不足
查看:
info memory
重点关注:
used_memory
maxmemory
解决:
- 增加内存
- 设置过期时间
- 删除无用数据
- 开启淘汰策略
Redis 性能下降
查看:
info stats
分析:
slowlog get
检查是否存在:
keys *
大Key
慢查询
频繁持久化
数据丢失
检查:
RDB 是否开启
config get save
AOF 是否开启
config get appendonly
查看结果:
appendonly
yes
说明已开启。
本课总结
Redis 性能优化重点
- 使用连接池
- 批量操作
- 合理选择数据结构
- 避免 Keys
- 合理设置过期时间
Redis 内存优化重点
- Hash 替代 String
- 控制 Value 大小
- 设置淘汰策略
Redis 安全重点
- 设置密码
- 限制访问 IP
- 禁用危险命令
- 配置防火墙
Redis 高性能架构重点
- 主从复制
- 哨兵模式
- Redis Cluster
课后练习
练习 1
配置 Redis 内存淘汰策略:
maxmemory 512mb
maxmemory-policy allkeys-lru
观察内存达到上限后的表现。
练习 2
开启慢查询日志:
slowlog-log-slower-than 10000
执行大量命令并查看:
slowlog get
练习 3
配置 Redis 安全策略:
requirepass yourpassword
rename-command FLUSHALL ""
rename-command KEYS ""
测试效果。
练习 4
使用 Redis Benchmark 测试性能:
redis-benchmark -h localhost -p 6379 -n 100000 -c 50
分析:
- QPS
- 平均响应时间
- 最大响应时间
练习 5
整理一份 Redis 生产环境配置文件:
- 持久化
- 安全配置
- 内存优化
- 集群配置
形成自己的 Redis 运维手册。