当前位置: 首页 > 后端技术 > Java

缓存穿透细节及解决方法

时间:2023-04-01 18:22:43 Java

当存储系统成为瓶颈,比如高并发、读多写少等,我们首先想到的就是利用缓存来提升整个系统的性能。虽然缓存可以大大提高整个系统的性能,但同时也引入了更多的复杂性。如果缓存处理不当,在某些场景下甚至会导致整个系统崩溃。这次我们要聊的是:缓存穿透。缓存穿透缓存穿透是指在查询缓存数据时,缓存中没有对应的数据,需要到存储系统中查询数据。一般有两种情况:对应的数据根本不存在。如果存储系统中没有某个数据,则相应的数据不会存储在缓存中。导致在查询缓存数据时,在缓存中找不到对应的数据,每次都必须重新查询存储系统,返回的数据不存在。在这种场景下,缓存并没有起到分担存储系统访问压力的作用。读取不存在数据的请求量一般不会太大,但是如果有一些恶意攻击,故意大量访问一些不存在的数据,就会对存储系统造成很大的压力。解决方案如果查询存储系统中的数据没有找到,直接设置一个具体的值存入缓存。之后在读取缓存的时候会得到这个具体的值,直接返回一个空值,这样就不会继续访问存储系统了。将已有数据的key存入Bloomfilter中。当有新的请求时,先去Bloomfilter检查是否存在,如果数据不存在,直接返回;如果数据存在,则查询缓存并查询存储系统。生成缓存数据需要很长时间。存储系统中有相应的数据,但需要很长时间或大量资源才能生成缓存数据。如果在访问的时候对应的缓存失效,缓存就不会发挥作用,访问压力全部集中在存储系统上。比如某宝上的分类商品列表,由于数据量巨大,而且按销量、信用、价格等各种排序,不可能缓存所有的数据,所以只能根据缓存页数。如果每次点击页面都会计算页面并生成缓存数据,一般是没有问题的,因为真实用户不会从第一页翻到最后一页。真正的用户访问一般都集中在前十页,所以第十页之后缓存过期的可能性很大。那么问题就来了。如果竞争对手使用爬虫遍历所有页面,此时可能很多页面缓存失效,从存储系统生成缓存数据非常耗时,爬虫会拖累整个存储系统。如果慢了,整个系统的性能可能会出现问题。解决办法是限制页数。比如某宝上的分类商品列表,最大页数为100页。当然,从产品的角度来看,这种做法并不是很好,因为100页之后的产品,用户是永远看不到的。后台作业会定期更新缓存,而不是在访问页面时生成缓存数据。这样缓存就可以按照一定的策略定时更新,不会对存储系统造成瞬间压力。总结缓存穿透是指在查询缓存数据时,缓存中没有对应的数据,需要到存储系统中查询数据。通常有两种情况:对应的数据根本不存在,生成缓存数据的时间比较长。最后谢谢大家的喜欢和关注,帅气又漂亮。