今天我们来探讨与之相关的概念——hotkey(热 Key)。在面试中,常常会涉及到这两者的比较,即便你不打算参加面试,了解它们在实际开发中的应用也非常有用。

什么是热Key(hotkey)?

热Key是指那些访问频率显著高于其他key的键。例如,当Redis实例每秒处理请求高达5000次,而某个特定的key每秒被访问2000次时,这个key就被称为hotkey。热Key的产生往往与特定事件相关,如热点新闻、秒杀活动等。

热Key的潜在危害

处理热Key会消耗大量CPU和带宽,可能会影响Redis实例对其他请求的正常响应。如果热Key的请求量突然超出Redis的处理能力,可能导致Redis宕机。在这种情况下,后续请求将转向数据库,极有可能导致数据库崩溃。因此,热Key可能会成为系统性能的瓶颈,需对其进行优化以确保系统的高可用性与稳定性。

如何识别热Key?

1. 使用Redis自带的--hotkeys参数查找。

在Redis 4.0.3版本中新增了hotkeys参数,能够返回所有key的访问次数。此命令的使用前提是Redis Server的maxmemory-policy参数设置为LFU算法,否则将出现错误。

# redis-cli -p 6379 --hotkeys

# Scanning the entire keyspace to find hot keys as well as  
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec  
# per 100 SCAN commands (not usually needed).  

Error: ERR An LFU maxmemory policy is not selected, access frequency not tracked. Please note that when switching between policies at runtime LRU and LFU data will take some time to adjust.  

Redis中有两种LFU算法:

  1. volatile-lfu(最不经常使用):从已设置过期时间的数据集中挑选最不常使用的数据淘汰。
  2. allkeys-lfu(最不经常使用):在内存不足以容纳新写入数据时,从键空间中移除最不常使用的key。

以下是redis.conf配置文件的示例:

# 使用 volatile-lfu 策略  
maxmemory-policy volatile-lfu  

# 或者使用 allkeys-lfu 策略  
maxmemory-policy allkeys-lfu  

请注意,hotkeys参数命令会增加Redis实例的CPU和内存开销(全局扫描),因此应谨慎使用。

2. 使用MONITOR命令。

MONITOR命令是Redis提供的一种实时监控所有操作的方式,可以用于临时监控Redis实例的读写、删除等操作。由于该命令对Redis性能的影响较大,因此不建议长时间开启(在生产环境中应格外谨慎使用)。

# redis-cli  
127.0.0.1:6379> MONITOR  
OK  
1683638260.637378 [0 172.17.0.1:61516] "ping"  
1683638267.144236 [0 172.17.0.1:61518] "smembers" "mySet"  
1683638268.941863 [0 172.17.0.1:61518] "smembers" "mySet"  
1683638269.551671 [0 172.17.0.1:61518] "smembers" "mySet"  
1683638270.646256 [0 172.17.0.1:61516] "ping"  
1683638270.849551 [0 172.17.0.1:61518] "smembers" "mySet"  
1683638271.926945 [0 172.17.0.1:61518] "smembers" "mySet"  
1683638274.276599 [0 172.17.0.1:61518] "smembers" "mySet2"  
1683638276.327234 [0 172.17.0.1:61518] "smembers" "mySet"  

在紧急情况下,我们可以选择在合适的时机短暂执行MONITOR命令,将输出重定向至文件,关闭MONITOR命令后通过文件中的请求进行分类分析,从而找出热Key。

3. 借助开源项目。

京东零售开源的hotkey项目不仅能够帮助识别热Key,还支持其处理。

图片

4. 根据业务情况进行预估。

可以根据业务的具体情况预估可能出现的热Key,例如参与秒杀活动的商品数据。但是某些热Key的出现是难以预估的,比如突发的热点新闻事件。

5. 在业务代码中加入访问记录分析。

在业务代码中添加逻辑以记录和分析key的访问情况。尽管这种方法能够提供有关热Key的有价值数据,但会使业务代码变得更加复杂,通常不被采用。

6. 借助公有云的Redis分析服务。

如果你使用公有云的Redis服务,可以查看它们是否提供了key分析功能(一般都会提供)。以阿里云的Redis为例,它支持热Key的实时分析与发现,文档地址为:https://www.alibabacloud.com/help/zh/apsaradb-for-redis/latest/use-the-real-time-key-statistics-feature。

图片

如何解决热Key问题?

处理和优化热Key的一些常见方法包括(可结合使用):

  • 读写分离:主节点处理写请求,从节点处理读请求。
  • 使用Redis Cluster:将热点数据分布在多个Redis节点上。
  • 二级缓存:采用二级缓存策略,将热Key存放一份到JVM本地内存中(可以使用Caffeine)。

此外,如果你使用的公有云Redis服务,也可以关注其提供的开箱即用的解决方案。例如,阿里云Redis提供了通过代理查询缓存功能(Proxy Query Cache)来优化热点Key问题。

图片