缓存穿透(Cache Penetration)
什么是缓存穿透?
缓存穿透是指恶意或无效的请求导致缓存无法命中,从而每个请求都需要访问数据库。这可能发生在请求的数据根本不存在于缓存和数据库中。
缓存穿透解决方案
- 使用布隆过滤器(Bloom Filter):用于过滤掉不存在于数据库中的请求,从而避免对数据库的无效访问。
- 缓存空值(缓存空对象):对于查询结果为空的情况,仍将空结果缓存,但设置较短的过期时间,避免频繁的空查询请求
布隆过滤器优缺点
优点:
- 节省空间:不需要存储数据本身,只需要存储数据对应hash比特位
- 时间复杂度低:插入和查找的时间复杂度都为O(k),k为哈希函数的个数
缺点:
- 存在假阳性:布隆过滤器判断存在,可能出现元素不在集合中;判断准确率取决于哈希函数的个数
- 不能删除元素:如果一个元素被删除,但是却不能从布隆过滤器中删除,这也是造成假阳性的原因了
布隆过滤器适用场景
- 爬虫系统url去重
- 垃圾邮件过滤
- 黑名单
缓存击穿(Cache Miss)
什么是缓存击穿?
缓存击穿是指某个热点数据失效,而恰好在此时有大量请求同时访问该数据,导致这些请求都直接访问数据库,增加数据库负载。
解决方案
- 加锁(Mutex Locking):当缓存失效时,只允许一个请求进入数据库查询,其他请求等待查询结果。这可以通过互斥锁来实现。
- 设置短期过期时间:对于热点数据,缓存可以设置较短的过期时间,避免大量请求同时访问失效的数据。
- 使用异步更新缓存:缓存失效时,不立即从数据库查询,而是通过异步任务去查询并更新缓存,避免同时访问数据库。
缓存雪崩(Cache Avalanche)
什么是缓存雪崩?
缓存雪崩是指在某个时间段内,大量缓存失效或同时过期,导致大量请求直接访问后端数据库,从而造成数据库压力剧增,甚至导致系统崩溃。这通常发生在缓存的失效时间设置过于集中,或者在某种外部因素(如服务器重启、缓存层故障)影响下。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了。
缓存雪崩的解决方案
- 合理分散过期时间:将缓存的过期时间分散开,避免大量缓存在同一时间失效。
- 使用热点数据预加载:提前加载热门数据到缓存,降低缓存失效带来的影响。
- 采用多级缓存:使用多个缓存层,如内存缓存 + 分布式缓存,以减轻单一缓存层失效的影响
缓存预热
什么是缓存预热?
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候,先查询数据库,然后再将数据回写到缓存。
如果不进行预热, 那么 Redis 初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中, 对数据库造成流量的压力。
缓存预热的操作方法
- 数据量不大的时候,工程启动的时候进行加载缓存动作;
- 数据量大的时候,设置一个定时任务脚本,进行缓存的刷新;
- 数据量太大的时候,优先保证热点数据进行提前加载到缓存。
个人公众号🐕已经开通了,欢迎关注!