缓存穿透
例子:
假设一个电商网站的商品详情页需要通过商品ID查询商品信息,攻击者可以构造不存在的商品ID进行恶意请求,导致缓存中无法命中该商品信息,每次请求都要访问数据库,造成数据库压力过大,甚至可能导致数据库崩溃。
示意图:
解决方案:
使用Bloom Filter来判断请求的数据是否存在,也可以在缓存中加入空对象标记,总之就是避免直接访问数据库。
缓存雪崩
缓存雪崩原因
1. 缓存数据失效时间设置不当
如果所有的缓存数据同时过期,就会导致大量的请求直接落到数据库上,从而引起雪崩。
2. 缓存服务器宕机
如果缓存服务器宕机,而且没有配置高可用的机制,那么所有的请求都会直接落到数据库上,导致数据库压力骤增,从而引起雪崩。
缓存雪崩解决建议
- 设置合理的缓存过期时间,避免所有的缓存数据同时失效。
- 配置 Redis 集群,采用主从复制、哨兵、集群等机制,提高 Redis 的可用性。
缓存击穿
缓存击穿原因
1.热点数据
某些热点数据(如热门商品、热门新闻等)在某一时刻会被大量并发请求,如果缓存中没有这些数据,每个请求都会访问数据库,导致缓存击穿。
2.缓存过期时间过短
缓存中数据的过期时间设置过短,当数据过期后,大量请求同时访问缓存时,缓存中的数据已经失效,每个请求都会访问数据库,导致缓存击穿。
缓存击穿解决建议
1.设置热点数据永远不过期
将热点数据缓存设置为永久有效,可以避免缓存击穿问题。不过这种方式会导致占用内存较多,需要根据实际情况进行权衡。
2.采用分布式锁机制
在缓存未命中时,先获取分布式锁,然后再从数据库中获取数据,获取到数据后写入缓存,并释放锁。这样可以避免多个请求同时从数据库中获取数据,避免数据库压力过大。
3.使用布隆过滤器
布隆过滤器可以快速判断一个key是否存在于缓存中,如果不存在,则可以直接返回不命中,避免访问数据库。不过布隆过滤器可能会存在一定的误判率,需要根据实际情况进行权衡。
4.使用Redis集群
为避免Redis单点故障和单节点吞吐量不足问题,可以部署Redis集群提高Redis的可用性和吞吐量。