odmin 发表于 2023-11-5 00:31:56

redis中什么是热点Key?该如何解决?

在 Redis 中,经常被访问的 key 被称为热点 key。

产生原因和危害
原因
热点 key 问题产生的原因可以归纳为以下两种情况:

用户对于某些数据的访问频率远大于数据的生产频率,这类数据包括热门商品、热点新闻、热点评论以及明星直播等。

在日常工作生活中,突发事件(如双十一期间商品降价促销)可能导致某些热门商品被大量点击浏览或购买,产生了巨大的需求量。类似地,热点新闻、热点评论和明星直播等引起大量刊发和浏览的情况也是典型的读多写少场景,它们会产生热点问题。

请求集中在分片集群中,超过单个服务器的性能极限。在服务端进行数据访问时,通常会对数据进行分片切分,其中某个服务器上的热点 Key 访问量超过了其承载能力的极限,从而导致热点 Key 问题的出现。

危害
1、流量集中,超过物理网卡的处理能力上限。

2、请求过多,导致缓存分片服务崩溃。

3、数据库击穿,引发业务雪崩。

发现热点 key
预估发现
针对业务,可以提前预估出访问频繁的热点 Key,例如在秒杀商品业务中,秒杀商品就是热点 Key 的典型案例。

然而,并非所有业务都容易预估出热点 Key,有时可能会出现对热点 Key 的遗漏或预估错误的情况。

客户端发现
客户端实际上是离” 热点 Key” 最近的位置,因为 Redis 命令是由客户端发送的。以 Jedis 为例,在核心命令入口处使用 Google Guava 中的 AtomicLongMap 可以方便地记录热点 Key 的访问情况,示例如下:

然而,使用客户端进行热点 Key 的统计也存在一些问题:

(1) 无法预知热点 Key 的数量,可能存在内存泄露的风险。

(2) 在不同的客户端代码中需要维护此逻辑,可能增加维护成本。

(3) 在规模化汇总方面的实现相对复杂。

Redis 发现
monitor 命令
使用 Redis 的 monitor 命令,可以监控到 Redis 执行的所有命令。通过解析 monitor 的结果,我们可以统计一段时间内的热点 Key 排行榜、命令排行榜以及客户端分布等数据。这种方法能够提供更详细的信息,帮助我们深入了解 Redis 的使用情况。需要注意的是,在生产环境中使用 monitor 命令可能对性能产生一定的影响,因此应该谨慎使用,并注意网络开销和输出缓冲区的消费速度。



Redis-Faina 是 FB 开源的一款使用 Python 语言实现的工具。它利用上述原理可以获取最近 10 万条命令的热点 Key、热点命令以及命令执行的耗时分布等数据。为了减少网络开销并提高输出缓冲区的消费速度,Redis-Faina 会尽可能地在本机执行 monitor 命令。使用 Redis-Faina 可以更详细地了解 Redis 的使用情况。需要注意,在生产环境中使用该工具时应考虑性能影响和安全性。

此种方法存在两个问题:

1、在高并发条件下,使用 monitor 命令会导致内存暴增,同时可能影响 Redis 的性能。因此,这种方法适合在短时间内使用,而不适合长时间或高并发的监控。

2、monitor 命令只能统计单个 Redis 节点的热点 key,对于 Redis 集群,需要进行汇总统计才能获取全集群的热点 key 信息。

可以参考的框架:FB 开源的 redis-faina 正是利用上述原理使用 Python 语言实现的

hotkeys
Redis 在版本 4.0.3 中为 redis-cli 提供了 --hotkeys 选项,用于方便地找到热点 key。通过使用该选项,我们可以快速获取到 Redis 中的热点 key 信息。这个功能的引入为我们在分析和优化 Redis 性能时提供了更方便和直接的工具。需要注意的是,确保 Redis 版本符合要求,并使用适当的命令行选项来获得所需的热点 key 信息。
页: [1]
查看完整版本: redis中什么是热点Key?该如何解决?