裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

Posted 渔骨微课

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?相关的知识,希望对你有一定的参考价值。

        刚过去不久的“双十一”活动,交易额超过2000亿,物流订单超过10亿。相信很多小伙伴们也都参与了这次千亿级项目。

    双十一之后,物流订单暴增,我们已经对快递爆仓见怪不怪了。小伙伴们购买完商品后,还是喜欢查一下自己的“战利品”现在什么位置了,还需要多久能送到自己的手上。

    那么问题来了,10亿的物流订单,每个用户随便查一下,就是庞大的访问量啊,我们直连数据库检索数据吗?

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    小伙伴们会告诉我,当然是用缓存,可以提高系统性能噢~。

    首先肯定“答得不错”,那么接下来问题来了,当查询能够命中缓存那么当然是可以的,但如果不能命中,则要穿过缓存、进一步向数据库查询该物流订单是否存在。在查询量小的时候,这个方式没有什么问题,但假设有人恶意伪造物流单号、或者输错单号的人比较多,那么形成了在高并发的情况下大量请求穿透缓存的情况,我们的常识告诉我们,例如mysql数据库,可以支持300~700左右的极限并发量,如果超过这个量,数据库查询变得很慢、甚至不响应了。就造成了所谓的“缓存击穿”。

    缓存击穿指的是使用不存在的key进行大量的高并发查询,这导致缓存无法命中,每次请求都要击穿到后端数据库系统进行查询,使数据库压力过大,甚至使数据库服务被压死。

    

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    这个时候怎么办呢?我们就需要想个办法去搞定缓存击穿的问题,恰好最近笔者我看了一篇文章说的意思大概是他想要让手下程序员优化系统,但是指导时被怼“你丫连布隆过滤器都不懂,还让我优化?”... ...恰恰问题场景和咱们要讲述的东西一致。接下来我们就进入正题吧 。

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    一、布隆过滤器(Bloom Filter

    布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

    布隆过滤器是一个字节数组,大概长这个样子,如下图:

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    我们可以通过多个不同的hash函数,把一个值映射到布隆过滤器中。我们拿"yuguweike"为例说明:

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    我们通过hash1()、hash2()、hash3()三个函数,将“yuguweike”映射到了2、4、6三个位置上。接下来我们再存一个"www.fisherbone.com":

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    我们存到了2、58的三个位置上。我们能够看到,“2” 这个位置因为两个值都存到了这个位置,那么它被覆盖了。这时假设我们通过hash1()、hash2()、hash3()三个函数确定“mantou” 这个值是否存在时计算出他的哈希值是1、5、7 ,那么,我们可以判断出他不在存在;但是假设我们想确定“xifan” 的哈希值是“2、4、5”是否存在时,我们发现它计算结果均落在已经存在的位置上,那么我们可以判断出他是可能存在的(而不是一定存在哦~),需要真正的去查询缓存甚至数据库,才能判断该值是否真的存在。

    刚才我们介绍的是布隆过滤器的原理,那么实际当中我们怎么去使用呢?可以参考如下场景:

裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?

    大致情况就是,我们准备一台布隆过滤器的服务器作为第一道防线,验证数据是否存在;如果布隆过滤器初步判断其存在,则去缓存中查询结果,如果缓存中没有查到,再去查询数据库。这样可以阻挡一些恶意的模拟单号的请求。

    二、布隆过滤器主要应用场景有:

1、黑名单 

2、排序(仅限于BitSet) 

3、网络爬虫 

    判断某个URL是否已经被爬取过

4、K-V系统快速判断某个key是否存在 

    典型的例子有Hbase,Hbase的每个Region中都包含一个BloomFilter,用于在查询时快速判断某个key在该region中是否存在,如果不存在,直接返回,节省掉后续的查询。


    最后补充一个知识点,我们这个布隆过滤器的示意图,就8个位置,如果我数据存的多了,它不是每个位置都是“1”了么,那任何数据过来交验,布隆过滤器都认为是存在的啊,怎么办?

    正常我们可以设置布隆过滤器的长度,长度越长,其运算速度越慢、资源占用越高,但是准确率越高。

    

    好了,这篇文章的讲解就到这吧,大家懂了吗,是下面哪种状态呢 ?

    


    



以上是关于裁员潮来临,大龄“业务级”程序员如何生存?知道缓存击穿吗?了解布隆过滤器吗?的主要内容,如果未能解决你的问题,请参考以下文章

凛冬已至:大厂裁员浪潮,基础福利大砍,行业饱和,大龄程序员该如何自处

跳槽季遭遇裁员潮,互联网程序员如何优雅过冬?

“大龄”码农的“中年危机”:35岁之后,该如何应对?

大厂程序员:裁员潮之前,我先跑路了

对于程序员来说,2021年的冬天有点冷,互联网大厂裁员,大龄程序员的出路又在哪里?

2023 即将来临,可能移动开发的大环境比 2022 还要差。