定义BridgeDesignPattern,将抽象部分与它的实现部分分离,使之任意删减,而无需受其它约束。Decoupleanabstractionfromitsimplementationsothatthetwocanvaryindependently,将抽象和实现解耦,让它们可以独立变化。结构型模式。结构•Abstraction:定义抽象类的接口,维护一个指向Implementor类型对象的指针,将Client的请求转发给它的Implementor.RefinedAbstraction扩充由Abstraction定义的接口.定义了基于基本操作的较高...
2022-06-02 16:34:02 5664浏览 0点赞 0回复 0收藏
告警系统API监控告警:根据不同告警规则,触发不同类型告警。告警支持多种通知渠道,包括:邮件、短信、微信、自动语音电话。通知紧急程度有多种类型,包括:SEVERE(严重)、URGENCY(紧急)、NORMAL(普通)、TRIVIAL(无关紧要)。不同的紧急程度对应不同的通知渠道。比如,SERVE(严重)级别的消息会通过“自动语音电话”告知责任人。当时关于发送告警信息,只给出粗略设计,现在来实现。最简单、最直接的实现publicenumNot...
2022-06-02 16:33:57 6019浏览 0点赞 0回复 0收藏
正文1Scenario场景电商大厂常见促销手段:优惠券拼团砍价老带新1.1优惠券的种类满减券直减券折扣券1.2优惠券系统的核心流程1.2.1发券发券的方式:同步发送or异步发送1.2.2领券谁能领?所有用户or指定的用户领取上限一个优惠券最多能领取多少张?领取方式用户主动领取or自动发放被动领取1.2.3用券作用范围商品、商户、类目计算方式是否互斥、是否达到门槛等1.3需求拆解1.3.1商家侧创建优惠券发送优惠券1.3.2用户侧领取优惠券下单...
2022-06-02 16:33:52 1.0w浏览 0点赞 0回复 0收藏
千w级用户数这就有【非活跃用户】的问题,假设注册用户一千万,根据二八原则,其中活跃用户占20%。若采用上面拆成两个表的情况,发一封“站内信”,得执行一千万个插入操作。可能剩下80%用户基本都不会再登录,其实只需对其中20%用户插入数据。信息表message:createtabletmessage(idintnullcomment'信息ID',sendidintnullcomment'发送者id',去除该字段recidintnullcomment'接受者id',messageidintnullcomment'外键,信息内容',...
2022-06-02 16:33:29 7507浏览 0点赞 1回复 0收藏
正文1何为“高内聚、低耦合”?“高内聚、低耦合”能有效地提高代码可读性、可维护性,缩小功能改动导致的代码改动范围。很多设计原则也都以实现代码“高内聚、低耦合”为目的,比如:单一职责原则面向接口,而非面向实现来编程“高内聚、低耦合”是个通用设计思想,可指导:不同粒度代码的设计与开发如系统、模块、类,甚至函数不同开发场景如微服务、框架、组件、类库等本文主要围绕以“类”作为该设计思想的应用对象。“高内...
2022-06-02 16:33:23 9724浏览 0点赞 0回复 0收藏
3.2有依赖关系的类之间,尽量只依赖必要的接口。Serialization类负责对象的序列化和反序列化:单看类的设计,没问题。但若放到特定应用场景,假设项目中的有些类只用到序列化操作,而另一些类只用到反序列化。那么,基于有依赖关系的类之间,尽量只依赖必要的接口:只用到序列化操作的那部分类不应依赖反序列化接口只用到反序列化操作的那部分类不应依赖序列化接口据此,应将Serialization类方案一:拆分为两个更小粒度的类只负...
2022-06-02 16:33:14 5090浏览 0点赞 0回复 0收藏
正文1方法为何要有参数?因为不同方法之间需要共享信息。但方法间共享信息的方式除了参数列表,还有全局变量。但全局变量总能带来意外之喜,所以,取消全局变量也是各大语言趋势。于是参数列表就成了唯一选择,于是,只要你想到有什么信息要传给一个方法,就会直接将其加入参数列表,导致参数列表越来越长!2长参数列表怎么了?参数列表一旦过长,你一个crudboy就很难完全掌控这些逻辑了呀!所以症结是数量多,解决关键也就是降...
2022-06-02 16:32:58 4601浏览 0点赞 0回复 0收藏
正文线上MySQL直接Select千万条的100G数据,服务器会裂开吗假设对某100G表t执行全表扫描,把扫描结果保存在客户端:该语句无任何判断条件,所以全表扫描,查到的每行都可直接放到结果集,然后返给客户端mysqlh$hostP$portu$userp$pwde"selectfromt">$targetfile1那这“结果集”存在哪?实际上MySQL读取、发送数据流程的如下:1.获取一行,写到netbuffer。该内存大小由参数netbufferlength定义,默认16k2.继续获取行,直到写满ne...
2022-06-02 16:32:51 5528浏览 0点赞 0回复 0收藏
正文我们这行都很幽默,总说编程就是CV,自黑写程序大部分都是靠复制粘贴。实际上,0前言只要使用Redis缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。如将商品库存缓存在Redis,若库存数量不对,则下单时就可能出错,这是难以接受的。1什么是缓存和DB的数据一致性?一致性包含如下情况:缓存有数据缓存的数据值需和DB相同缓存无数据DB是最新值不符合这...
2022-06-01 16:57:43 6564浏览 0点赞 0回复 0收藏
正文我们这行都很幽默,总说编程就是CV,自黑写程序大部分都是靠复制粘贴。实际上,很多高级或资深程序员写代码也就是CV:把其他项目里的一段代码复制过来,稍加改动,run一下没问题就能上线。但这种做法就是在给子孙后代挖坑!通常只要这些CV代码其中有一点逻辑要修改,就意味着所有CV的地方都要修改。因此很多人实际开发时,发现明明很简单的小需求,你却要改很多地方,需要花很长时间和测试解释如何才能测到,搞的PMO和领导...
2022-06-01 16:57:41 5323浏览 0点赞 0回复 0收藏
正文作为业内资深的crudboy,你一定经常见到N千行的controller类,这会让你迷惑这个类到底是干嘛的?类之所以发展成如此臃肿,主要因为:长函数太多类里面有特别多字段和函数量变引起质变,可能每个函数都很短小,但数量太多1程序的modularity你想过自己为何肯定不会把allcode写到一个文件?因为你明白这样的话:难以复用相同的功能模块理解复杂度太高在国内互联网所谓的敏捷开发环境下,没有人能熟悉所有代码细节。解决复杂的...
2022-06-01 16:56:26 4614浏览 0点赞 0回复 0收藏
正文Redis本身内容繁杂,要是上来就研究一细节点,如连接池、数据结构,虽可直接学到某个点的详尽源码内容,甚至尽快解决一些事故,但容易溺死在细节汪洋,无法整体把控Redis。最好是先建立起“架构”。想精通Redis,须能领略其总体架构,再深入具体技术点。构造Redis这种KVDB,首要考虑:数据模型能存什么数据?如用户信息(用户ID、name、age、sex等),通常用MySQL,在一个用户ID对应一个用户信息集合的场景下,就是KVDB的数...
2022-06-01 16:56:14 5765浏览 0点赞 0回复 0收藏
只听到P8大佬不急不慢问道:谈谈对JDK并发工具的认识?我开始仔细梳理多年的并发八股文经验,道:线程池、Future、CompletableFuture和CompletionService这些并发工具都是帮助SE站在任务角度解决并发问题,而非纠结于线程之间协作的细节,比如线程之间如何实现等待、通知。简单并行任务线程池+Future组合拳任务间有聚合关系AND、OR聚合,CompletableFuture一招鲜批量的并行任务CompletionService一把梭并发编程可分为三个层面问...
2022-06-01 16:56:07 5708浏览 0点赞 0回复 0收藏