Redis读取慢的主要原因是网络延迟、序列化开销大、命令使用不当和实例配置问题。优化策略包括:使用Pipeline批量操作减少RTT;选择合适数据结构如Hash代替String;开启压缩减少数据传输量;调整timeout和tcp-keepalive参数;排查时用redis-cli --latency监控延迟,用slowlog查看慢命令。
来源1
为什么Redis get set 这么慢?明明内存操作,单线程模型,网络是瓶颈!RTT一次网络来回就是1ms,对于10万QPS就是10%的CPU浪费。优化:用pipeline打包命令,一次RTT搞定批量操作,QPS翻倍不是梦。
来源2
Redis读数据慢爆了?检查你的序列化!Java用户别用JDK默认序列化,体积大速度慢,换成Kryo或Protostuff,体积压缩90%,速度提升5倍。记得设置value-encoder。
来源3
大Key是Redis慢查询杀手!一个String存1MB数据,get时内存拷贝开销巨大。拆分!用Hash,每个field存小块数据,访问粒度细,读写飞起。scan命令别用count=10000,会卡死。
来源4
排查Redis慢读第一步:redis-cli --latency -h host -p port,观察latency直方图,高峰延迟在哪里。用slowlog get 10,看最慢10个命令,通常是keys * 或smembers大set。实例内存快满了也会慢,info memory监控used_memory。
来源5
优化技巧:连接池配置maxTotal太小导致频繁建连,maxIdle设低点;timeout太短频繁重连;用长连接+keepalive。集群模式下读从slave,但slave延迟同步也慢,用wait命令确保一致性。
来源6
数据倾斜!热点key全打一个slot,单节点爆炸。用hash_tag均匀分布,或客户端本地cache热点数据。开启lazyfree-lazy-evict,删除大key不阻塞主线程。
FAQ
Q: Redis get为什么比本地Map慢?
A: 网络RTT是主因,优化pipeline和本地缓存。
Q: 慢查询日志怎么看?
A: slowlog get 100,分析耗时命令。
Q: 大Value怎么处理?
A: 拆分成Hash或List,避免单key超10KB。
Q: 集群读慢咋办?
A: 读从从节点,监控repl_backlog。