
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存功能的应用在许多软件编程开发项目中都是会经常用到的一个编程技术,而本文我们就通过案例分析来简单了解一下,缓存穿透问题与解决方法分享。
1.我们使用缓存时的业务流程大概为:
当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能出现下面的一些现象。
2.缓存穿透
2.1什么是缓存穿透
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。
2.2缓存穿透带来的问题
试想一下,如果有黑客对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到你的数据库去查询,可能会导致你的数据库由于压力过大而宕掉。
2.3解决的办法
2.3.1缓存空值
之所以会发生穿透,就是因为缓存中没有储存这些空数据的key。从而导致每次查询都到数据库去了。
那么我们就可以为这些key对应的值设置为null丢到缓存里面去。后面出现查询这个key的请求的时候直接返回null。
这样就不用再到数据库中去走一圈了,但是别忘了设置过期时间。
缓存空对象会有两个问题:
空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题更严重),比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。
缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
2.3.2用布隆过滤器BloomFilter
BloomFilter类似于一个hbaseset用来判断某个元素(key)是否存在于某个集合中。
这种方式在大数据场景应用比较多,比如Hbase中使用它去判断数据是否在磁盘上。还有在爬虫场景判断url是否已经被爬取过。
这种方案可以加在一种方案中,在缓存之前加一层BloomFilter,在查询的时候先去BloomFilter去查询key是否存在,如果不存在就直接返回,存在再去查缓存-------->差数据库。
2.4如何选择
针对于一些恶意攻击,攻击带来大量key是不存在的,那么我们采用一种方案就会缓存大量不存在的数据。此时我们采用一种方案就不合适了,我们完全可以先使用二种方案过滤掉这些key。
针对这些key异常多,请求多,重复率比较低的数据,我们就没有必要进行缓存,使用二种方案直接过滤掉。
而对于空数据的key有限的,重复率比较高的,我们则可以采用一种方式进行缓存。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。