什么是HotKey?
什么是HotKey?
提示
**题眼:**缓存穿透,发现hotkey
在 Redis 中,Hotkey(热点键)是指在一段时间内,被大量客户端频繁访问的键。例如,在一个电商系统的秒杀活动中,代表秒杀商品库存的 Redis 键就可能是一个 Hotkey,因为众多用户会同时频繁地查询和更新这个键的值。
HotKey存在两个问题。第一个是缓存过期导致的穿透问题,突发的大流量可能会压垮数据库,进而拖累整个服务。另一个问题是,突发的大流量可能会给缓存带来风险,虽然Redis的性能很好,也是有上限的。当然,HotKey还有一些其他的问题,像是数据不一致啊,分片流量过高等。
HotKey问题的解决方案还是比较简单的,它的本质就是一个穿透问题。使用多级缓存,或者单飞都可以解决。HotKey的真正难点在于发现哪个Key是HotKey,只要发现的足够及时,就有多种办法解决问题。由HotKey引发的事故,多数情况下都是发现不及时,引发的。
关于HotKey问题的解决方案,我们可以具体场景具体分析:
如果是一个已知的热点活动,比如超卖,跨年活动等。那么这个Key是一个已知的在某段时间内的热点,这个时候可以对数据进行异步更新的缓存策略,避免因为缓存失效导致的穿透问题。另外,可以使用多级缓存的思路,在本地设置一个短时间的缓存,进一步减少流量传递给Redis。
如果是一个突发的热点活动,比如说突然火了一个热搜,或者明星同款之类的,这种问题比较麻烦。首先,可以在网关或者Redis的网络层设计一个热点探测器,发现某个Key在一段时间内的请求了猛增,就将其判断为HotKey,一方面发布业务告警,另一方面做一些简单的缓存优化,防止突发事故。然后,就按照上面的方法执行。
另外,如果缓存时一个分布式的缓存,可能会出现流量倾斜的情况,比如说热点在分片1,那么它的流量就特别多,其他的分片流量很少,这样其实就没有达到分布式缓存的要求。这种情况的话,可以在Key后面加个随机数,将同一份数据保存在多个分片上,这样子就可以把流量均匀分散到了每个分片上。
最后,单飞也是个应对HotKey的好方法。
重要
参考答案:
HotKey其实就是某个时间点有大量的请求访问一个Key,这个时候就出现了HotKey问题。这个问题的危害主要是在两方面,一个是出现穿透问题的话,可能拖垮整个服务。另一个是缓存服务可能扛不住突发流量,不过这个问题概率低一些,Redis的性能还是非常好的。
其实HotKey问题的难点不在于解决,而在于发现。如果是一个秒杀这样的活动,那我们肯定知道在活动期间,哪些Key会被频繁访问,我们可以调整缓存策略,或者使用多级缓存,单飞等等,这样的方案来应对。但如果是一个突发的情况,比如某个明星塌房这种,大家都没准备的热点,就比较麻烦了。
我们公司的网关层和缓存服务的网络层都有一个热点数据探测的小功能。当发现有热点的时候,会发一个业务告警,然后会在网关的缓存中存几秒中,形成一个多级缓存。这样子可以给开发争取一些时间,看下具体的业务情况。
HotKey还有一种情况,如果缓存时一个分布式的架构,那么热点数据可能会在其中一个分片上,这个时候整个服务的流量会出现倾斜,有的分片流量很高,有的很低,这肯定也不符合逻辑。解决办法就是给一个Key加上一个随机数让它可以存在多个分片里,这样子就有能有效的避免倾斜了。
这些方法主要针对的都是读操作,如果时写操作的话,可以换成消息队列,把并发操作变成异步的线性操作,降低并发量,削峰填谷。
