【Redis优化】缓存穿透常见处理方案

本文介绍了缓存穿透的概念,以及如何通过缓存空对象和布隆过滤器来解决这一问题。特别强调了布隆过滤器作为推荐方案,尽管存在误识别率但能有效防止数据库崩溃。
摘要由CSDN通过智能技术生成

一、缓存穿透的定义

缓存穿透: 指客户端请求的数据在Redis缓存和数据库中都不存在,这样Redis缓存将永远不会生效,也就是说请求都会打到数据库中。

如果有心人利用这一特性对服务器同时进行大量请求,就有可能造成数据库的奔溃,因此,我们需要对缓存穿透进行处理。

二、常见解决方案

1.缓存空对象

即客户端请求的数据如果在缓存和数据库中都不存在,我们也在Redis中进行缓存,设置value为null。

image-20240303153449243

优点: 实现简单,维护方便。
缺点:
①大量的空值会造成额外的内存消耗

由于我们将不存在的数据都存入Redis缓存中并置为null,如此大量的空值会占据较多的内存空间,造成内存的浪费。

解决方法: 对每一个空数据都设置较短过的期时间(TTL),可以是一两分钟或者适当的时间。这样可以保证每一个空数据只存在一定的时间就会被删除,减少内存空间的占用。

②造成短期的数据不一致

假设用户请求了一个不存在的id数据,根据缓存空对象的处理办法,我们向Redis中插入了null值并设置了TTL过期时间。如果这时我们向数据库插入了一条id的数据,而该id恰好与刚刚用户请求的id一致,那么,在TTL到期之前,所有用户请求这一id得到的值都是null,而不是我们向数据库中插入的数据。

解决方法: 设置较短的TTL可以在一定程度上缓解。或者采用主动更新的方式更新(删除)缓存。亦或者用第二种解决方案布隆过滤。

③无法抵御随机攻击

缓存空对象会将用户请求的不存在的数据存入Redis中并置为空值,当用户第二次及之后请求这一数据时会返回Redis中的缓存(即null),但如果用户每次请求的值都不存在于数据库和缓存中,则每次请求还是会直接打到数据库中,大量的这类请求同样会造成数据库的崩溃。

解决方法: 用第二种解决方案布隆过滤。


2.布隆过滤(推荐)

即采用布隆过滤器(Bloom Filter)对请求的数据进行过滤,如果布隆过滤器认为元素可能存在,则会放行,如果认为元素不存在,则直接拒绝请求。

布隆过滤器是1970年由Bloom提出的,它是由一组哈希(Hash)函数和一个位阵列组成。布隆过滤器可以用于查询一个元素是否存在于一个集合当中。

其查询结果只有两个:

  • 这个元素可能存在于这个集合当中。
  • 这个元素一定不存在于这个集合当中。

简单而言,布隆过滤器认为存在的数据不一定存在,但认为不存在的数据一定不存在

优点: 其空间效率和查询时间都比一般的算法要好的多。

缺点: 有一定的误识别率、删除困难。

布隆过滤器在实际中主要用来解决网页URL去重复,垃圾邮件检测,大集合中重复元素的判断和缓存击穿等问题。

image-20240303153751349

布隆过滤器的具体使用这里不做讨论,有时间会回来补充,可以自行检索其他文献。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis雪崩、击穿和穿透是与Redis缓存相关的常见问题。 1. 雪崩:当Redis中的大量缓存同时失效或被清,导致所有请求都直接落到数据库上,给数据库造成巨大压力,甚至导致宕机的情况。为了避免雪崩,可以采取以下措施: - 设置合理的缓存过期时间,避免大量缓存同时过期。 - 使用分布式锁来保证只有一个线程去更新缓存,其他线程等待缓存更新完成后再读取。 - 引入热点数据预加载策略,提前加载热门数据,减少缓存失效的影响。 2. 击穿:指某个热点数据的缓存过期后,恰好有大量请求同时访问该数据,导致所有请求都直接落到数据库上,给数据库造成压力。为了避免击穿,可以采取以下措施: - 使用互斥锁或分布式锁来保证只有一个线程去查询数据库并更新缓存,其他线程等待缓存更新完成后再读取。 - 在查询数据库前,先判断缓存是否存在,如果不存在则进行加锁查询数据库并更新缓存。 3. 穿透:指查询一个不存在的数据,由于缓存未命中,每次请求都会直接访问数据库,造成数据库压力过大。为了避免穿透,可以采取以下措施: - 对于查询结果为的情况,也将对象缓存起来,设置较短的过期时间,避免频繁查询数据库。 - 对于恶意请求或无效请求,可以进行参数校验或限流等处理。 以上是对Redis雪崩、击穿和穿透的一些常见解决方案,具体的应对策略需要根据实际场景进行调整和优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值