什么是缓存击穿?
在做数据大屏需求的过程中,对前端提供了几个接口,底层主要涉及到ES的聚合计算,因为每5s中就会被调用一次,尤其是大促期间,各种数据报表对于Leader们来说至关重要,同时对于ES的压力也是蛮大的,因此给每个接口都设定了一定的缓存。流程图如下:
但是在使用的过程中,发现一个问题,接口设定的缓存是10s失效,前端每5s请求一次,当缓存失效时,并且同时有很多人在查看这个页面的时候,新的数据还未保存至缓存中,就会有大量的请求打到ES上去,造成ES性能下降,此时缓存是没有起到任何作用。
缓存击穿的根本原因在于:热点数据Key的失效
那如何解决或者优化缓存击穿的问题?
请求只查询缓存,定时任务写缓存
给缓存Key设置足够长的失效时间,或者不设置失效时间,缓存中的数据由后端定时任务定时查询数据然后写入缓存, 所有的客户端请求只查询缓存,有就是有,没有就是没有。
也有同学说可以结合热点数据,当然也可以,场景是定制化的,什么样的场景有什么样的解决方案,只不过我们的这个场景不需要考虑非热点数据的问题,都是热点数据。奉上热点数据的流程图供大家参考。非热点数据可以加层缓存也可以直接去查询底表数据,看个人需求。
设置锁
设置锁的解决方案更新中.......