线上问题分析
# 1、大热key引发的问题
# 1.1、大热key的定义
大Key:大于1M或者Value超过5000个元素的一个KV存储;这是一个建议标准,在实际生产环境中,大Key对集群的影响还需考虑Key的访问频次,Key大且访问频次高容易超过Redis集群分片限流(200M/s限流)或者把Redis Server CPU打满,导致线上服务受影响。 热Key:当一个Key的访问频率或资源占用明显高于其他Key时,则称之为热Key。 例如:每秒处理1000次请求,其中有300次都是操作同一个Key;Redis实例带宽配额200MB/s,如带宽大部分是由于对某个Hash类型的Key执行HGETALL所占用;某个Key造成实例CPU使用率过高。
# 2、解决方案
由于Redis是单线程架构,扩容CPU并不能解决问题,需要业务方进行改造,可以参考的改造方案包括如下:
(1)第一个方案,可以考虑增加应用层的本地缓存;当发现热key后,将热key加载到系统JVM中,这样请求就会直接从JVM中获取,而不会直接打到Redis,减轻了Redis压力。
(2)第二个方案,可以考虑改造热key分布到不同分片;当发现热key后,将hotkey+随机数组合生成一个新key,打散到不同分片,这样就可以通过扩容分片,解决CPU 100%的问题。
(3)第三个方案,可以考虑开启腾讯云数据库Redis的读写分离功能(可能存在数据不一致的情况),这样就通过扩容只读副本的数量,提高读性能。
(4)第四个方案,业务上对value进行压缩,减少其大小。
# 参考文件
1、https://cloud.tencent.com/developer/article/1688082 2、http://xingyun.jd.com/shendeng/article/detail/40207?forumId=72&jdme_router=jdme://web/202206081297?url%3Dhttp%3A%2F%2Fsd.jd.com%2Farticle%2F40207