Redis案例:热key导致实例CPU 100%

时间:2022-07-24
本文章向大家介绍Redis案例:热key导致实例CPU 100%,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

在Redis世界里,热key指的是那些在一段时间内访问频率特别高的键值,具体到业务场景,包括热点新闻、热门直播、秒杀活动等等。

热key的问题在于,可能会导致Redis实例CPU使用率100%,或者是网卡流量达到上限等,对系统的稳定性和可用性造成影响;接下来我们看看,在腾讯云数据库Redis中,如何及时发现和解决热key问题。

问题排查

(1)我们可以通过以下命令来进行热key模拟(任意一个都可以)

# redis-benchmark -h xxx -p xxx -a xxx -c 1000 -n 100000000 -t get
# redis-benchmark -h xxx -p xxx -a xxx -c 1000 -n 100000000 script load "redis.call('get','xxx')"

(2)在 控制台-系统监控-监控指标 界面,查看CPU使用率监控,发现一个分片CPU使用率达到100%

(3)在 控制台-系统监控-监控指标 界面,查看请求数监控,发现一个分片请求数很高

(4)在 控制台-系统监控-访问分析 界面,进一步查看监控,发现消耗CPU的命令主要是get和script

(5)在 控制台-系统监控-Key分析 界面,我们可以找出导致CPU打满的罪魁祸首—热key,即key:__rand_int__这个键

解决方案

由于Redis是单线程架构,扩容CPU并不能解决问题,需要业务方进行改造,可以参考的改造方案包括如下:

(1)第一个方案,可以考虑增加应用层的本地缓存;当发现热key后,将热key加载到系统JVM中,这样请求就会直接从JVM中获取,而不会直接打到Redis,减轻了Redis压力。

(2)第二个方案,可以考虑改造热key分布到不同分片;当发现热key后,将hotkey+随机数组合生成一个新key,打散到不同分片,这样就可以通过扩容分片,解决CPU 100%的问题。

(3)第三个方案,可以考虑开启腾讯云数据库Redis的读写分离功能(可能存在数据不一致的情况),这样就通过扩容只读副本的数量,提高读性能。