00:00
各位同学大家好,我们继续通过上一版我们完成了boot my基础案例的整合。卡12是真真切切存在于我们red的一条白名单记录。卡12也是存在于我们MYSQ的一条真实的记录,那么以它为突破口,累加我们的布隆过滤器和bit map来给大家演示我们落地的案例。那么新增布布隆过滤器,在上面这个案例结合了以后该怎么写呢?我们分为四个小程序来进行编码,第一个布隆过滤器的初始化,也就说白名单,比如说各位亲,我们卡12确确实实是在red服务器里面有的真实记录,必须灌进布隆过滤器。第二个check us检查单元,那么就是调用布伦过滤器,看看这个数据传过来的这个key是白名单还是黑名单。Service controltrl相关改写,OK,那么来吧,用它来进行初始化的白名单数据,演示一下我们的数据效果,我们第一步就是走它,那么来为了节约时间新建这么一个类啊,这些调用right temp弟兄们已经熟悉的东西,直接先提前写好我们的思路,这个呢,是一个不能过滤器白名单初始化工具类。
01:19
一开始就设置一部分数据为白名单所有,比如说现在我们的CUSTOMER12白名单业务规定不能过滤器,有red是极大可能有,不能过滤器,没有就没有。OK,好,我们的白名单这个key叫white customer来吧,第一步纳入spring容器管理,脑袋上添加这个日志不说了,第二个temp,那么这个时候该怎么编写呢?第一步来吧,那public word初始化。相当于这波,也就是刚才我们所说的这一个注解所做的初始化白名单数据,好,那么弟兄们。
02:03
搁到这儿来看一眼,没问题吧,在这个方法里面。纳入spring容器管理,看到这个注解标签,一开始就给你干,那杨哥接下来该怎么编写呢?为了保证同学们的吸收效果。刷回来看一下我们的架构设计图。二进制数组构建的过程,也就是说你现在要告诉人家CUSTOMER12这个key是在red里面真实存在,有效可靠的。那接下来。预加载符合条件的记录CUSTOMER12第二步,计算CUSTOMER12的哈希第三步,CUSTOMER12的哈希值对应的bit map数组的看位,得到它的下标索引,最后把这个值修改为一,说明CUSTOMER12是在red里面真实存在的,所以我也把它存进了布隆过滤器。那么这个时候大家来反问布隆过滤器的时候有是不是极大可能有无是绝对无?OK,好,就按照这四步,兄弟们,我们来编写第一个白名单客服CUSTOMER12是吧,加载到。
03:16
菠萝过滤器那咋写呢?那么string,我们K就等于CUSTOMER12。弟兄们,OK吧,第二个那么就是我们的计算哈希value这个值,然后呢,由于啊。存在计算出来负数的可能,我们取绝对值啊好,那么同学们应该怎么玩呢?那么这就是in桃哈希value,注意,那你看到杨哥直接叫个哈西code不就行了,不是这样的啊,我这后面有另用,接下来math数学工具类ABS啊,取绝对值啊,大家请看这个K点哈code明白了吗?哎,我就把这个电这个变量定义为我们的什么哈希值哈希value啊,也就说对它用。
04:20
哈西扣的,然后再取绝对值,保证一定是正数,所以我们这儿就是哈希value那第三步,那么通过哈希value OK和多少二的32次方,那么这个呢,是经常自己写哈扣常用的一个方法啊,因为我们这就整数以内就是二的32次方位够了,那么然后呢号取获得对应的下标摊位。也就是我们这的第三步,我们要知道这个CUSTOMER12存到我们不能过滤器里面,比如说存到多少多少坑位,某一个比特位里面写个一,就代表确实存在CUSTOMER12这么一个真实的数据,那这块怎么获得呢?那么。
05:15
Index坑位这就是了,然后我要干个什么事呢?那么哈西value起速。数学math。点二的32次方,OK,做个强制类型转换,这个就这么个东东,那么log log点日志打出来,那么就是我们的key。对应的坑位index,我们呢,给你呢写出来这个坑位是多少呢。那。
06:00
张维福,写清楚,这儿就是我们的index也记,就告诉你卡12存到了我们的。布隆过滤器,也就是我们的bit map里面的哪一个下标坑位好,那么接下来干什么呢?设置red里面的bit map的bit map。对应类型的看位。并将。该值设置为一,好,那么弟兄们来看一下,那么就是我们的red temp.OPS。然后呢,For value.set bit看到没有,这个就是set bit看到这,那么我们前面说过了,白名单是不是叫这么一个东东,那么就也就说设置rise bit map对应的类型,也就是这个白名单。
07:13
好了,这个K就它你对应的开位是多少index。然后干嘛错搞定,这个就是我们布隆过滤器的初始化加载工具,OK,好,第一步完成。那第二步呢,照着我们的流程和步骤来,我们是不是要完成一下我们的check us检查型的工具类啊,来吧,跑到这儿了以后,还是熟悉的配方,还是熟悉的味道,我就统一的纳入一般这个工具类啊,你。可以纳入spring管理,也可以不纳入啊,但是这呢可能需要用到一个,所以呢,我就把它呢弄过来了啊,可到这来吧,同学们,Public。
08:04
布尔型我干什么呢?切克,那我要检查检查它是不是在布隆过滤器里面,对吧?With布隆过滤器filter,来吧,这呢,String check,你检查哪一个k item,那么在这个布隆过滤器里面你要去找什么?我要去找这个K是否存在于我的布隆过滤器里面,那么切克位置布隆过滤器好了,老规矩一样的哈希value干嘛呢?是不是还是我们的数学类?然后点ABS,然后过来这。那么k.has code相当于是不是还是之前这个方法的一个处理和操作呀,来,那这是第一步,那那么这是我们的坑位强制类型转换,那么这个坑位呢,过来这儿还是我们的哈希value值获得了以后,跟数学公式点泡二,那么二的32次方来进行一下取。
09:12
余了以后获得我们对应的看位,然后这就是布尔行是否存在啊O了,那么我们就right temp点,呃,OPS for value.get bit,那么这个get bit是谁呀?是不是就是我们的check?Item其实也是我们刚才前面那个white list customer白名单,OK,然后对应的index就是在这个白名单里面,相当于说哥哥在这个里面有没有这个index,有的话值是不是一,如果是一的话,是不是代表yes,确实存在没问题吧,Log应付,那么在这块呢,我们呢,为了好看一点啊,打出来吧,那么这个就是K。然后完了以后加上这个,加上我们对应的这个K,再加上。
10:08
对应称位下标对吧?Inex,那它应该是多少?那么加上我们的index OK是否存在,那这个时候继续。我们的布尔值打出来,那么最后我们瑞return就是这个是否存在的这个布尔值完火弟兄们没问题吧?好,那假设这个K啊,就是CUSTOMER12在我们的布隆过滤器里面对应的下标,这个K对应着index,这个摊位是多少,那么是否存在除就是存在false就不存在,好那么回到我们的第三步,是不是要写重新修改我们customer service,那这个时候这个customer service之前是写操作读操作,我们上一讲讲过的。
11:00
那接下来来吧,不能过滤器到到MYQ来,方法就叫这么一个。缓存K这些都是我前面拷贝下来的。这个是反馈给我们的对象,之前写过了两边查,那真真正正的新内容就这么一个来。首先弟兄们,我们要干一件什么事?由于我把这个check us也纳入到了spring容器的管理,所以at resource private check check这一波OK,好。来吧,我们这来判断,如果check u check with布隆过滤器,那么你的这个key是叫什么?是叫这么一个好。那布隆过滤器白名单写好了,那布隆在这个布隆过滤器里面去给我找一个K,哪个K啊,就是你拼出来的这个,比如说待会就是我们的前缀是不是卡冒号,这个ID是多少,是不是12好来看看处,如果是有白名单有那么范型,如果是取反。
12:17
在这块是false false取反是不是错,那这个时候说明什么落点,因为for对不起,说明你是白名单无此顾客,那基本上是不是就是。不可以反问。弟兄们,这么说能跟上好了,那么这个顾客他的名字就是这个T,不可以反问,OK,好了,那么直接return,那没问题吧,Service就加这么一点东西好了。那service写完了以后,弟兄们,是不是咱们的最后一步要来试试我们的customer了?OK,看出了,我们来customer。
13:10
方法就这么一个,那么pass variable,然后in ID来吧,还是上面这些东东,只不过注释改一下,这一块呢,就叫。不能过滤器。然后按照查询含有布隆过滤器的对吧,其他的那么在这边的话呢。我们就是customer。然后。加一个布隆过滤器,布隆filter OK,其他没什么变化,然后呢,基本上是不是又是customer service.find by ID且含有不同过滤器的对不对?那么ID写上去return,好,那么同学们,我们的代码全部编写完成,那接下来我们启动一下我们的。
14:11
回复,看看我们代码有没有什么问题。好,将其启动。老好。直接启动了。那么来,同学们请看没有,请看没有,在这儿有个关键的信息,初始化布隆过滤器加载成功了吗?卡12对应的坑位是不是叫172这么一个巴拉巴拉巴拉,这句话弟兄们咱们是不是就捕捉到了呀?OK,好,那么接下来我们就来验证并试试啊我们的程序是否OK搁到这,同学们请看GET12是没问题的,那么kiss大家看是不是有一个白名单用户?那么来吧,首先啊,Type。
15:00
White list什么类型?String没问题吧?复习一下bit map,实质而言是死状类型的延伸,那么接下来get beat白名单white list customer来,现在弟兄们搂他一眼,我们这儿说的很清楚了,对不对?我们这后台说的是什么鬼,它的对应的卡12对应的坑位是不是就这么一个动作来吧,对应坑位是这个,这个坑位我们来找找在里面。走,有没有说明什么?卡塔12在布隆过滤器里面是绝对存在的坑位对应的扇,那如果我们往后移一个,有没有没有OK,至此,到这我们的程序编写完成,我们接下来给同学们演示测试效果。通过前面的讲解和编码,我们终于自研完成了我们的布隆过滤器,结合我们的比特map,按照比特位数来进行白名单的设置,来判断这个值是否可以访问那所谓的白名单,以及以red为准,只要里面所具备的拥有的尽量写进布隆过滤器,那么如果布隆过滤器没有收到通过red设置的白名单以及我们访问的key在布隆过滤器里面查找没有,那么我们就不让它达到我们的ready来减轻我们服务端的压力。好,那么接下来我们来进行一下对应的测试那。
16:35
我们的测试呢,主要分三块,不过滤器没有red器里面有,不能过滤器没有red,没有不能过滤器里面根本就没有直接返回,不再继续走下去,那也就是我们check us这个工具类的使用。对于我们这儿。让不能不能去来检查,没有是绝对没有,有是极大可能有,OK好了,那么同学们开工吧,第一波我们呢,来查询一下测试,那假如说啊CUSTOMER12是肯定有的,来后台干干净净的日志点一下,大家请看,查询出来了,此时可以看到也即我们的key customer12对应的布隆过滤器里面下标就是这么一个,在布隆过滤器里面是否存在yes,那么不能过滤器里没有ready,极大可能有成功通过访问判断校验通过,可以往下走,来弟兄们get比特,那么white customer来set这个位置有没有,只要这个有一说明在白名单里面,这有一个一,这个看位对应的值和right key就是CUSTOMER12。
17:54
OK,好,那么这个第一个测试通过,第二个测试CUSTOMER12删掉了,那么来get customer12,请问red里面有没有,里面已经没有了,那布隆过滤器里面还有没有,有我故意啊,做测试的时候前面已经说过了。
18:15
故意差异化,要数据来给大家演示效果,那么接下来我们的第二种情况,那么同学们来看看我们的代码还能不能访问呢?首先确认白名单里面这个坑位减还是一听懂了吧,那么一定要明白啊,我是删了re里面的CUSTOMER12,但是布隆过滤器里面的坑位还有的,哎,我故意也是这样出错的情况啊,那么接下来还能不能访问呢?我们可以看看源码在这。白名单里面有没有有看到没有这个还是一呢,那往下查会出现什么情况,第一个他去查现在red里面还有没有CUSTOMER12,没有了,但是什么鬼,是不是我们的MYSQL数据库里面还会有我们的CUSTOMER12这条记录啊,这么说能不能听懂,OK,那么来同学们还不明白的同学呢。
19:11
Lawyer。请看我们MYQ里面是不是还有卡12,所以通过不容过滤器以后下到这儿里面查,查不到进来,但是在MYCQ里面查查到了,且还会回写进我们的red OK,所以整条整条流程是这么走下来的,来,弟兄们,我们呢,再查询一下我们的12。大家请看。后台请问卡玛12对应的下标开位是这个在不容过滤器里面有没有yes,确确实实是有的,那么这个时候同学们请看我们首先有没有查出来,查出来了谁给我的MYCQ给我的,且我们现在再GET12有没有又有了,之前是没有的对不对?干嘛说明波能过滤器泛行了,去找red red由于之前被删掉了,Red里面根本就没有,进而打到了我们的MYSQL数据库,MYSQL数据库里面查出来了,所以S袜Q里面的测试有数据,且MYSQL数据库里面的数据又被重新回写进了我们的。
20:19
Ready实现了我们通用功能的编写,OK,好,那么各位同学,第二种情况过,第三种情况不能过滤器里面根本就没有,只好直接返回,不能再继续走下去,也即我布隆过滤器里面这些数据是来自于哪?来自于ready,是你ready让我进行布隆过滤器,告诉我哪些是合法数据,我要先通过red里面有的,尽量的做一个映射对照以后存进我的布隆过滤器里面,那么所以才能通过布隆过滤器来减轻red的负担。那么下面同学们请看啊,我胡写,现在1222,请问这个数据有吗?根本就没有,所以我查一下同学们漏一眼啥情况?Customer red key 1222对应的坑位是这个,那么请问这个坑位里面值是几?值是零,是否存在?根本就没有,所以白名单无。
21:19
顾客,也即red里面也肯定没有不可以访问,所以告诉你这个是不可以访问的,直接被弹出去了,OK,这样的话就起到了对我们red和MYSQL数据库相应的保护,听懂。那么这样是不是我们结合我们的bit map和不能过滤器完成了我们对应的保护red,减轻MYSQ压力,防止缓存穿透的实际工程案例呀,OK,所以弟兄们一套打完,全套收工带走,那么希望各位同学一定要认认真真的把这个案例动手敲一遍,全部给你编写完成了,OK。
22:03
好,那么接下来我们的不同过滤器也接近了尾声,我们允许杨哥在结束之前闲聊两句,啰嗦两句。第一个啊,各位亲爱,听懂了不是你的麻烦,你一定要动手亲自做一遍,一句话。Idea工程里面根本就没有这些对应的代码,不好意思啊,你根本不叫学会了,你现在明白了,听懂了,那是杨哥给你讲懂了,但不是代表你自己做懂了,所以请同学们一定坚持,这是第一个,第二个杜绝浮躁。很多呢,静不下心去写代码,去总结,去敲代码,去写笔记,那么弟兄们,你可以看得出,做这种东西是不是要比做纯粹的增删改查要有意义啊?所以知道现在大家为什么找工作难了吧,你。一旦被面试官问到有什么样的工程经验啊?写过什么,自研过什么东西吗?没有,我就写了一点业务代码,特别擅长于增删改查。那么这样。
23:11
告诉我,没有亮点,你很难找到高薪的工作吧,不要找借口说什么啊,现在主人现在工作难找。杨哥教了那么多学生,真真正正认真下来的,哪怕大专学历,月薪一万三照样能找到,而且还不是外包,你不用跟我干,关键是你可以去B站上看看我那些视频,杨哥也发布过好多了。有几个有本事从头看到尾写,看完了以后能够像我讲课这样一行一行代码连注释给你敲下来。很少,你去看那些技术视频,30集以后大概人就越来越少了。所以各位粉丝,各位同学,成功的路上从来不拥挤,因为能够坚持到底,能够亲自动手的同学太少了。
24:03
只是最后一集比较多,完结散花感谢上归谷有什么意义呢?所以各位亲,希望大家。久久为功,善作善成,希望大家都收到一个美好的新潮和播,感谢各位,请今天晚上一定动手写写我们的案例,并写进自己的笔记,写进自己的简历里面,面试的时候能够说两句。OK,再次感谢大家的聆听,辛苦了,谢谢。接下来我们给大家复习创建,总结一下布隆过滤器的优缺点,好,那么首先它的优点,高效的插入和查询内存占用比特位空间比较少,那么通过前面啊,我们比特map加波隆过滤器自研的这么一个,我相信大家对它底层原理应该是有深刻的思想了,一句话,它呢?
25:02
不存具体的数据和内容,简单而言,有点类似于这个数据是否是合法的,是否是我们需要的。有没有我们用零一来断定它是否存在,是否是合法的数据,然后让它取我们的专题访问,那么通过前面的介绍,我们同学们在这都可以看得出,关键就是四步,第一个请先给我一个你认为可以访问的白名单的合法记录啊,然后通过K。关键的哈希,靠着算出它的哈希value得到我们对应的哈希值,由哈希值通过我们设定的一个算法来获得它对应的坑位,那么此时就出现这个K和我们的布隆过滤器进行了零一的映射,一句话,对应的这个坑位就存着我们的这个key,有就是白名单,没有就是黑名单。那么通过我们的访问来判断它是否继续可以访问后面的内容,OK,所以它的存取不是存具体的内容,你可以把它理解为一张映射表。
26:16
一零来决定黑白,决定有无好,这是第一点,第二个它的缺点又是什么呢?各位同学思考一下。好,我先暂停一下录屏,我们可以讨论一下,感谢各位同学的回复,谢谢,首先前面已经说过,多次撑死它底子是依靠哈希COD的取。来进行对应的坑位,只要用哈希函数计算,100%要出现哈希冲突,所以它这块两个,第一个不大方便从布隆过滤器里面删除数据,因为删掉元素会导致误判率增加。因为哈希冲突,同一个位置可能存的东西是多条合法数据共享共有的,你干掉了这一个可能会影响到其他个,所以你删除一个元素的同时,可能把其他的也干掉了。
27:10
尽量不要删,那杨哥要是不够了怎么办?你可以重建一个,OK,尽量不要删除,第二个由于上面哈希冲突,所以它必然而然存在误判,不能精准过滤,那当然啊,同学们这点呢,也就是不要太苛刻,比如说啊,我们都晓得基于分布式微服的开发,100%没有任何一个中间件可以做到100%绝对的精准,哎,什么所谓的双写一致性对吧?弱的事物的一致性,最终一致性等等等等,都是要存在数据的修修补补,所以说只要它大体上能够满足。我们就认为它是可以用的,所以它这的结论有是极大可能有,无是肯定无,100%没有,OK,好,这个就是我们不能过滤器相关的优缺点。那么接下来。
28:02
正因为有这些缺点,不大容易删除也好,有误判也罢,尤其这个不能删对吧?那么这个key里面各位切,我们也晓得那东西这个set bit map里这个是不是就越来越多了,好,你又不能删,那么接下来呢,横空出世了,它的下一代过滤器叫布谷鸟过滤器,注意这块是个什么东东了解啊,那同学们我们简单的来说一下,首先它的出现是为了解决不能过滤器不能删除元素的问题,不,谷鸟过滤器横空出世啊,QQ。那么better than blow,它的网址是这样的,首先啊,那么弟兄们。有兴趣的同学啊,可以把这个网址呢一粘,大概看一下,找一些翻译软件啊,在这我再跟大家说一下啊。如果可以大家尽量的啊,嗯,学某个技术官网GI哈源码,包括找到这个技术,比如说叉叉叉之父啊,这个技术是哪一个大神或者哪一个团队他们传出来的,去看看他们写的论文啊,大家还是要学会在学术上呢,去查看一些论文,那么这儿就是我们的布谷鸟过滤器,它你看直接说了,它要比布隆过滤器要牛逼,那么你要有兴趣的同学可以往回翻查一下啊,找一些翻译软件看看,也就是假设你们公司是布隆过滤器的重度用户,你确实存在不方便,那么你直接上布谷鸟过滤器,这个就是最权威的官方文档,那么在这儿我们回到我们的教学答漏眼首先啊。
29:43
这个呢,做了一个两个过滤器的对比,那么有趣的同学你可以自己看一下啊。不过呢,按照杨哥。进些的这个企业调研啊,就是目前用的最多最成熟的就是波动过滤器,企业呢暂时也没有升级换代的需求,那么考虑到我们上课时间有限,这个我呢就不再展开,比如说现在JDK都出到19了,大家都清楚你生随你生,我用JAVA8,但是呢,2023年我认为啊,可能JAVA17,大家是可能需要关注一下了啊,当然这是后话,我们后面spring cloud2023的时候咱们再聊,那接下来我就想和大家说一下啊,就是说布隆过滤器啊,它确实有缺陷,不完美,但是绝对企业够用了,所以呢,由于企业啊没人用,我呢也就不在这儿过多的展开,只是留下一个出口,有兴趣的同学自我提升一下,那如果你要是觉得这块也不是你的重点,我认为啊,不能过滤器足够你们用了,那请大家呢,酌情参考,OK,过多的我就不再展开,有需要自行学习,没需要保证不能过滤器拿到手就可以了,OK,好,那么这个知识的拓展。
30:52
就给大家呢简述一下,那么接下来那么同学们梳理一下我们的不能过滤器理论实操总结都给大家呢,说清楚了,对于我们的这个案例务必动手练习一下,好再次感谢大家的聆听,不能过滤器这章就给大家介绍到。
我来说两句