
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
缓存功能的应用随着互联网的不断发展而被越来越多的程序员掌握并应用到不同的开发项目之中,而本文我们就通过案例分析来简单了解一下,缓存穿透优化方法都有哪些。
缓存穿透指查询一个根本不存在的数据,缓存层和存储层都不命中。一般的处理逻辑是如果存储层都不命中的话,缓存层就没有对应的数据。但在高并发场景中大量的缓存穿透,请求直接落到存储层,稍微不慎后端系统就会被压垮。所以对于缓存穿透我们有以下方案来优化。
1、缓存空对象
一种方案就是缓存一个空对象。对于存储层都没有命中请求,我们默认返回一个业务上的对象。这样就可以抵挡大量重复的没有意义的请求,起到了保护后端的作用。不过这个方案还是不能应对大量高并发且不相同的缓存穿透,如果有人之前摸清楚了你业务有效范围,一瞬间发起大量不相同的请求,你一次查询还是会穿透到DB。另外这个方案的一种缺点就是:每一次不同的缓存穿透,缓存一个空对象。大量不同的穿透,缓存大量空对象。内存被大量白白占用,使真正有效的数据不能被缓存起来。
所以对于这种方案需要做到:一,做好业务过滤。比如我们确定业务ID的范围是[a,b],只要不属于[a,b]的,系统直接返回,直接不走查询。二,给缓存的空对象设置一个较短的过期时间,在内存空间不足时可以被有效快速清除。
2、布隆过滤器
布隆过滤器是一种结合hash函数与bitmap的一种数据结构。相关定义如下:
布隆过滤器(英语:BloomFilter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
关于布隆过滤器的原理与实现网上有很多介绍,大家百度/GOOGLE一下便可。
布隆过滤器可以有效的判别元素是否集合中,比如上面的业务ID,并且即使是上亿的数据布隆过滤器也能运用得很好。所以对于一些历史数据的查询布隆过滤器是极佳的防穿透的选择。对于实时数据,则需要在业务数据时主动更新布隆过滤器,这里会增加开发维护更新的成本,与主动更新缓存逻辑一样需要处理各种异常结果。
综上所述,其实我觉得布隆过滤器和缓存空对象是完全可以结合起来的。具体做法是布隆过滤器用本地缓存实现,因为内存占用极低,不命中时再走redis/memcache这种远程缓存查询。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。