如何使用缓存 | 热点Key处理

发布时间 2023-08-24 20:38:22作者: NewQ

热点Key

当热点key缓存失效后,会有大量线程进行缓存重建。

有的热点key不能再短时间内完成,可能需要复杂的计算,多次IO等。

在缓存失效的瞬间,有大量线程来重建缓存,也就是会直接访问到后端,这会造成后端负载加大,严重的甚至可能导致应用崩溃,也就是 - 缓存击穿。

解决方案1. 分布式锁
加载数据的时候可以利用分布式锁锁住这个数据的Key,在Redis中直接使用setNX操作即可,对于获取到这个锁的线程,查询数据库更新缓存,其他线程采取重试策略,这样数据库不会同时受到很多线程访问同一条数据。

解决方案2. 异步刷新 (永不过期)
由于缓存击穿是热点数据才会出现的问题,可以对这部分热点数据采取到期自动刷新的策略,而不是到期自动淘汰。淘汰其实也是为了数据的时效性,所以采用自动刷新也可以。

唯一不足的就是重构缓存期间,会出现数据不一致的情况,这取决于应用方是否容忍这种不一致。

回到我们使用缓存的目的
第一、加快用户访问速度,提高用户体验
第二、降低后端负载,减少潜在负载
第三、保证数据“尽可能”及时更新

如何发现热点key

Redis监控工具 - Redis monitor 和 redis-stat

慢查询日志 - 使用redis-cli的slowlog命令查看慢查询日志

解决热点Key

1、数据分片
通过将热点数据分散存储在多个Redis节点上,避免单个节点负载过高,是解决热点Key问题最常用的策略。

2、读写分离
读写分离可以将读操作与写操作分开处理,降低单个节点的负载。在主从复制模式下,可以将读操作分发到从节点上,从而分担主节点的压力。

3、缓存预热
缓存预热是指在系统启动或重启后,主动将热点数据加载到缓存中。这样,当用户访问这些热点数据时,可以直接从缓存中获取,避免对后端数据库造成压力。缓存预热可以通过定时任务或应用程序启动时加载热点数据实现。

4、限流
在应用层实现限流,有效减轻热点key对redis的压力

5、熔断降级
当redis出现访问问题时,根据具体的业务场景,将请求熔断,进行快速失败,避免导致缓存彻底down机。

当业务场景具备降级的条件时,我们可以启用降级策略。
比如返回备用数据。

降级分为以下几种:
1、被动降级:服务不可用,返回备用数据或返回提示信息。
2、主动降级:人为把服务设置为不可用,关闭次要的一些功能,保证核心服务可用。
3、自动降级:根据预定的规则,实现自动降级,自动恢复。