缓存穿透 & 缓存雪崩 & 缓存预热 & 缓存热点并发访问

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Daybreak1209/article/details/83275553

一、什么是缓存穿透?

缓存未命中某key,转而到db中查询。

缓存穿透的漏洞

恶意利用不存在的key频繁攻击应用,导致请求直接落到DB中,可能导致DB瞬时高负载或挂掉。

缓存穿透解决方案一:

先查询缓存,若缓存为null,则查询db,若DB仍返回无结果,将该key写入缓存,标识为不存在key(例如将对应v设置成统一值,标识该v的所有keyDB中不存在),同样key再访问应用时,查询缓存!=null 且 = &&直接返回null,从而减少对db的请求。 

不存在key在缓存中如何处理:

1、可将key设置过期时间,3min(3分钟内,同一不存在key只需要查询一次db即可)
2、若有合理场景,可不设置过期时间,有该key写入数据时,更新key对应v即可。

 缓存穿透解决方案二:

bloom过滤器

将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力

二、什么是缓存雪崩?

缓存服务挂了,客户端直接穿透缓存,请求到数据库里面。数据库负载非常高。甚至数据库拖挂。

注:网上有说服重启导致雪崩效应,笔者想了想应该不会。因为一般服务都集群、低峰期重启、且重启后AOF 或 RDB持久化文件会被优先加载,重新load重启前缓存数据到服务中。(意料之外的服务重启除外)

雪崩解决方案:

1、保持缓存层服务器的高可用。监控、集群、哨兵。当一个集群里面有一台服务器有问题,让哨兵踢出去。

2、请求排队处理,限流,避免db压力突高

3、提前演练,缓存层crash后,应用以及后端的负载情况以及可能出现的问题,对此做一些预案设定。

三、什么是缓存预热?

提前批量Load缓存数据:系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

预热思路:

1、直接写个缓存刷新页面,上线时手工操作下;

2、数据量不大,可以在项目启动的时候自动进行加载;

3、定时刷新缓存;

四、缓存热点数据并发访问?

A、B、C、D同时请求一个资源,不存在时都要去请求DB。

热点数据重建优化方法: 

互斥锁: 只允许一个请求重建缓存。 其他请求等待缓存重建执行完,重新从缓存获取数据即可。 

猜你喜欢

转载自blog.csdn.net/Daybreak1209/article/details/83275553