
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存技术的应用在许多软件编程开发项目中都得到广泛的应用,而本文我们就通过案例分析来简单了解一下,缓存穿透应对方法分享。
1、控制查库的时机
a)缓存状态:
基于开篇提到的我们之前文章,我们知道,可以把每次缓存穿透入库查询不存在的数据存储一份状态到缓存,这样下次在查询的时候就可以直接在缓存层面拦截。
这是一个正常的解决方法,对于很多应用场景都很适用。但是对于我们上述列举的情景,这种方法会带来一些不可避免的隐患。
关系是一种两者之间的关联,上面我们讲到过,穷举的关系数据相对于基数对象是一种量级的膨胀,所以以缓存不存在状态来避免穿透会是一种成本无法控制的方式。
改进:虽然这种方式面对的是一个不确定量的缓存需求,但是我们可以通过对状态设置较短的过期时间来一定程度的进行规避。
b)基于过滤器:
开篇介绍过布隆过滤器的特性,我们可以将每次查询不存在的查询放入过滤器,对于过滤器过滤判定结果,不存在的则进一步直接入库查询,判定存在的,则走常规的逻辑,查缓存,查库。
说到这里,可能有人会有疑问,对于已判定不存在关系放入过滤器的,之后业务中产生了关系的,难道还要每次都直接入库查询吗?
这,确实是这种方式埋下的一个问题,但是相对于未应用过滤器之前,这种对于业务结果的正确性是没有影响的,只是减慢了一部分查询的响应时间。布隆过滤器的实现对删除元素不太支持,虽然有些衍生的版本实现了这一功能,这里不再讨论。对于上述这种情景,我们可以结合实际的业务数据测量,来定期的重建布隆过滤器来解决。
2、移除入库查询
其实,对于我们上述的这种缓存应用场景,我们为什么要入库查询呢?
因为缓存过期。
按照我们通常的认知,缓存好像都必须要有过期时间,一来是为了保障数据一致性(缓存数据与库数据),同时也是为了有效的控制缓存成本(热点数据存留)。
但是,像我们列举的这种量比不均的场景,就不可避免的引发穿透这种更加具有危害性的结果。
因此,此处,我们需要换一种方式来应用缓存。
我们可以将已有的关系数据全部缓存起来,设置不过期,同时移除后续的入库查询逻辑,所有的查询全部由缓存数据来响应。
同时为了保障数据一致性,我们可以对数据变更做补偿措施。
数据的变更毕竟很少,相对于查询毕竟有量级的差距。
因此,每次数据变更我们都可以进行一次数据同步(缓存和数据库),当然,方式可以选择同步或者异步。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。