张伟帆(网易严选技术团队)
RedisTemplate是Spring封装的一个最常用的redis数据访问工具类,功能强大,使用简洁。但在RedisTemplate看似简单的API下,也是暗流涌动,背后别有一番洞天。本文从一个线上性能问题入手,抽丝剥茧一步步探索RedisTemplate,挖出了RedisTemplate操作psetex命令的深坑。
一、背景
在之前的压测过程中,商详页面RT居高不下,发现yx_malltech_user这个redis集群的异常报警,起初是在业务没有开启分流读的情况下,一个Redis集群slave节点存在大量连接,占用大量CPU资源,且导致redis主从断掉等异常行为。
dba分析后发现,从数据库实时监控平台,可以看到有大量的cluster命令产生,且这个请求一直存在,只是压测流量过大,导致问题放大,单个cluster命令请求都是在30毫秒以上。都是打到随机一个NODE节点上,导致这个节点cpu飙升。
然后DBA开始相应的处理,包括但不限于单独隔离异常节点到独立机器上,配置参数优化等,问题没有根本解决。可以确定不是Redis服务端问题,应该是业务代码端问题,需要从业务用法开始排查使用方式,看是如何触发了大量的cluster命令。
6.9单压商详发现问题还是存在。开始我们的排查之路。
二、服务信息
- 涉及服务:yanxuan-app
- 涉及场景:商详
- spring版本:4.0.8
- spring-data-redis版本:1.8.4.RELEASE
- jedis版本:2.9.0
三、分析过程
1. 监控观察
既然是cluster命令异常过多,我们观察下监控数据。
6.9号下午对于商详的单压