说明:标题中的Redis 7.2在本文写作时(2023年4月)尚未发布(Redis 7.2于2023年8月发布)。
本文基于我使用Redis的实战经验,分享Redis性能优化的方法,从慢到快,包括问题诊断、优化策略、最佳实践,以及我的经验教训。
一、我的Redis优化经历
1. 从慢到快
我经历过一次Redis从慢到快的优化。
- 系统响应越来越慢
- 接口超时越来越多
- 排查发现是Redis的问题
- 经过一系列优化
- 性能提升了好几倍
那次优化,让我学到了很多。
2. 优化的过程
优化的过程:
- 发现问题
- 诊断原因
- 制定方案
- 实施优化
- 验证效果
- 持续监控
优化,是一个系统工程。
3. 踩过的坑
优化过程中踩过很多坑。
- 大key问题
- 热key问题
- 缓存穿透
- 缓存雪崩
- 内存满了
每个坑,都是一次学习。
二、问题诊断
1. 慢查询日志
诊断第一步:看慢查询日志。
# 查看慢查询配置
CONFIG GET slowlog-log-slower-than
CONFIG GET slowlog-max-len
# 查看慢查询
SLOWLOG GET 10- 找到慢的命令
- 分析为什么慢
- 针对性优化
慢查询日志,是诊断的起点。
2. INFO命令
诊断第二步:用INFO命令。
# 查看服务器信息
INFO server
INFO clients
INFO memory
INFO stats
INFO commandstats- 看连接数
- 看内存使用
- 看命令统计
- 看关键指标
INFO,是Redis的体检报告。
3. MONITOR命令
诊断第三步:用MONITOR。
# 实时查看命令
MONITOR- 看实时执行的命令
- 发现异常命令
- 但会影响性能
- 不要在生产环境长时间用
MONITOR,是实时诊断工具。
4. 客户端工具
诊断第四步:用客户端工具。
- redis-cli
- RedisInsight
- 第三方监控工具
- 可视化查看
- 更直观
工具,提高诊断效率。
三、常见性能问题
1. 大key问题
问题一:大key。
- 一个key存了大量数据
- 读取慢
- 删除慢
- 阻塞Redis
- 影响其他命令
大key,是Redis的常见问题。
解决方法:
- 拆分大key
- 用hash代替string
- 分批删除
- 定期检查
2. 热key问题
问题二:热key。
- 某个key访问量特别大
- 单个节点压力大
- 可能导致节点宕机
- 影响整个系统
热key,是高并发下的常见问题。
解决方法:
- 本地缓存
- key分片
- 读写分离
- 热点数据预热
3. 缓存穿透
问题三:缓存穿透。
- 查询不存在的数据
- 缓存不命中
- 每次都查数据库
- 数据库压力大
缓存穿透,是缓存的常见问题。
解决方法:
- 缓存空值
- 布隆过滤器
- 参数校验
4. 缓存雪崩
问题四:缓存雪崩。
- 大量key同时过期
- 缓存全部失效
- 请求全部打到数据库
- 数据库压力大
缓存雪崩,可能导致系统崩溃。
解决方法:
- 过期时间加随机值
- 多级缓存
- 熔断降级
- 永不过期+异步更新
5. 内存满了
问题五:内存满了。
- Redis内存用满
- 无法写入
- 触发淘汰策略
- 可能丢失数据
内存,是Redis的生命线。
解决方法:
- 扩容
- 优化数据结构
- 设置过期时间
- 调整淘汰策略
四、优化策略
1. 数据结构优化
优化一:数据结构优化。
- 用对数据结构
- hash代替string
- zset代替list+排序
- bitmap代替set
- 选择合适的数据结构
数据结构,决定了性能。
2. 命令优化
优化二:命令优化。
- 避免keys *
- 避免hgetall大hash
- 用scan代替keys
- 用pipeline批量操作
- 用lua脚本减少网络开销
命令,是性能的关键。
3. 连接优化
优化三:连接优化。
- 使用连接池
- 避免频繁创建连接
- 合理设置连接数
- 超时设置
- 长连接
连接,影响性能和稳定性。
4. 持久化优化
优化四:持久化优化。
- RDB和AOF的选择
- AOF重写
- 合理配置持久化策略
- 不要在高峰期做持久化
- 持久化会影响性能
持久化,是数据安全的保障。
5. 内存优化
优化五:内存优化。
- 压缩列表
- 共享对象
- 合理设置过期时间
- 定期清理无用数据
- 内存淘汰策略
内存,是Redis的核心资源。
五、架构优化
1. 主从复制
架构优化一:主从复制。
- 主库写
- 从库读
- 读写分离
- 提高读性能
- 提高可用性
主从复制,是高可用的基础。
2. 哨兵模式
架构优化二:哨兵模式。
- 自动故障转移
- 监控主从状态
- 自动切换主库
- 提高可用性
- 适合中小规模
哨兵,是高可用的保障。
3. 集群模式
架构优化三:集群模式。
- 数据分片
- 水平扩展
- 提高容量和性能
- 适合大规模
- Redis Cluster
集群,是大规模的解决方案。
4. 多级缓存
架构优化四:多级缓存。
- 本地缓存
- Redis缓存
- 数据库
- 多级缓存
- 提高性能,降低Redis压力
多级缓存,是高并发的利器。
5. 代理层
架构优化五:代理层。
- Twemproxy
- Codis
- Redis Proxy
- 统一入口
- 分片、限流、监控
代理层,是架构的扩展。
六、最佳实践
1. key设计
最佳实践一:key设计。
- key要简洁
- 用冒号分隔
- 有业务前缀
- 不要太长
- 统一命名规范
例子:
user:1001:info
order:2023:04:1001
product:category:1好的key设计,便于管理。
2. 过期时间
最佳实践二:过期时间。
- 每个key都设置过期时间
- 不要永不过期
- 过期时间加随机值
- 避免同时过期
- 定期清理
过期时间,是内存管理的关键。
3. 批量操作
最佳实践三:批量操作。
- 用pipeline
- 用mget、mset
- 减少网络往返
- 提高吞吐量
- 但不要一次太多
批量操作,提高效率。
4. 监控告警
最佳实践四:监控告警。
- 监控内存
- 监控QPS
- 监控慢查询
- 监控连接数
- 设置告警
监控,是稳定运行的保障。
5. 容量规划
最佳实践五:容量规划。
- 预估数据量
- 预估QPS
- 预留扩容空间
- 定期评估
- 提前扩容
容量规划,避免被动。
七、我的优化案例
1. 案例一:大key优化
案例一:大key优化。
问题:
- 一个hash存了100万条数据
- hgetall要几秒
- 阻塞Redis
优化:
- 拆分成多个小hash
- 用hscan分批读取
- 性能提升明显
2. 案例二:热key优化
案例二:热key优化。
问题:
- 某个商品key访问量特别大
- 单个Redis节点压力大
- 响应变慢
优化:
- 加本地缓存
- key分片
- 读写分离
- 性能提升
3. 案例三:缓存穿透优化
案例三:缓存穿透优化。
问题:
- 恶意查询不存在的id
- 缓存不命中
- 数据库压力大
优化:
- 缓存空值
- 布隆过滤器
- 参数校验
- 问题解决
4. 案例四:内存优化
案例四:内存优化。
问题:
- Redis内存用了80%
- 快满了
- 有被淘汰的风险
优化:
- 清理无用key
- 优化数据结构
- 设置过期时间
- 内存降到40%
八、经验教训
1. 不要忽视监控
第一个教训:不要忽视监控。
- 没有监控,出了问题都不知道
- 要建立完善的监控体系
- 关键指标要告警
- 定期看监控
- 防患于未然
监控,是稳定的保障。
2. 不要在高峰期做危险操作
第二个教训:不要在高峰期做危险操作。
- 不要在高峰期删大key
- 不要在高峰期做持久化
- 不要在高峰期重启
- 不要在高峰期扩容
- 危险操作选低峰期
高峰期,要谨慎。
3. 不要过度设计
第三个教训:不要过度设计。
- 小项目不要上集群
- 简单需求不要搞复杂
- 够用就好
- 过度设计增加复杂度
- 增加维护成本
简单,是最好的设计。
4. 要做好备份
第四个教训:要做好备份。
- 数据很重要
- 要定期备份
- 要测试恢复
- 不要等丢了数据才后悔
- 备份是最后的防线
备份,是数据安全的保障。
5. 要持续学习
第五个教训:要持续学习。
- Redis在更新
- 新特性、新功能
- 要持续学习
- 关注最佳实践
- 不断优化
学习,是进步的动力。
九、写在最后
Redis性能优化实战,从慢到快。
问题诊断:慢查询日志、INFO命令、MONITOR、客户端工具。常见问题:大key、热key、缓存穿透、缓存雪崩、内存满了。优化策略:数据结构、命令、连接、持久化、内存。架构优化:主从复制、哨兵、集群、多级缓存、代理层。最佳实践:key设计、过期时间、批量操作、监控告警、容量规划。
2023年了,Redis依然是最流行的缓存数据库。性能优化,是每个Redis使用者的必修课。不要等出了问题才优化,要提前规划,持续优化。
最后,用一句话总结:"Redis性能优化,没有银弹,只有方法。诊断问题,对症下药,持续优化,你也能让Redis飞起来。"
希望我的实战经验,能帮到你。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录