【redis】redis缓存穿透

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

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.对于需要频繁查询且数据变化不大的场景,则可以考虑缓存空值或设置短过期时间的策略来减轻数据库压力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值