00:00
好,各位同学大家好,接下来向大家介绍布隆过滤器的使用场景,那么结合我们这一张是我们本次的重点理论实操代码落地维服务编码说话,最后小总结,好,那么了解了波轮过滤器它是什么,能干什么,它的运行原理以后,我们强调过一句非常重要的话,有是可能有,无是绝对无。OK,所以有这个特性以后,我们就可以把我们一些敏感的关键的安全的数据,合法的信任的网址,邮件地址先放进不能过滤器里面,成为白名单,甚至是什么取反操作成为黑名单,那么他有这个特性以后,如果无,那么说明什么,你不在白名单里面,我不让你反问,或者说你有那么。是白名单的信任的数据已授权,那么我可以给你往后面反问,那这样的话是不是就可以大大加强我们数据的准确性和安全,安全性,尤其是什么它呢?先做了一次过滤,那么不合法的请求将会被弹出去,那么这样是不是避免了很多黑客攻击和不安全的访问?好,那么下面我们来看一下,首先它可以解决缓存穿透的问题。
01:24
在RA里面结合bit map可以综合使用,这个是非常应用广泛的,那么这我们强调一下,对于我们的。缓存预热、缓存雪崩、缓存击穿、缓存穿透,四个不同的概念,四个不同的问题,我们将在下一章给大家呢详细讲解,那对于我们的缓存串套,前面或多或少我们也说过,现在刚好遇到了,不妨我们可以先提前了解一下。首先一什么叫缓存穿透?第二个缓存穿透如何用不能过滤器来解决,那么下面呢,我们来复习一下,一般情况下咱们大家呢,都是先查read有没有red有直接返回read,没有再去查数据库,如果数据库里面有,直接再返回并回写red,否则那就是read里没有,数据库也没有,这样的情况下就说明什么read加MYSQL都没有,那么每次访问都会打到MYSQL上,这个就叫缓存串透,偶尔一次两次无所谓,但是不排除啊,有些黑客攻击也好,或者有些无聊的人,那假设他就是user,假设就告诉你99999999这样的用户号,OK,你这样一查,Red没有那么。
02:45
MYQ也没有,或者说他本身就是一个非法的请求,那根据我们的机制,如果查了以后MYSQL也没有的话,他是不是会把这个T。有可能回写进ready,或者直接返回一个,那那么你这样是不是挡在MYQ前面的ready几乎是什么名存实亡,彻底失效了,而且最夸张的是什么?它带来的问题是偶尔一次两次。
03:14
无所谓,再强调一遍,但是大量的请求,哎,有黑客攻击,专门生成一些你这个库里面绝对没有的一些编码前后缀等等。麻烦了,直接在red里面找不到,通通达到MYSQL,那么这个时候是不是会把我们的MYSQL给拖垮?OK,好,那么我们如何使用布能过滤器来解决缓存穿透的问题呢?我们把已存在的数据的key,也就是我们这些白名单里面的关键敏感可信任的数据先在布温过滤器里面存一法,也就说这些都在布隆过滤器的比特位呢,占了相应的坑位,这些是合法访问的,相当于在red前面挡着一个过滤器F,那么好,新的请求过来,我们先去过滤过滤器里面查查有没有,我们前面讲过有是可能有,无是绝对无,所以如果不能过滤器不存在,直接返回,哎,这个是一个肯定的,对不起,你过来找的话,我们先去不能过滤器里面找找,如果不能,过滤器里面有没有,那说明什么?Red面也没有,不好意思,你不用去反问后面的了,走吧,那么这样是不是大大降低了我们MYSQL被打爆的压力,因为你连都没走到OK,好。
04:25
如果不能,过滤器已经存在了,我们才去查red,如果red里面也没有再去查询我们的MYSQL,那么如果这个时候MYSQL也没有,那么才发生了偶尔一次缓存穿透,前面说过偶尔零星的一两次缓存穿透没关系,也许真的是没有这条数据,但是频繁的打到我们的买色条,我们就要去查网络IO,这个时候有可能是黑客攻击或者一些错误的重试机制啊,那么结合上面我们就会发现它是这么玩的。我们现在呢,就要做一次数据的预热和同步,先按照red和MYQ,我们筛选出来哪些数据是合法的,用户合法的,安全的,可以被访问的正常白名单的数据,先在布隆过滤器里面从以范,如果是布隆过滤器里面有,大概率red里面会有,那么这个时候再请你反问red,如果由于波隆布滤器我们前面说过可能存在一点点的误判,那么它这说。
05:25
定有,但是买前面的ready根本就没有,那么再去查MYQ,或许有,我们都返回,OK,那如果无是肯定无,对不起,否是不存在,就把流量提前拦截在了red之前,那么我连red都没去访问,那么更加不可能打爆我们的MYSQL,这样我们程序的高可用高性能是不是获得了多的一份保障啊,OK,好,这个是我们的一个要求,第二个黑名单校验,识别垃圾邮件,那么这个是反向操作,我们现在波能过滤器里面放的呢?
06:00
一些数据就是我们需要识别的垃圾邮件,这么干啊,发现存在黑名单当中,就执行特定的操作,比如说识别啊,只要邮箱是在黑名单中,邮件通通认为垃圾,那么假设黑名单的数量是以数以亿计的,那么存放起来就非常耗空间了,而不能过滤器就可以解决,反正0101某个坑位如果是一,这个坑位的这个一代表有人占用,占用的这条记录我认为就是一个白名单或者一个黑名单,那么假设啊,我们把黑名单都放在不能过滤区里面,我在收到邮件里面,判断邮件地址是否在不能过滤器里面即可,那么就可以决定访问还是不能访问,OK,好,那么安全连接网址,全球上10亿的网址的地址啊,对吧?你觉得哪一些是安全的,哪一些是不安全的,通通有布隆过滤器来判断,这个就是我们布隆过滤器里面最主流的黑名单、白名单机制,对应的解决缓存串套、黑白名单校验、安全信任判断等等最主流的使用场景。
07:00
接下来尝试手写一个布隆过滤器,结合bit map自研一下体会黑白名单布隆过滤器挡在red前面,做一个进一步过滤优化查询和保证高可用的这样的一套程序。那接下来啊,咱们呢,在上课之前啊,首先啊,刚才网线有点掉啊等等部分同学上线,那么这呢我们闲聊两分钟啊,那么注意啊各位同学,那么接下来是闲聊啊,第一个由于现在呢北京呢疫情比较严重,大部分同学呢是发烧感冒,顶着头昏脑胀来上课,所以按照学校要求,必须要讲解细致慢一点,OK,所以呢,杨哥呢也体谅一些。已经严了的同学还在带病坚持听课,感谢你们,所以放心,慢慢的一点点来,OK,那假设啊,部分同学身体健康,脑子聪明,学习的很好,也说你基础好的,你呢也等等这一波养了的同学啊,人家带病上课,所以呢稍微有点耐心,你呢就当是什么复习一下好吧,因为每个班同学们的水平有高有低,基础各不相同,多多包涵,部分同学是带病上课,现在是吧,北京这个疫情有多严重大家都清楚,那么第二个。
08:18
千万不要觉得什么你懂了,我关心的是什么知行合一,好不废话那些你觉得你学的很好,哎呀,听懂的同学,要不现在我让你手写个波动过滤器,前面什么原理我都给你讲了案例。我也给你弄出来了,撸个大码我看看。你现在就我就给你,我说要不这样吧同学,你的方案我都统一,那么这个布隆过滤器要不你自己研发一个好吧。周三给我这个,就是你这个单月的绩效KPIOK,所以各位同学一定要注意,你懂了,只是理论加现象,我们大家都清楚有句话是不是叫知易行难,俗称c easy,干嘛嘟嘟hard OK。
09:12
所以那波你觉得你懂的同学,你现在不要先听这一节,这一章,试试手写一个,我看看。哎,你会发现。动手和你听懂理论两回事,OK,那人也到的差不多了,同学们,我们呢,开赴战场,回到我们的脑图,来会一会这个手写不能过滤器的微幅加va案例,来看一下编码落地如何实现。结合b map类型,手写一个简单的波动过滤器,体会一下设计思想。架构步骤编码三板斧带走,那么接下来同学们lower啊,前面呢,我们说过了这个hyper log log和go。只要整合red,无非就是原生的red命令,结合我们的red temp来做一下调用,如果这样来给大家讲解呢,过于单薄,所以我们传了一个不能过滤器的案例和bit map这样的一个类型给大家呢,来落地来看看我们的案例,首先我们的整体架构是这样的,那么大家都清楚。
10:22
Java程序。他呢?要去反问不能过滤器,不能过滤器里面有。我放行也记。大概率认为red有,如果过滤句没有,那对不起是绝对无滚蛋,那么这样是不是在反问red之前就会有一次判断,那假设你找到了布隆过滤器,布隆过滤器判断有,那么说明在是可能有,那么这样从就返回了,那么是不是避免了MYQ被打爆?OK,所以这三块才构成了你的高可用,当然更狠的在这是不是可以搭建一个集群?好了,那么同学们。
11:10
强调过所谓布隆过滤器是个比特位的数组。那么。这是下标,这是坑位。如果是一。代表可能是一个合法的邮件,可能是个关键敏感词,可能是一个合法的网址,可能是一个VIP重要的信息等等等等。总之一句话,如果某个坑位就映射着某个记录,一个复杂的网址记录VIP信息,那说明它就存在于波能过滤器。由于我们不能过滤器,要保存的数据是先要跟red同步,你要授权给我哪些是白名单客户,或者哪些是黑名单客户,所以我们这儿先来看。它的原理是布隆过滤器里面这样有一些数据。第一个。二进制数组的构建过程,也就是我们不能过滤器里面它的初始状态的构建分四步。
12:00
一预加载符合进入的条件,比如说啊,我们在这儿,那么customer假设11这个用户就是合法用户,好吧,Red里面肯定有,那么我就先加到这,那么计算每条记录的哈希值,然后对哈希值进行对应的取模了以后比特数组外,那么假设啊,Customer实现。这个是合法用户,他就在六号坑位写了个一修改直播机,证明我确确实实在red里面有,OK,好,那么接下来回到我们这儿,那么我们来查询的时候呢,怎么办呢?查找元素是否存在,反过来这个customer时间现在过来了,那么对应着我们这啊,假设18770531,这是我另外一个啊,一个ID吧,就是一个K吧,拿这个来说吧,它也取一个哈希,那么注意我们这说过,这个哈希值可以是一个函数,也可以是一系列多个哈希函数共同得到一个最终的哈希值,取模拟后位置是六,那么所以说我们先计算元素的哈希值,哈希值找到对应的数组的位置啊,那么就是比特map,比如说331780这个比特外,他看看上面,也就是对应着我们这的这个六号坑外是一还是零,找到四轮对应位置的值二,零代表不存在,一就代表存在,OK,那么整体架构设计思想和流程图就这么一个。
13:23
那么我们的步骤设计是这样的,Set。Bit和get be我们两步,我们这说的很清楚了啊,首先啊,咱们说要用的话,是不是先要构建这么一个不能过滤器,也就是左边这个这四步的原理,我们是这么干的。我们来模拟假设whiteless customer就是白名单用户假设这个叫customer,实际注意这个type white customer list是个死类型,也就是我们的什么bit map类型,那么自带的二进制速度bit map不能过滤器就是这个白名单。
14:00
在1772098690这个坑位,这个位有个一表示CUSTOMER11这个用户存在,那么K冒号customer实际线对应的坑位就是这个,那么接下来相当于说我set这bit map里面的这个坑位里面对应的就是customer实际线,好,我们下面假设CUSTOMER11过来访问,11号用户过来了,我要去查询我相关信息,我先去跑进去我的布隆过滤器里面看看。这个customer冒号,实际这个T对应的坑位就是这个,那么好,不能过滤去,里面一反馈这个坑位有没有线,要那么说明什么,它大概率是个合法用户,你通过不能过滤器的选择可以访问到后面的大概率你会存在于red里面直接返回,当然啊,我们前面强调过有哈希冲突存在有可能。哎,这个同样这个坑位存的也有可能是别的,但是呢,大概率卡实际是应该在这个坑位也在re里面,好,那么塞me它的构建过程来后面我们的编码啊,用post customer初始化一个白名单,合法用户计算哈希值,计算对应二进制数组的坑位,那么对应的这我们就是卡玛11,你给我算出来它应该是幺七七二零九八六九零号,这个坑位上面叫有对应坑位填个一,说明我什么,我在因为啊customer十一百分之百已经是先存进了,是告诉不能过滤器,我这个CUSTOMER11就应该存在你的不能过滤器,那么CUSTOMER11我就告诉你,我要我给你申请了一个坑位,写个一,这个一就代表卡11存在于ready。
15:39
好,这是我们的set be塔不能过滤器构建的过程,那么接下来get be塔查询是否存在查出来的过程呢?一样我们卡萨实间就要计算哈希值,一样的哈希函数反向操作,通过上游哈希值算出对应的二进制数组的坑位,就是刚才那个177长串那个,那么返回对应开位的值零表示五,一表示存在,OK,好,那么同学们,这个就是我们的设计思路。那么接下来。
16:05
我们呢,分两步,第一步,Spring整合整合美案例基础上我们建一张表,比方说customer一键编码生成环境,也即传统的杨哥带着大家在spring cloud做过项目的时候所说过的spring结合,结合美是一键编码构建的一个环境,OK,好,这个完成以后,在它的基础上我们再新增。布隆过滤器的案例,完成我们普通过滤器和bit map对应的开发,OK,好,那么同学们架构设计给大家讲清楚,接下来纯编码。架构,咱们明白了,接下来怎么干?为了新增布隆过滤器这个案例,更好的跟我们恢复整合,那么杨哥现在需要做一个磁boot整合red加美的案例,比如说我对我们的某张表customer客户啊这张表来对它进行写和读这样的操作,由red到MY来构建写入和查询。
17:07
有这个的基础上,我们再在red前面胆一层不能过滤器来给大家实现下面这些东西,所以我们先做red加spring boot加美的整合,由第一步完成以后再来做布隆过滤器挡在red前面来进行白名单相关的校验和查询O了,那接下来啊,对一个customer表,这么一张单表,一个单的NTT实体的查询,那么增删改查这些我默认大家都懂了,因为我们前过前面啊,杨哥带着大家做cloud的项目讲解,包括冯阳老师带着大家做项目的时候。对于一键生成这个动作,那么富阳老师在美杯提plus这块已经详细讲过,点一下全部生成,那不废话,弟兄们,我们先来复习一下啊。
18:00
对于这个网址叫美贝斯generator,这个呢,我相信大家呢,一看就懂,一听就会了吧,这个不再重复啰嗦了,那接下来是杨哥这一套,我们呢介绍另外一个叫通用map4.0版,OK,俗称TK map,它呢跟美plus差不多,也是点一下可以一键生成一些增删改查默认代码的,OK,好,那么这个就叫MY通用map,它的官网如下来,是由我们中国人开发的啊,这个我用过很多年了,非常稳定,非常好。当时在这是MAYBE4,我也一直用它,那么它下一代啊,它叫MAYBE5,那么在我们的get up和get上面,同学们可以看得到。好一句话,到四和五稍微呢有些小小的变化关系不大啊,这个呢就叫通用map,这个人呢非常厉害,是我们一个安利一下,给这位同学做个广告,美贝官方推荐分页插件page helpper的作者刘增辉同学,那么如果对美背帖感兴趣同学可以支持一下啊,在这呢,我也对刘增辉作者呢提出敬议和感谢,我用他的框架做了很多东西,确实非常好用,待会你们会体会得到,OK,好,那么话不多说,在这块我们来研究一下我们的一键生成来。
19:27
第一个。T customer用户表弟兄们直接粘脚本一张,OK,你随便选个库,比如说杨哥这选的是big date这个库里面啊,然后呢,同学们对于这张表,IDC name,客户名字,客户的年纪,手机号,性别、生日等等没问题吧,那现在已经在某个库下面有这么一张表了,这是第一步,第二个。建的mode,那么是不是又是我们那一大堆微服务工程的建mode改po斜亚母猪启动也不类对吧?那么来它叫贝斯gen,弟兄们提前上好。
20:09
第三步改泡沫,那这稍微有点注意啊,建议大家呢,跟杨哥保持一致啊,你先用四这个版本啊,我就没有用它更新的下一代的MAP5,那这些都在这个官网里面都有,要么看code的,要么看VT,还记不记得弟兄们这个时候杨哥是不是说过这些动作好在这儿打开,那么弟兄们。你选择我们的和布整合,大家请看这是不是又叫TK美倍T也叫TK map OK,好。这个完成以后,请看一下我们的泡沫,也就是说我这些架包是从哪来的,均来自于官网啊,这个呢,我们前面也讲过,我们弟兄们呢,稍微复习一下,跟着粘就行了,来拿到这全部拿下,那么弟兄们粘贴。
21:02
来吧。前面呢都说过老规矩,如果这儿不OK的话,是不是请同学们刷新一下,那么由于之前杨哥呢,都已经做过很多项目,这些家包呢,自然而然都在我的本地看一下啊,那么对于我们的这个通用美四,那么就是美通用map TK啊,单独使用自己带着这个版本号my bet 3.4.6MY和spring的整合my bet genator,通用mypa的这这么一个东东,OK,好,这是我们的泡沫,相当于ma相关的配置。第二步完成,第三步写要么对不起,不需要,OK,好第四步,那么自动化生成的话,在resource这个路径下面,我要新建两个文件,一个叫配置属性,一个叫生成的配置,那么它的内容大,第一个搁到这儿。
22:00
Com at7是我们的包名,那么也就是我们的GDBC,那些驱动URL,用户名和密码,这是我们的第一步,那第二步我们弟兄们回到我们这。产生的这么一个配置,是一个XL来搁到这儿直接粘贴同学们。这么看不害怕了吧?上面是X头文件,下面就告诉你我的配置文件的资源是跟我在同一目录下面的这个con property来点开。这个是它插件固定写死不用动,就告诉你我这个maps来自于T开美被TS,就是连刘增辉这个作者所写的一些通用的包,好这个没问题吧,那么是不是驱动原L用户名密码,请问是不是就是这四个选项值啊过那接下来这个他就告诉你,我按照你的包名package name,弟兄们,这是不是叫package name叫come at硅谷RED7,好,也就是生出来的东西和我们RED7STUDY这个里面的包名是一回事,听懂了吧,我们待会它生成了,我们是不是把它拷进来,有些是不是给我们省写了,好那么这个就是我们的目标的package,它生成的是n map配置文件和mappa相应的接口程序来。
23:26
这个直接写死不动,重要的是这个这个table name就是你对标的某个库下面的某张表的完整的表明table name,这个domain object name,也就是我们生成的N实体的名字,我们用TBCOK,好配置完成,那接下来呢?那么怎么一键生成我们的代码呢?请双击美贝斯gen这么一个插件就行了,好,同学们漏眼啊,我现在在这个贝斯generator这个自动化一键生成的,下面是什么代码都没有,那么回到我们这儿。
24:04
刷新一下。保证所有的架包和配置能够通过,没有红色波浪线报错啊,这个不用管啊,这个呢是一个同步的话,好,那么来同学们搁到这,大家请看我们这儿是不是有个美倍体斯杰瑞塔,来它有这么一个,请大家双击,OK,好,那么这个时候它就会通过插件和反射自动的连接到这个库,这张表来吧,Successful成功看着。弟兄们有没有发现刚才是什么都没有,没错吧,现在给你自动生成了三个东西,分别就是DAO倒层所需要的ENT customer,看一眼,大家看ID c name age,电话、性别,绅士是不是跟我们这个这张表的表头。逐一匹配,这个是不是不用写了,过第二个同学们customer map。
25:05
怎么样,爽不爽也就这个接口,我们大家都清楚,这个是不是就是我们增删改查的do接口,或者叫map接口,它直接继承了这么一个接口里面,以前我们用美plus所写的那一大堆什么增感知的方法通通没有了,人家给你抽空了。第三一个是不是也就是生成了我们这么一个东东,那么来只是告诉你接口是哪一个,对应的entity是哪一个王活,那接下来我们是不是只需要把我们的entities和maps拷贝回我们的RED7这个工程里面,开始完成我们对应的编码和增删改查,OK,那么来这儿一键生成,就是给大家最后做一个笔记,最终生成红框框的一个NTT。一个接口,一个map.xl的配置文件,然后呢,蓝色的这个就是这个,最后红色的这个用这个命令直接生成就OK了,所以各位同学写增删改查的程序员根本就不值钱,一键生成OK,但是你能够自言不能过滤器这个东东是面试官才想听的。好,那么同学们第一步完成。
26:11
上一步完成了一键生成,那接下来spring加美加write缓存实战编码的第一版程序我们继续编写,通过上一步我们可以知悉点一下对于增上改查单表的customer,搞定entity接口。Map XL这三个已经自动为我们编写好。然后对应的包名相同,这个NT和map是不是拷贝进我们这个工程里面就OK了,那接下来我们来改吧,改吧,第一个建mod,那是不是改造我们的RED7STUDY这个工程,那么改什么呢?之前我们没有引入我们的。May和通用map,那么接下来引入那么对于我们的泡沫直接粘贴过来搞定,我们以前没有加载过的,你看像什么简latest这香菜什么都说过了啊,我们接下来就是springport与整合瓦个二,然后现在是不是MY的驱动,再加上我们对应的spring集成了我们的阿里巴巴德鲁鱼连接池,My be和spring整合糊图工具包,以及我们的持久化和通用map OK,也就是把它上面所要求的这个集成通用map第四版这个程序走了一遍,好,这是我们的是吗?泡沫相关的东东,那么大家呢,可以先看一下我们对应的价包。
27:48
请大家我传给大家,现在就下载都有了吧,那么一步步来啊,那么接下来。键mod改泡沫是不是要写亚M?那么我们亚M配置文件不用多说,弟兄们都清楚,只要你看到了德鲁伊和美杯替就是德鲁伊连接池和美贝,二话不说是不是?这段话先得给我粘进去,OK,以前我们讲了单机,然后呢,Red集群对吧?在小白篇,那么现在咱们是不是整合过来这些东西来吧弟兄们。
28:22
搁到这儿。搁到这来,再次强调哪一个数据库,你自己的地址、用户名、密码用你的好。对于我们的美T,我们实现接口和配置文件分开,看到这儿我们都明白要干嘛。是不是记得在我们sc may resource工作下面要新建一个map文件夹,并拷贝customer map X拷贝过去明白吧,那么来,所以说呢,在这块弟兄们map这么一个文件夹,这个里面就要我有我们之前用一键生成。
29:01
一步到位所生成的这个customer map XL,给我把它放在这儿,那杨哥的习惯是尽量的啊,这个里面就是纯纯的Java代码,配置和编码分开,好把这个拷贝镜。Resource文件夹下面的map文件夹下面的这个地址直接拷过来,OK,那这个里面弟兄们都清楚,无非给你搞了个映射,那些增删改查都给你写完整了,好,这是我们的第三步,第四步,主启动类,这个非常关键,你我们现在呢,通过上面的一键生成代码,有了该粘贴粘贴,该拷贝拷贝。只要你用了。对应的持久化和通用map啊,也叫TK map,或者叫TK美T4,那么就是通用MAP4 OK,一定要在主体这上面,泡沫里面是引入。对,我们的主启动,主启动类上面一定要激活,所以在主启动类这请同学们加入这么一句话叫MY扫描,保证你所有的这个map都是个倒层的接口,可以扫扫描到,所以各位亲,在这杨哥呢提前建好了一个。
30:17
文件夹。目录,并把我们的customer matter,也就是这个生成的是这些提前拷贝进来,但是拷贝进来以后你得去激活,所以在这儿弟兄们你就把刚才杨哥这句话完整的一粘贴完活,注意看硅谷7MAP,你就代表它可以成功识别下面倒层相关的东西,一定要注意你引入的包。TK没被踢死,用这个OK,好,弟兄们,这是我们的什么第四步,那么接下来干活就编码完成,就是我们写代码的yesterday。首先。数据库表t customer是否OK?
31:02
完全没问题,OK,第二个NT铁,那么上一步自动生成拷贝过来,Customer来吧,弟兄们,这NTT我是整个把文件夹拷贝过来了啊,那么连你看连文件夹都是一样的,来吧,Customer实现了序列化,不也就是我们刚才说过的这些东东,OK,那么都有丰富的s get,有了N王活,那么map接口拷贝过来了,弟兄们有了吧,OK,然后map的S也是那个XL配置文件,弟兄们有了吧,见过了,所以我们真正真真正正要写的是service和CTR了。前面这些一键生成拷贝的动作我已经提前做完,咱们节约时间来,弟兄们。万事俱备,那么就来写我们的1万年不变的controller第service,那杨哥呢,提前写好CTRL了,上面这些斯瓦哥,这个是标配,这个是日志啊,然后。
32:05
CTRL了,是不是掉我们的service,好,接下来。同学们,Lower service头部文件固定写不会画来吧,开始我们的编代码,那么第一个那么是不是我们的公用的产量,那么去来这个叫缓存,看始下发线key什么customer,也就说我们在这个缓存以后,大家是不是这个缓存的前缀,缓存一定要有前缀对吧?Customer冒号来拼一个customer ID啊,假设我们刚才老说说过的customer实一就是个合法用户听懂好这个固定写死,那么都有了以后ctrler可以调我们service,那么service又调什么呢?弟兄们,那么100%是不是要调我们的?Customer map和template呀,哎,所以resource,那么这个时候第一个是不是customer map customer map,第二个resource,你用也可以啊,个人习惯private干嘛,这个时候我们的red temp red temp明白,那么service是不是就靠一个数据源是red,一个数源是每倍提次来,那弟兄们我们先来玩一个程序。
33:31
对red和MYSQL写操作程序,对red myql的读操作,OK,那么来吧,先建立这么一个public VO,第一个and customer,那么这就是我们的customer customer这一波没问题吧?那么来,弟兄们,我一添加的时候我要干什么?先用我们的倒餐,先去查一个,那么select大家请看啊,在这儿是不是有我们的select。
34:05
啊,这个不是查询在这块余了,这个应该是先写操作插入,那么是不是我们的insert select OK这些方法你直接调,你插哪个呀,我插customer进去,来这是I返回值,就是一个整数,如果我们的I大于零,说明什么情况,是不是插入成功啊好。那么现在为点是不是先要往数据库里面去插入?我们说过我们写操作永远以MYSQL为底单数据,那么现在如果这个I大于零,说明MYSQL插入成功好了,那么下面干嘛?如果进到这,那么就说明MYSQL数据库插入成功,需要重新查询一次,将数据捞出来写入进register完成,是不是我们的数据同步好,那么来,同学们,接下来customer map点这个时候select by,什么鬼?是不是primary key OK customer.get idea,这个是不是就是用户的主见?那么来吧,弟兄们,在这块是不是就可以获得我们对应?
35:32
对象获得的一个customer,这么说能跟上啊,假设这叫result查询出来的一个东西,它是来自于我们的MY数据库,只要你能够查的出来么?来吧,String,因为这个啊,只要大于零进来说明肯定插入成功,肯定插入成功,这个result一定不会为空,同意吧,那么来吧。我们K这个相当于这个K是什么呢?就是K。
36:00
好,那么来这个K咋整怎么拼啊,那是不是就是我们的这个前缀,再加上我们对应的customer.get get ID应该是OK,好,这是我们的第二步,那么接下来。我们就要完成对应的是不是捞出来的数据写进我们的,OK,那么。temp.o对应的什么操作词句类型的for value.set哪个这个是不是就是我们的key,然后哪一个是不是我们的customer,当然在这块是不是就是应该我们的result,这么说弟兄们,OK,好,这个就是我们的写操作,点一下往数据库里面先插入数据库插入成功了,从数据库里面再查出来,再把我们从数库查出来的东西写进我们的ready,好,这是我们对应的怎么着写操作OK好了,那么只要有写,必然有毒。
37:21
来吧,我们一读是要查出来我们的customer,那public customer,然后呢,Find customer by,哪一个是不是我们的ID,那么这个ID的话呢,一定是integer,然后呢是customer ID,好这些呢,要求呢,当然都是基本功了啊,再带大家做一遍,那么customer customer默认这个时候是不是一定是个那那么return我们的customer,好了,去查询来吧,首先第一个是不是我们缓存red的。
38:00
Key名称那咋整呢?是不是我们,那么key等于什么鬼,是不是就是。这条代码王华好了,第一步先去red查询,看看有没有来吧,弟兄们,那么怎么玩呢?是不是write temp?然后op for value.get拿到这个K,弟兄们没问题吧?好,那么当然这个key就应该是我们现在从red里面查出来的这个customer,这么说能跟上,由于它是个object,没关系进行一下强制类型转换好了,接下来那么就是要进行我们的判断,那么red有直接返回没有再进去查询MYSQ弟兄们没问题吧?所以呢,第二步,如果customer等于,那那么说明register没有进去查我们对应的MYSQ,如果说不等于钠在这弟兄们爽死了,是不是直接就返回了,那说明red我查得到,我就不会走第二步,Red里面查得到,直接返回好了,那接下来弟兄们继续,如果red。
39:29
等于那干嘛,那么现在。如果没有第三个,再去查询我们的MYSQL可以吧?所以这就是customer map.select by primary key,那么就是我们的customer ID传过来的这个参数弟兄们能理解吧,应该不难吧?OK,那么这就是我们的customer,那么就等于无非现在是个customer。
40:02
Red里面没有等于,那我进去MYSQL里面去查好了,那么接下来又分两种情况,这种情况那么就是我们的3.1咋整,MYQ有REGISTER5对吧,这种情况就是register里面没有,我进去MY里面去查,MY看这个customer现在空不空,然后如果customer不等于空,说明我们的数据库里面是有的,听懂了吧,那干嘛,是不是我们的3.2。把MYSQL查询捞到的查询出来的数据。回写register,那么就是保持双写一致性,OK,假设这个customer不等于空,说明我在买里面有的,那么这个时候怎么回写?那是不是又是我们的right temp.o for value set,那么对应的是不是又是我们的key和customer啊?
41:17
OK,这波完火,那假设啊,Red这一波是难,然后这个也是none呢,不,Red my myq不等于烂,那回写ready,那么这个时候返回,如果这个也是,那MYSQL里面查出来也是,那那么这个时候就只能是返回我们的customer,这个时候就是个难,OK,好,那么同学们,我们这对于我们service对ready myq的写操作一个,独操作一个啊,增删改查我就写两个了啊,你只要写操作对了,查操作对了,Update和底留为家庭作业,弟兄们自行去编写,那接下来回过来,这我们是不是要完成我们对应的。看透了掉我们的service,那弟兄们这个应该怎么写呢?那么第一个方法,那么public word,也就是。
42:10
跟这个一回事啊。来,那么在这呢,我们呢,就图个省事啊,这个参数就在里面拼了,那么这个方法呢,是这样的,第一个永远是API operation这个干嘛呢?那。数据库初始化。两条吧,Customer记录插入,OK,好了,那么来吧,弟兄们,At request mapping,那么在这块value,那么就等于我们的customer这个模块里面的at,好,Request。Method,这就是我们的post写操作好了,那么在这啊,我们的意思你是点一下就一次性插入两条记录进我们的MY,自然而然是不是也应该有两条记录从MYSQL捞出来回写进我们的ready,好了,我弟兄们这个时候我们那就是两条记录,那你有customer OK,来吧,那么customer.set c name来拼一下,那么这个时候就是我们的customer名字,那么这个时候讲那个。
43:30
哎,好吧,它循环几次就是几次。好,那customer.set age,那么这个年龄呢,我们就是尿random.next那么假设是呃,30以内吧,随便编写一个名字,好,那么customer.set phone OK,那这个时候就是1381111假设啊,这个就叫呃。
44:00
叉叉叉叉,好吧,随便写一个,那这个时候接下来呢,赛性别,性别吧,不是男就是女一男零女,所以说呢,在这个时候就是new random随机第2NEXT in,那么二就是不是零就是一,那么在这搞个前置类型转换字节嘛,OK by,那最后一个呢,就是customer.third birthday,嗯,那么就是我们的date点。父母,然后location datetime.now OK,然后呢,再at我们的时区吧,At z,那么这个时候Z id.system跟系统默认的OK,最终我们呢,来一个。嗯,点to。
45:01
Instance应该呢就OK了,好,那么这时候呢,按照时区啊,它现在这种写法呢,就是在操作系统上呢,更更加呢通用一些,好,那么接下来那么是试是弹来掉,So,现在你拼出来的这个卡们就直接给我玩火这波弟兄们没问题吧,好,那接下来呢,写操作我们完成了,那么我们是不是要完成我们的查询读操作,那么我们查出来一个customer,那么记录的名字也很简单,隔到这儿隔到这儿。方法名也就叫这个,直接就写过来,懒得写了啊这。拷贝一下代码find customer by ID,那么这就得到我们的一个呃,对应的customer ID,好了,这些呢,懒得写了啊,偷个懒直接拷贝那这块就是。单个customer。
46:03
查询操作OK,按照卡。ID查询好,那接下来这个来吧,我们直接呢,就是嗯,张玉福了啊拿着ID。查询的话呢,这个呢,就应该是我们的,哎,Get好,那么来弟兄们搞到这完火以后,那么很简单,那customer service find。那么在这一块的话,我们是不是忘记了一个非常重要的东西叫pass aver,来吧,直接搞到这,OK,那么弟兄们,我们这一查询以后是不是就彻底完成?好来,弟兄们,我们对应的程序和编码已经全部完成,来看一下我们能不能通过斯马格的测试。好,现在注意写到这儿只是完成完成了我们美倍加right加s boot的缓存框架的整合,还没加不动过滤器呢,听懂了吧?好了,我们听学们一切顺利的话,我们先来启动一下我们的微服务来测试并通过。好,有问题我们再调,我们呢暂停一下屏幕,各位同学loe OK,我们现在呢,一切顺利。
47:27
后台成功启动,那接下来丝袜哥是不是就要聊聊了,那么这个时候我们的丝袜哥打开我们对应的。操作来弟兄们,这个是不是客户的customer接口来吧,首先啊弟兄们。最高是到11啊,现在那。搁到这,我们呢,先来看一下我们的kiss,诶,好,那么kiss心啊,Customer和customer有这些开头的十二十一啊,好,那么弟兄们以前的数据我们大致呢有个了解,待会儿呢,我们来进行对应的测试,首先先艾特尝试一下,点一下好弟兄们200成功,那么来吧,看看后台,大家请看,应该没什么太大问题。
48:20
实际。刷新一下是不是十二十三,那么CUSTOMER0 customer1,那么23岁一个九岁一个同学们零一,刚才的这个1381114个大叉叉进来了吧,OK好,说明什么?MYQ有了,那么MYQ有了,杨哥,我们的red会不会有呢?那么kiss新,大家请看我们现在新插入的是不是12和13啊,那么不用多说,现在12和13是不是也已经有了?那么来,那么是不是get customer冒号12,大家请看这个时候是不是标标准准的一个计算串躺在red里面等着你,所以我们的程序完整通过,OK,好,那么。
49:05
回到我们的斯瓦格查询一下,你要查多少呀?我要查一下我们对应的这个12CUSTOMER林名字叫点一下弟兄们lawyer是不是好,那么在这块稍微有点小问题。我来调一下程序,看一下这块呢,有一个什么样的语法错误是500,首先呢,作为一个查询啊,内部的一个错误,我们看一下后台直接告诉我呢,这个呃要求的uri的这个模板的变量CID对于这个呢,是inte,是不是现有的一句话我错是错在哪了呢?那么弟兄们漏眼,这是不是ID没问题吧,我传一个ID,我这是不是写成customer ID去了,哎,所以说我这是不是应该ID和这个customer ID应该统一啊啊这是一个小小的语法报错啊,稍微改一下啊这块我想起来了,我这块呢是这个方法头,我当时呢透了啊,直接拷贝过来了,OK,所以说呢,就给这个啊参数名字的没对上号,那么在这块ID,然后在这块呃ID对吧?好,那么在检查一下,确保万无一失,那么搁到这儿查询,按照客客户ID,这那哦,这还有个小问题啊,各位亲,不好一失,那么在这一块的话,因为这个卡上了现在。
50:20
Did没错,应该叫前缀呢,是叫customer冒号,应该传进来的12,那么在这块这个customer现在是none,他get的话肯定没有对吧,所以说呢,这肯定也是个潜在的隐含bug,好,我们再来看看逻辑上拼起来ready查有的话,嗯,应该是没什么太大问题了,好,那么同学们。给它启动,待会来我们回到司马哥呢,再重重新测试一下,那我们的司马哥啊,在这块呢,刷新一下来吧,刚才的艾通过查询稍微有点小问题,改一下,执行一下,弟兄们OK了吧,现在12号记录成功查出来,那么13号记录同学们OK了吧,成功查出来好吧,啊,我也是在呃考代码的时候呢,出现点小瑕疵,好,那么同学们。
51:06
注意一下,那么来这个时候可以看得出写操作读取操作打通。
我来说两句