运维反馈,阿里云的 redis CPU 狂飙,CPU 快要 100%了。
排查步骤:
第一步:导致 redis CPU 飙升的 原因
根据阿里云帮助文档提供的,去排查问题。
第二步:检查自己的版本代码里面,是否有类似的 命令
例如FLUSHALL、KEYS、HGETALL等
果然,发现疑似问题
14号下午,发布了一个新版本, 里面携带了代码keys 如果是一个低频的keys查询,那还好,不会CPU 100
但是区区致命伤, 这还是一个 高频触发 的代码
逻辑也很简单,给关注事件的其他的用户,发一个消息提醒。
String queueReminderKey = RedisConstant.QUEUE_REMINDER_KEY.formatted(queueNumber.getShopId(), queueNumber.getTag(), StringPool.ASTERISK);
Set<String> keys = stringRedisTemplate.keys(queueReminderKey);
if (CollectionUtils.isNotEmpty(keys) && getBeforeNum(queueNumber.getShopId(), queueNumber.getTag()) > 0) {
Set<String> unionIdSet = new HashSet<>(Objects.requireNonNull(stringRedisTemplate.opsForValue().multiGet(keys)));
messageService.sendReminder(unionIdSet, queueNumber);
}
重点:这行
Set keys = stringRedisTemplate.keys(queueReminderKey);
第三步:去阿里云,确认是否,有类似的 慢查询日志
但是,遗憾的是,小版本根本没有这东西
于是乎,只能先升级redis小版本,等待明天确认
等到第二天,redis升级了小版本,观察慢查询。果然,发现了问题
KEYS xx_system:shop:1375343245688:tag:B:reminder:*
// 列表关注,完整 key = xx_system:shop:{shopId}:tag:{tag}:reminder:{unionId}
public static String REMINDER_KEY = "xx_system:shop:%s:tag:%s:reminder:%s";
com.xx.xx.components.state.impl.queue.QueueTakeState.java 82
org.springframework.data.redis.core.RedisTemplate#keys