1.说明
- 1.查询一个不存在的数据,缓存中没有命中,然后去数据库中查询也没有命中,并且每次这样的请求都会打到数据库上。
- 2.这可能会导致数据库压力过大,尤其是在高并发的情况下,如果有大量的这种无效请求,可能会使数据库不堪重负,影响整个系统的性能和稳定性。
- 3.缓存穿透通常发生在请求的数据在数据库中也不存在的情况下。
- 4.例如,在一个电商系统中,用户可能会恶意构造一些不存在的商品ID进行查询,如果没有有效的缓存策略来处理这种情况,每次查询都会直接访问数据库,消耗数据库资源。
2.解决方案
2.1 使用布隆过滤器
- 1.布隆过滤器是一种空间效率很高的随机数据结构,它可以用于判断一个元素是否可能在一个集合中。
- 2.它通过多个哈希函数将元素映射到一个位数组中,当插入一个元素时,会将对应哈希函数计算出的多个位置置为1。当查询一个元素时,如果这些位置都为1,那么该元素可能在集合中(有一定的误判率);如果有任何一个位置为0,那么该元素一定不在集合中。
- 3.布隆过滤器可以有效防止缓存穿透,将不存在的请求直接拦截掉。
2.2 缓存空值或设置短过期时间
- 1.当查询数据库后发现数据不存在时,可以将一个空值(或特殊标识值)缓存到Redis中,并设置一个较短的过期时间。
- 2.下次相同的请求到来时,直接从缓存中返回空值,而不会再次访问数据库。
- 3.设置短过期时间是为了避免缓存中长时间存储大量无效的空值,同时需要根据业务实际情况合理调整过期时间。
2.3 接口限流与熔断、降级
- 1.限流策略可以防止恶意攻击请求过多对系统造成压力。
- 2.熔断和降级则在服务不可用或负载过高时启用备用策略,以保护系统在高负载情况下的稳定性。
3.实际应用
- 1.在实际应用中,可以根据业务场景和需求选择合适的解决方案。
- 2.例如,对于数据命中不高、数据相对固定、实时性低(通常是数据集较大)的应用场景,可以考虑使用布隆过滤器来减少无效查询。
- 3.对于需要频繁查询且数据变化不大的场景,则可以考虑缓存空值或设置短过期时间的策略来减轻数据库压力。

缓存穿透是指请求的数据在数据库和缓存中都不存在,导致每次请求都要访问数据库。解决策略包括缓存空对象,即当数据不存在时仍缓存一个空值,设置过期时间以避免短期不一致;拉黑恶意请求的IP;进行参数合法性校验,无效参数直接返回;以及使用布隆过滤器在请求到达Redis前预过滤,减少无效请求。
2744

被折叠的 条评论
为什么被折叠?



