- 博客(39)
- 收藏
- 关注
原创 不常见的正则表达式规则
最近业务有个需求,要用正则表达式。具体做法是:模板内容:template co{nten}t de{mo} one要求:匹配出所有{}中的内容。先说结论表达式:(?<=\{)(.+?)(?=\})其中有几个比较有意思的点:1、(?<=exp),表示匹配exp开头的内容2、(?=exp)表示匹配exp结尾的内容3、.+?表示非贪心匹配。其中第3点较常规,是贪心与非贪心的区别。正则表达式默认贪心。举例如果不加“?”,以上模板可能匹配出"nten}t de{mo"内容,加上"?"后可正
2022-04-14 11:46:59 148
原创 refreshToken的作用讨论及几点疑惑
在网上及oauth官方网文档转了一圈,看到如下理由:refreshToken的作用:1、更加安全。直接接给access_token较长时间的有效期,有泄露风险,所以引用refresh_token,有效期长,但权限小。2、类似session的检验方式,会在用户每次访问的时候刷新access_token的过期时间。此方案会有较大性能问题,有高频率无用刷新,尤其在请求频繁的时候。此时refresh_token的作用相当于降低了access_token的刷新频率。3、在利用第三方登录,如微信登录、googl
2022-01-28 17:37:58 10547 5
原创 分布式事务概述
定义:在分布式系统上,保障不同服务的事务的原子性。即同时成功或失败解决方案:1、两阶段提交(Two-phase Commit,2PC)。引入“第三方”,协调各事务参与者进行如下动作:首先大家分别走99步,成功了?ok,那大家再一起走最后一步。根据经验最后一步都能成功。2、补偿性事务(try,cofirm,commit, TCC)事务有三个参与者,ABC三个服务。A执行完B执行,B执行完C执行。如果C执行失败,则进行重试和补偿。如果重试后依旧失败,则调用B、A的回滚方法统一回滚3、本地消息
2022-01-07 11:54:42 390
原创 数据库设计坏味道
数据库设计坏味道:之前讨论了代码中的坏味道,这个很多人讲过,也比较常见。本文讨论的是数据库设计中的坏味道。很多人会忽略数据库设计中的坏味道,而实际上我个人经验而言,不好的数据库结构,会造成灾难性的后果,比不合理的代码的危害程度高很多。因为在业务运行以后,数据库的修改成本非常高,会出现修修补补的情况,以至于屎山越堆越高。常见的数据库坏味道:大宽表开玩笑讲,如果可以,我能用一张表搞定一个业务,当然是不行的。但有时候也不需要完全按三范式拆分得特别零散,那怎样判断呢?我个人的经验是:如果模型A与模型B是
2021-09-23 11:35:06 180
原创 代码中的坏味道
坏味道这个词,第一次听到还是华为的同事,一听到就能直觉感受,来自于英文中的badsmell,想了一下中文确实没什么确切的词与之对应。就叫坏味道吧。最近面试几个候选人,统一口径为了更好的发展,为了带团队考虑跳槽。可以理解。但当你带领一个团队的时候,不论是三五人的小组,还是十几人几十人的部门,质量管控、代码reivew都是必不可少的环节,否则管控就无从谈起,更不要讲带领团队进行整体的技术能力提升。无法识别成员项目中的问题,就不存在review.**本文旨在讨论,常见的坏味道都哪些?**什么是坏味道?
2021-09-23 10:54:22 883
原创 springboot网站首页
最近有个朋友,咨询我一个问题。希望在springboot中可以实现域名访问首页。不借助nginx,使用springboot自带tomcat。我当然不能放弃这个显摆(装X)的机会。经搜索现有网上流行的方式有两种:1、在resource目录下,放index.html,然后自建controller,实现path为"/"的请求响应,并return “forward:index.html”@Controller@RequestMapping("/")public class IndexController
2021-07-15 10:35:36 724
原创 linux centos 定时任务
查看是否安装crond:service crond status如果没安装,请自行安装。输入:crontab -e 作用:编辑任务输入:i 作用:开始编辑任务输入:*/10 * * * * /home/test.sh 作用:每个小时的整10分钟执行/home/test.sh输入:“:wq+回车” (请注意冒号) 作用:保存编辑任务删除任务,即是删除相应的行。vim编辑器的使用方法以及crond的安装可自行查询其他博文。...
2021-06-13 16:40:22 234 1
原创 记一次jvm内存优化
内存优化是老话题了。此次优化历时2周,克服几个没遇到过的问题,也算最后得到了解决。现复原一下过程:1、运维发现服务断了,经查看java进程被kill2、查询linux日志(whereis message),默认为message文件,发现java进程被kill,日志内容为:out of memory: Kill process 9136 (mysqld) score 409 or sacrifice child (此条日志为mysql被kill ,生产实际为java)3、网上方案很多,其中一条为降低进程
2021-06-10 17:51:54 274 3
原创 metaspace概述(与compressedClassPointer的关系)
什么是metaspace:在java8中,metaspace是方法区的实现。java7中对应的实现是永久代。方法区是jvm规范,即所有jvm的具体实现都需要实现相应的分区什么是compressedClassPointer?系统从32位增加到64位,jvm技术中用于定位class 和object的node也增加到了64位。为了增加内存利用率,objcet中指向Klass的指针使用32位,即压缩技术(细节请自行百度),metaspace的大小:metaspace大小限制:在启动参数中,M
2021-06-08 14:18:38 538
原创 Communications link failure mysql在应用启动后偶发连接断开修复
最近应用在启动一段时间一后,就会偶发Communications link failure错误,偶尔也会报connect refused。在网上找了一圈,找到比较靠谱的说法:mysql的server端,有自动断连机制,如果一个连接超过time_out的值,就会断开。而我的应用,使用的是druid线程池,mysql断开时并没有通知线程池连接已断,此时如果用户要查询数据,而正好拿到线程池中已经被mysql单方面断开的连接,就会报上面的错误。网上已有的解决方案:1、修改timeout值,治标不治本2、配
2021-06-01 15:28:18 790
原创 云原生 阿里 serverless helloworld
1、创建maven工程(简单工程)2、引入阿里依赖 <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.4.0</version> </dependency>3、新建一个helloworld类,并实
2021-04-19 15:15:20 118
原创 多线程编程笔记2--线程安全的解药:锁
前一篇提到,多线程会有线程安全问题。而解决这个问题的方案,就是本文要讲的:锁线程安全中最常见的aba问题,其本质原因在于不同的线程对同一个资源有争抢行为,那么自然而然,解决这个问题的方式,就是限制资源的访问权限,对于更新操作,同一时间只允许一个线程访问,就解决了这个问题。锁的本质:通过一定的方式,限制某些资源、代码的访问权限,从而实现程序运行结果的一致性、可预测性具体:volatile:只能用于变量,内存可见,通过CPU的lock指令,强制变量不在线程缓存中存储,并在写入值时强制无效多核c
2021-03-30 11:51:36 142
原创 多线程编程笔记1--线程安全的本质
何为线程安全?我们对一个逻辑进行操作N次,无论串行操作还是并行操作,得到的结果都一样,那么我们称之为线程安全的逻辑。此处可以类比幂等:一个操作进行1次或者重复执行N次,如果得到的结果相同,此操作就是幂等的,反之则不是幂等操作。为什么会线程不安全?牵涉到jvm的内存分配模型。如以下代码: public int addOne(int i){ return i+1; }我们定义一个变量int a,然后多线程调用a,并用addOne方法对a进行增加操作100次。此时有一个关键问题:*
2021-03-24 13:55:39 149 2
原创 DDD初理解
DDD,领域驱动,强调领域对象的设计,更加符合面向对象的理念和标准。相对而言,传统开发方式可以称为数据驱动,强调表结构设计合理性。举粟子:1、这是常见的设计,也称贫血模型(充血模型对应,读者可以自行搜索区别和定义)public class Dog { private int age; private String color; private String status; public int getAge() { return age; }
2021-03-18 11:48:04 256
原创 如何优雅地进行配置参数读取(配置文件参数统一管理调用)
在开发的时候,我们会根据不同的环境,配置不同的对数。这些参数通常存在于application-param.yml中(其它文件也适用)。要求:如我们建一个类Params来统一存储配置参数,希望能以Params.paraA形式来调用相关参数难点:静态成员不能使用注解注入(原因为静态成员加载顺序问题,可以复习下)解决方案:在Params类中声明一个方法,这个方法在应用启动完成后自动执行,然后在方法中对参数初始值进行赋值。...
2021-03-02 09:35:22 500
原创 Criteria 多个or怎么处理?
看源码可知:example、oredCritera、criteria的关系如果我们要从mysql中查询id为1000或2000的用户。可以用以下写法:UserExample userExample=new UserExample();UserExample userExampleTemp=new UserExample();UserExample.Criteria criteriaFirst = userExample.createCriteria().andUserIdEquals(1000);
2021-02-26 09:23:07 2958
原创 设计模式之二十一--访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作解释:定义太抽象了,形象地解释一下。已经有一类元素,比如动物园中的动物。外界(包括饲养员等各角色)会对他们有一些操作:抚摸,访问者模式中会定义一个访问者,把抚摸这个操作封装起来,作用就是,在不改变动物数据结构的前提下,定义新的操作或者同一操作的新的实现。业务场景:上篇文章我们提到了,会有不同的饲养员,按同样的顺序执行投喂作业。那么同样的,不同的动物,在接受投喂后,会有不同的反应。张三喂的时候
2021-02-03 14:06:19 85
原创 设计模式:总章
从业时间也不短了。当前市场普遍重视算法,尤其是面试时。但根据实际经验,设计模式对一个普通coder的影响,要远远大于算法。在我心目中,写好递归的coder,在算法方面就算合格。而能学好设计模式并灵活运用的,就是优秀。在软件开发中,普遍重视的拓展性、可维护性、可读性,都与设计模式强相关。包括大家都重视的性能问题。一个逻辑清晰的算法,哪怕不太内存友好,cpu友好,也会得到一个不算差的性能。再往上要求,就是真正高级coder的事了。每写一行代码,要考虑内存分配与回收,要考虑物理存取,cpu计算,要做到对内存
2021-02-03 11:17:06 73
原创 设计模式之二十--模板方法模式
定义:一个抽象类公开定义了执行它的方法的方式/模板业务场景:动物园又来了。已知动物园饲养员在喂动物,同时动物园要求,喂之前必须进行打卡、预拌。喂之后要检查、清理。完整流程为:打卡–>预拌–>投喂–>检查–>清理模板方法解决了这个问题。由一个抽象类编排好顺序。具体的实现类有所区别。饲养员张三,喜欢直接喂。李四,喜欢用盆喂。王五就厉害了,喂之前还要跟小动物聊聊天。所以我们就定义一个抽象类:饲养员,有三个不同的实现:张三,李四,王五。其中他们分别实现了打卡、预拌等方法。最后调
2021-02-03 09:35:16 95
原创 设计模式之十九--策略模式
定义:策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换业务场景:饲养员喂动物,可以先用不同的策略,比如用勺子喂(幼仔),用盆喂,扔地上喂等等。这些不同的方式就可以抽象为不同的喂养方法,就是策略。策略模式中各角色的作用,都与上一篇状态模式非常类似,所以重点讲两者区别。当我们对业务进行抽象的时候,策略与状态的定义区别是非常明显的。比如上一篇中提到了饲养员的不同状态,如果形容为饲养员的不同策略,就非常生硬而不合适。类结构和作用都是相近的。不比纠结以上...
2021-02-02 11:47:04 111
原创 设计模式之十八--状态模式
定义:对象在改变状态时,会改变形为。就像改变了对象一样。业务场景:动物园来了,有个饲养员,饲养员有几个状态:1、上班,正常喂养2、下班,告知下班了,不喂3、睡觉,会骂人作为园长,我调用饲养员的“投喂”方法,饲养员会根据自己状态的不同,而做出不同的反馈。这就是状态模式怎样达成以上效果?定义一个状态接口,分别实现三个状态实现类。饲养员持有一个状态接口(多肽,根据不同状态获取不同注入)。“投喂”方法,实际上调用的是状态实现类的方法。而不同的状态实现类,具体的实现是不一样的。以上。注:如果饲养员
2021-02-02 11:26:54 62
原创 设计模式之十七--观察者模式
定义:对象间有一对多的关系,当其中被观察对象状态改变,观察者都得到通知并自动更新这个模式也比较简单,java已经实现了相应的定义。abserver abservable两个接口。实现相应接口,调用observable对象的:notifyObservers方法即可。看了下原码,有大量syhronized修饰,方法和this皆有,趁机回想一下syhronized用法:方法块,方法,静态方法。其中,修饰(this)与修饰普通方法作用相同,同为对象锁。一个对象只有一把锁,如果持有10个修饰的方法,10个线
2021-02-02 09:53:04 67
原创 设计模式之十六--备忘录模式
定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。此模式有三个角色(类):发起者,备忘录,管理者发起者调用管理者保存自己的状态到备忘录,并且交给管理者管理。在需要的时候通过管理者恢复保存的状态,达到备忘录目的感觉 这个模式没有什么特别之处,一下子也没想到什么场景会用到。通常在业务中,都会把类似状态存入缓存,然后恢复,并不会设计类似的角色。而数据库就更简单,就是用事务,失败回滚。注:备忘录也有好几种写法。个人不是太感冒。还是更
2021-02-01 11:30:54 57
原创 设计模式之十五--中介者模式
先贴一个其他人比较好的讲解详解中介者模式定义用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。同样地,中介者模式为我们提供了一个方法,通过合理的类结构设计,可以解耦互相依赖的多个类或对象。中介者模式是行为型设计模式,解决的场景,是对象之间的通信行为。如下图:如上图。改造后收网状改为星状。关系更加清晰,完成解耦。再回顾设计原则,开闭,单职,迪米特以上...
2021-01-29 11:17:34 74
原创 设计模式之十四--迭代器模式
定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节场景:有一个对象集合,比如动物集合。迭代器模式使以下功能成为可能:1、每个动物都有一个方法,来获取这个动物所包含的,或者是所关联的所有动物2、通过这个动物可以直接获取迭代器3、通过迭代器可以对其中的动物做增加删除操作今日理解:通常我们所讲的设计模式,更多地是提供了一个思路或者说是方法,来解决某一个业务场景或者系统逻辑场景,通过这种方法或者思路,最后的系统会符合设计六原则:开闭,单一职则,里氏替换,依赖倒置,迪米特,接口隔
2021-01-28 14:20:48 74
原创 设计模式之十三--命令模式
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操思考:说实话我有点懵,没太懂这个模式在解决什么问题。好像是要解耦?就是请求者跟执行者的解耦。网上文章中,用得最多的就是顾客点餐,小二传餐,厨师做餐的例子。我想了一下,如果要凭空实现这个功能,按目前的趋势,可能就是一个做菜的接口。顾客发起请求,厨师接到就生产?但命令模式强调了有排序、记录、撤消等操作。那么这就是与平时接口实现 的区别?假如不是接口实现,所有角色和动作在同一个系统,那很
2021-01-28 13:56:36 65
原创 设计模式之十二--责任链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系, 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止业务场景:多个不同对象可以处理同一个请求,具体由哪一个对象处理,由业务规则动态确定。例如常见的流程审批、框架中的请示过滤等等。动物园来了:喂动物,对食物肯定还是有要求的。比如要先检查是不是三无产品,再看看有没有营养,最后检测质量是否合格等等。这几个流程,可能由于动物、食物的不同而不同。此时就需要抽象检测动作,灵活组装,结合工厂,组成不同的责任链来完成
2021-01-28 11:56:37 86
原创 设计模式之十一--代理模式(Proxy)
定义:为其他对象提供一种代理以控制对这个对象的访问。理解:以上定义稍显狭隘,根据这两天的理解,代理不仅仅是为了控制,也可能是为了增强等。先贴一个不错的博文代理模式(Proxy)代理是个大类,分为静态代理、动态代理、远程代理、虚拟代理等。其中仅静态代理而言,与装饰器模式非常类似。要注意区别。此处引用一下事实上,在业务以及框架中,我们最常见到和用到的,是动态代理。与静态代理相比,动态代理具有很多优点。顾名思义,动态代理是动态生成的,所以不用事先针对每个对象编写相应的代理类,可以利用统一方法生成
2021-01-27 11:19:36 3962
原创 设计模式之十--享元模式
定义:共享单元。通过资源共享优化应用的性能。业务场景:动物园又来了。为了适应不同的游客需求,园长决定建造普通、高级两种虎舍。其中高级虎舍的主要改进为使用了钢化玻璃墙,有更好的观看角度。但是两种虎舍中,都是相同的老虎。于是管理园想了一个办法:虎舍正常建造,分别是砖墙的和玻璃墙的。但是只使用一只老虎。如果游客要看普通,就把老虎放进普通虎舍。相应地,把老虎放进玻璃墙虎舍,就是高级版。补充:结构型设计模式,重点强调对象之间的关系,称为结构。A是B的代理,C是D的门面,E是F的装饰器等等。在这个模式中,A是
2021-01-25 10:58:44 58
原创 设计模式之九--门面模式(外观模式)
定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用目标:接口隔离和迪米特法则业务场景举例:动物园很大,最初有一个管理园,称为园长。园长有很多事情,其中一个是给动物打针,那园长就要逐一给所有动物打针。后来园长觉得这样不行,所以给动物园划分了不同的区域,每个区域分配一个管理员(门面),园长不再需要逐一给动物打针,只需要通知相应的管理园即可迪米特法则,原话是一个类只与自己的朋友通信和调用。与此同时,还有一个隐藏原则:朋友越少越好
2021-01-25 10:19:37 83
原创 设计模式之八--装饰器模式
定义:许向一个先有的对象增添新的功能,同时又不改变其解构业务场景:相像一下,动物园里,我有一个方法,是打疫苗,管理员直接调用注射器的这个方法就能给所有动物打针。现在来了一个新动物:大熊猫。众所周知比较珍贵,所以打针之前要先做体检。有以下几个方案可以很容易想到:1、直接修改注射器方法,增加判断,如果目标是大熊猫,就做体检(直接写)2、如第1条,但是实现优雅一点,写个拦截器,aop,进行判断,如果是大熊猫,就体检。(aop)3、购买新的注射器,这个注射器用来给所有需要注射前需要体检的动物使用(继承)
2021-01-25 10:02:27 81
原创 设计模式之七--组合模式
定义:组合(Composite)模式是一种对象的行为模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。理解: 组合模式,关注的是部分与整体的关系,关心的是一类对象的共同方法或属性,目标是使代码符合OC原则,易拓展,易维护。方法是通过对 对象进行统一的抽象,从而使高层代码可以忽略结构,专注业务。通常的表现形式为树形结构。以动物园为例(本系列跟动物园杠上了),为了方便进行不同单位、不同分类或者不同部分动物的体重(业务目标),从..
2021-01-25 09:39:02 84
原创 设计模式之六--桥接模式
惯例,先贴一个他人的分享,我觉得说得很好清风baron–桥接模式和适配器模式的区别然后,我们再说说桥接模式。依然用动物园作为类比:众所周知,德云社有一条狗,老郭的,老郭吧,会让徒弟喂狗。徒弟有很多个:孙越和小岳岳。喂的方式也有好几种:直接喂,嘴对嘴喂,用手喂,用盆喂。这时候,园长发话了(老郭?):小岳岳,去嘴对嘴喂一下,让他们见见世面。普通实现:if(徒弟小岳岳)饲养员小岳岳if(方式==嘴对嘴)饲养员.嘴对嘴(也就是小岳岳嘴对嘴喂了一次狗)桥接实现:首先定义一个接口,是饲养员接口,有
2021-01-22 10:19:55 77
原创 设计模式之五--适配器模式
目的:解决不兼容问题好处:双方都不会改变原有方式与代码开发场景:现有一系列的类,有统一的方法:excute。现在准备引入另一个现成的类,这个类有类似的方法,但名字叫:submit。问题出现了,如果直接用,有诸多不便,比如可读性差,不能统一调用等等。那么现在就有三个方案:1、把引入类修改一下。改成excute,但是之前引用了这个类的代码,都要跟着修改,代价巨大。2、把我们的excute改成sumit,也行。但是问题跟第一条类似。3、做一个适配器,这个适配器具有统一方法:excute,excute内部
2021-01-21 11:14:40 110 2
原创 设计模式之四--单例模式
茴字有很多种写法,推荐用枚举。不多讲。讲一下各种写法的区别以及牵涉到的理论知识点。Q:为什么要保证线程安全?A:如果线程不安全,将会失去单例的意义,也就是说会产生不止一个实例。同时也可能引起程序报错等其他错误。知识点:线程安全的本质。简单讲线程不安全,是因为有些资源是线程共用的(比如进程数据、代码、堆、栈)。不同的线程操作同一个对象,当然就不安全了。Q:怎样保证线程安全?A:保证实例化(比如构造方法)只执行一次,那么就只会产生一个实例,那你怎么拿 都是同一个。Q:怎样保证只实例化一次呢?A:炫
2021-01-20 11:42:31 73
原创 设计模式之三--原型模式
原型模式比较简单,就是克隆。定义:用原型实例制定创建对象的种类,并通过拷贝这些原型,创建新的对象。原型模式归属创建型模式大类,致力于使对象的创建更加简单规范。由于java已经实现了clone方法,不再多讲。但是这里牵涉一个概念:深拷贝和浅拷贝。用下图表示浅拷贝是这样。拷贝后的动物园,也可以参观,但是其实看到的是同一只虎。如果你对拷贝后的对象操作,比如把美洲虎换成孟加拉虎,那么原动物园也会被修改深拷贝是这样。把猫和虎也拷贝了一份,也就是属性。参观的时候,你看到的将是不同的动物(长得一样)。同时,修
2021-01-20 11:13:48 78
原创 设计模式之二--建造者模式
上一篇文章中,三种工厂模式,创建的都是单一的对象。随着业务的发展,需求又多了,我们要建造一个动物园,分两种:普通动物园,有二哈和美短 抽风动物园,有泰迪和布偶这时候,用工厂是不行的,工厂生产的是二哈,是美短,是单个的。现在的需求是创建组合。那么,我把这个组合视为一个全新的对象,然后通过简单工厂,传参"普通”,我就创建一个普通动物园,抽风动物园类似。能这样操作吗?笔者认为是可以的。这样设计需要一个动物园抽象类,两个动物园的实现类,代码结构有有所不同。使用建造者模式,我们只需..
2021-01-19 11:34:06 139
原创 设计模式之一--工厂模式(工厂方法,简单工厂,抽象工厂)
各种文章网上特别多,下面贴一个我觉得不错的,供大家学习。我就不重复了,没啥意思。https://blog.csdn.net/lingfengtengfei/article/details/12374469?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu
2021-01-18 11:33:49 151
转载 linux centos7安装rsync+sersync实现文件实时自动同步功能
原文地址:https://blog.csdn.net/u011477914/article/details/88555261?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-6.control
2020-12-31 10:02:44 308
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人