Redis---缓存穿透、缓存雪崩

本文深入探讨了缓存系统中常见的三大问题:缓存穿透、缓存击穿和缓存雪崩,分析了这些问题产生的原因及对系统的影响,并提出了有效的解决方案,包括缓存空值、使用过滤器、互斥锁、高可用缓存集群、本地缓存和限流降级策略。

目录

1. 缓存穿透

如何避免?

如何选择?

2 缓存击穿

如何解决

3. 缓存雪崩

如何解决?


1. 缓存穿透

缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力,或导致数据库异常。这就叫做缓存穿透。

如何避免?

  • 缓存空值

之所以会发生穿透,就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。那么就可以为这些key对应的值设置为null,设置短一点的过期时间,然后存到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null 。

  • 使用过滤器(布隆过滤器

布隆过滤器对查询的key进行过滤,过滤掉不存在的key。bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。

该方案可以加在第一种方案中,在缓存之前在加一层 BloomFilter ,在查询的时候先去 BloomFilter 去查询 key 是否存在,如果不存在就直接返回,存在再走查缓存 -> 查 DB。

如何选择?

  • 缓存空值方案:适合使用的key重复率比较高,key数量不是特别多的攻击;
  • 过滤器方案:适合key异常多、请求重复率比较低的数据,没有必要进行缓存,使用过滤器直接过滤掉。

 

2 缓存击穿

在平常高并发的系统中,大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去。这种现象我们称为缓存击穿

缓存击穿会造成某一时刻数据库请求量过大,压力剧增。

如何解决

使用互斥锁排队:上面的现象是多个线程同时去查询数据库的这条数据,那么可以在第一个查询数据的请求上使用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。

 

3. 缓存雪崩

当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面。结果就是DB 称不住,挂掉。

如何解决?

  • 事前:保证Redis高可用(可使用集群缓存)

这种方案就是在发生雪崩前对缓存集群实现高可用,如果是使用 Redis,可以使用 主从+哨兵 ,Redis Cluster 来避免 Redis 全盘崩溃的情况。

  • 事中:ehcache本地缓存 + Hystrix限流&降级,避免MySQL被打死

ehcache本地缓存:直接在jvm虚拟机中缓存,速度快,效率高;使用ehcache+redis缓存后,用户发送来一个请求后,先查ehcache本地缓存,如果没有再查redis缓存。如果ehcahe和redis缓存都没有,再查数据库;

Hystrix限流&降级:

限流组件:可以设置组件能够接收的请求阈值;比如一秒来了5000个请求,我们可以设置假设只能有一秒 2000个请求能通过这个组件,那么其他剩余的 3000 请求就会走限流逻辑。调用降级组件处理被限流的请求。

降级组件:需要自己开发降级组件(降级),比如设置的一些默认值呀之类的。以此来保护最后的 MySQL 不会被大量的请求给打死。

  • 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据

参考:https://juejin.im/post/5c9a67ac6fb9a070cb24bf34https://juejin.im/post/5b99d4bce51d450e7a24b66ehttps://juejin.im/post/5b961172f265da0ab7198f4d

这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值