1、什么热点key
在Redis中,我们把访问频率高的key,称为热点key。
如果某一热点key的请求到服务器主机时,由于请求量特别大,可能会导致主机资源不足,甚至宕机,从而影响正常的服务。
2、热点key会带来哪些问题
主要会带来这些问题: 资源过载或者内存资源紧张、负载不均衡、主从同步延迟、缓存击穿.
-
CPU资源过载:如果某个Key被频繁访问,处理这些请求的Redis实例可能出现CPU过载的情况,导致处理其他请求的能力下降,影响整体性能。
-
内存资源紧张:热点Key会占用Redis实例的大量内存资源,特别是如果这个Key的数据量较大,可能导致内存紧张,影响Redis的正常运行。
-
负载不均衡: 在Redis集群中,热点Key可能集中在某个或某几个节点上,导致这些节点的负载远高于其他节点。这种不均衡会导致集群的整体性能下降
-
主从同步延迟:如果Redis处于主从模式,热点Key的频繁访问会导致主节点压力增加,进而导致主从同步延迟,产生数据不一致的风险。这种情况在高并发场景下尤为明显。
-
缓存击穿:当一个热点Key的缓存失效后,大量请求直接穿透到Redis或后端数据库,造成瞬时的请求风暴,特别影响后端系统的性能,甚至可能导致Redis实例或后端服务崩溃。
3、哪些原因可能导致热点 key
很多原因都可能导致热点key,我给大家列举一下:
-
热门数据: 比如电商平台的一些爆款商品详情页、社交平台的热门帖子等,往往会被大量用户频繁访问,从而形成热点Key。
-
短时高并发:例如新闻网站上的突发新闻、秒杀活动中的商品信息等。这些Key的访问量在短时间内剧增,容易形成热点。
-
请求分片集中:在Redis集群中,某些固定名称的Key可能通过哈希分片集中到同一个节点。当这些Key的访问量突然激增时,该节点可能超出性能瓶颈,导致热点Key问题。
4、如何监测热点key
既然热点key可能带来一些问题,我们如何去检测redis的热点key呢? 常见的方案以后这些:
-
MONITOR
命令:可以实时监控Redis服务器执行的所有命令。通过分析这些命令,可以观察到哪些Key被频繁访问,识别出热点Key。不过,MONITOR
命令的开销较大,一般只在调试阶段使用。 -
自定义统计脚本:可以编写Lua脚本或使用Redis的命令组合(如
SCAN
、TTL
等)定期统计和记录访问频率高的Key。 -
Redis自带的分析工具:在Redis 4.0及以上版本中,
redis-cli
提供了--hotkeys
选项,可以帮助分析哪些Key是热点Key。 -
Redis监控工具:第三方监控工具(如RedisInsight、Prometheus等)可以实时监控Redis实例的性能数据,并通过设置监控指标和警报,自动检测出访问频率异常高的Key。
-
SLOWLOG
命令:SLOWLOG
可以记录执行时间较长的命令,尽管它主要用于监控慢查询,但如果某个Key的操作频繁导致命令变慢,也可以通过此方法发现热点Key。
5、如何识别热点key
在日常开发中,识别Redis中的热点Key可以通过以下几种方法:
-
凭经验判断哪些是热Key: 根据对业务的了解,判断哪些数据是访问频率最高的。例如,电商系统中的商品详情页、社交平台上的热门帖子、用户个人信息等数据通常容易成为热点Key。
-
客户端统计上报: 在Redis客户端(如Jedis、Lettuce)中添加统计代码,对每次对Redis的访问进行记录。可以统计每个Key的访问次数,并定期上报到监控系统。
-
服务代理层上报: 如果系统中使用了Redis代理(如Twemproxy、Codis、Redis Cluster等),可以在代理层添加统计功能,对经过代理的Redis请求进行统计,记录每个Key的访问频率。
6、如何解决热点key
常见的有这几种方式:Redis集群扩容、将热点Key分散到不同的服务器中、使用二级缓存(JVM本地缓存)
6.1 Redis集群扩容
通过增加Redis集群中的分片和副本,可以将负载分散到更多的服务器上,减轻单个节点的压力。特别是对于读操作,可以通过添加更多的副本来均衡读流量。
优点:通过水平扩展,Redis可以处理更大的负载,特别是针对高并发的读请求。
6.2 将热点Key分散到不同的服务器
通过改变Key的结构(如添加随机前缀),将同一个热点Key拆分成多个Key,使其分布在不同的Redis节点上,从而避免所有流量集中在一个节点上。
优点: 有效避免了单点瓶颈,提高了Redis集群的整体吞吐量。
6.3 使用二级缓存
在应用层引入本地缓存(如Guava Cache、Caffeine等),将热点数据缓存在JVM内存中,减少对Redis的直接访问,从而降低Redis的压力。
优点: 减少了对Redis的读请求,降低了热点Key带来的负载压力。
7、热点key 引申的一些后端思维
在热点key整个思考的过程,其实我们有很多后端思维可以参考。比如缓存设计、负载均衡与分片策略
7.1 缓存设计
在解决热点key问题的时候,我们提到用二级缓存来降低热点key的压力,其实在日常开发中,我们很多这种多级缓存的思想。
在系统设计中考虑多级缓存结构(如本地缓存 + Redis + CDN),减少对后端数据库的压力。每一级缓存应有合理的失效策略,以确保数据的准确性和一致性。
7.2 负载均衡与分片策略
redis的热点key 带来负载不均衡等问题。在日常开发中,我们可以在系统架构中引入有效的负载均衡策略,将请求均匀分配到不同的节点或实例上。负载均衡不仅限于Redis,还包括应用层、数据库等。
在解决热点key问题的时候,我们提到将热点Key分散到不同的服务器、Redis集群扩容。日常开发中,我们可以做一些分片优化,根据业务需求优化数据分片策略,确保数据分布的均衡,避免单点热点。对于热点Key,考虑自定义分片算法来分散负载。