本文章是记录作者学习 极客时间 分布式缓存课程 的笔记, 非喜勿扰!
缓存雪崩发生场景一:
在商品抢购,一波商品时间比较集中的放入缓存中,假设缓存设置一个小时,当过期时间到达后,这批商品会统一失效,而对于这批商品的访问查询,会直接落到数据库上,对于数据库而言,就会产生周期性的压力波峰,甚至会造成数据库宕掉。
解决方案一:
一个是将缓存失效时间分散开,比如在原来的失效时间基础上,去增加一个随机值,比如1~5分钟随机,这样每个缓存的过期时间的重复率大大降低,也就不会造成集体失效了
解决方案二:
缓存不过期
缓存雪崩造成的后果:
在流量高峰的时候,某个缓存服务器节点出现宕机或者出现问题,导致缓存流量直接透传到数据库上面,更严重的是某个缓存服务器出问题,导致整个缓存集群出现额问题。
下图左图是一个缓存节点直接透传去请求数据库了,
下面右图是整个缓存集群都挂掉了
缓存雪崩发生的场景二:
一个key 非常热点,在不停的扛着大量并发,大量并发集中对这个点进行访问,当这个key 失效的瞬间,持续的大并发就会穿透缓存,直接请求到数据库,就像在一个屏障上凿开一个洞,又名缓存击穿。
如何来发现热点缓存:
发现热点缓存的流程图,如下图;
执行流程:
1、 当每次客户端的请求到达后台系统集群(系统集群)后, 服务实例会先去缓存中查询数据, 当查询到数据后,会把缓存数据的key 通过kafka 透传到 Fink(分布式的计算引擎
) ,然后判断是否是热点数据,是的话会把热点数据通过请求传给监控系统,
监控系统会通知应用服务某个key是热点,应用可以根据这个key 进行重新hash ,将热点数据重新分不到不同的节点上。
2、 如果这个热点key 重新hash 打散到不同的节点上, 请求量过来热点key是否均匀的分部到缓存集群不同的分片中, 缓存不够可以添加内存
方案二:
通过一个访问用户中心的案例来做说明;
通过判断数据访问的最新时间来做个排名, 过滤掉不常访问的数据,留下经常访问的数据,可以通过缓存系统做一个排序队列, 系统会根据访问时间做一个排名,最近访问的数据要越靠前。
每次请求到达时现请求排序队列,命中后再通过userId 去缓存中查数据