说明:标题中的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飞起来。"

希望我的实战经验,能帮到你。