自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 咸鱼程序员之-java设计模式第八篇-适配器模式

适配器模式(Adapter Pattern):又叫包装模式或者是变压器模式,它将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。其实设计模式最早是应用在建筑领域的 ,java引用了这一个概念,简单点说,他的思路就是将一个两个原本步兼容的类或者接口组合成一个可以兼容的接口。。。。那...

2020-04-12 17:45:25 186

原创 咸鱼程序员之-java设计模式第七篇-门面模式

facade-门面模式(外观模式)应该是我平时开发中用到的最多的模式了 。。。为了给大家一个简单的理解,我先阐述一个例子假设现在有这么五个人 ,A是木工 ,B是水泥工 C是建筑师 D是包工头 E是房东 ABC 都有自己的专长,他们只在自己的领域 做事 E现在需要建房子 ,那么正常情况他可能找ABC来做事但是这很麻烦 我要自己找这些人,还要分别和这些人谈价格,还要给这些...

2020-04-12 15:37:24 192

原创 咸鱼程序员之-java设计模式第六篇-享元模式

享元-共享元素 ,这种设计模式其实在我们平时编码中很常见 ,其核心思想就是没对象就new 对象,有对象就从已有的缓存或者其他地方取,最常见的就是java当中的池技术,比如常量池、数据库连接池、缓冲池等 这些都是典型的不用频繁的New 对象,而是共享一个对象 那么这种貌似和单例是不是有点像呢,大家是不是有点疑惑。。其实小编觉得单例和享元 的应用场景不同 ,模型类似,但不是一个概念 。。。下面小...

2020-04-12 14:59:04 164

原创 咸鱼程序员之-java设计模式第五篇-原型模式

大家都知道java设计模式有一种原型模式prototype 那么我们平时所说的原型模式怎么实现呢,或者说我们在代码中应该怎么去写呢。咸鱼小哥这篇里用java的clone实现方式给大家分享一下我的理解。我们都知道java lang 有一个规范接口叫做cloneable。它上面的注释提醒我们要使用这个接口,你应该去override object.clone方法。大部分工程师平时需要复制一个对象...

2020-04-11 18:38:07 189

原创 咸鱼程序员之-Java设计模式第四篇-建造者模式

广大的java攻城狮们每天都在写各种各样的对象,通常在给对象赋值时采用两种方式:1.set 方法 2.构造方法 其实大家都知道这种写法有些low ,随着大家水平的提高,需要写一些比较高级的代码。今天小编结合建造者模式给大家说下我对这个设计模式的理解。假设我现在有一个产品有三个属性:part1 part2 part3 .现在我要对他进行赋值 ,小编写了三种方式做了比对:1.普通set...

2020-04-11 16:19:37 189

原创 咸鱼engineer之java设计模式第三篇-抽象工厂模式

抽象工厂模式 大家其实在平时work的时候有用到,我个人的理解就是将一些抽象方法再进行一层抽象 。下面以一个数据库连接为例。。。。。。。其实就是之前小编有提到工厂方法模式 ,工厂方法在这里相当于其中一个抽象,比如:他可能只是建立连接 ,这就是一个典型的工厂方法,如果在建立连接+发送命令基础上进行一层抽象,那么它就是一个 数据库产品抽象,这就是典型的抽象工厂所以...

2020-04-05 15:05:40 147

原创 咸鱼engineer之-java设计模式第二篇-工厂方法模式

平时大家在工作中多多少少有写过一些工厂方法,但是如果不了解设计模式的话可能不会知道具体有什么区别,下面本菜鸟给大家分享下我的理解。java的工厂方法模式其实就将我们需要变的method给抽象出来 ,让实现可以得到延迟,体现Java的多态性ok,直接上代码ok 这种写法是比较简单的,但是这种写法有一些问题。第一他不高级,第二它不符合开闭原则和单一职责原则当我们需要穿件多个Pro...

2020-04-05 14:21:08 155

原创 咸鱼engineer之-java设计模式第一篇-单例模式4种写法

单例模式通常有四种写法:饿汉写法懒汉写法内部类写法枚举写法那么这些写法具体有什么区别呢,给大家分享下我自己的理解1.饿汉模式:ok ,为什么恶汉模式这样写呢,其实他是通过jvm类加载机制来保证在类加载的时候只加载一次这个实例 的 ,不需要程序员去保证是否单例。这里 的构造方法必须是私有的,但是这种单例模式也有可能通过反射去调用构造方法,所以如果要保证绝对的单例,还...

2020-04-04 21:15:24 1476

原创 分布式事务相关

1、两阶段提交方案-XA常见的场景:1个系统操作多个数据库 基于spring+JTA就可以搞定但是不合法,一个系统跨多个库是不合法的。。。2、TCC方案-三阶段(写大量跟业务相关的代码 ,跟钱打交道的一般用,因为强一致),但是代码比较难维护比如订单先插入一条流水,先查询库存服务,然后再调用库存扣减服务,再查询订单服务,如果符合库存,就认为成功,如果不符合,就调用库存回滚操作。3、本地消息表(依赖与本地mysql表)(1)A系统在自己本地操作业务同时,插入.

2021-11-19 11:31:10 870

原创 设计模式相关

DDD领域驱动:(理论上就是把OOP应用于业务模型 最近再看一本书:Eric Evans <<领域驱动设计>>)DDD第一原则:将数据和操作结合DDD第二原则:界限上下文 这是将“单一职责”应用于我们的领域模型实现:1、使用通用语言:类、方法、字段的命名 要符合业务,使用业务语言命名,之后再客户或者团队交流更加流畅2、理解业务:例如做一个理财系统,要亲自去和卖理财产品的人聊聊或者买个理财产品,这样数据库中那些对你毫无意义的字段才变得有血有肉。充血.

2021-11-19 11:30:33 238

原创 限流算法相关

1、计数器算法在一定时间内,对处理的请求数进行计数,每次到达时间临界点则计数器清零。在一定时间间隔内,若计数器数字超限,则进行限流缺点:该算法的问题是,在两端临界点附加可能出现两倍的流速。2、滑动窗口算法基于计数器算法,把时间间隔分片。例如服务限流每秒处理10000个请求,把1秒分为10个窗口。每100毫秒移动一次,内存中保留每次的请求次数。每次移动判断一下总次数是否超出10000限制。当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。滑动窗口算法

2021-11-19 11:29:16 262

原创 分布式id生成相关

1 、利用全局的一张表 但是并发很大就有瓶颈2、利用uuid 不适合做主键 太长3、利用 业务编号+时间戳 但是高并发也会重复4、snowflake算法 twitter开源的 (64位的long型变量来保存)第一段 1bit:不用,因为我们生成的都是正数 所以统一是0第二段:41bit:标识的是时间戳 单位是毫秒 41bit可以标识的数字多达2的41次方-1 也就是69年的时间第三段:10bit 记录机器id 标识服务最多可以部署在2的10次方台机器上 也就是1024台...

2021-11-19 11:28:27 658

原创 HashMap相关

DK8中的HashMap与JDK7的HashMap有什么不一样?JDK8中新增了红黑树,JDK8是通过数组+链表+红黑树来实现的 JDK7中链表的插入是用的头插法,而JDK8中则改为了尾插法(1.7头插法实际上是插入效率更高,但是他会形成圆环,,增加了碰撞的几率,所以8后改成了尾插法,虽然插入效率上有所降低,但是可以忽略不记,而且8后也采取了红黑树,插入和查询效率有所提高,,) JDK8中数组扩容的条件也发了变化,只会判断是否当前元素个数是否查过了阈值,而不再判断当前put进来的元素对应的数组下

2021-11-19 11:27:59 162

原创 Dubbo相关

看过dubbo源码?1、服务调用过程最外层是Mock逻辑,调用前,调用后进行Mock从服务目录中,根据当前调用的方法和路由链,筛选出部分服务Invoker(DubboInvoker) 对服务Invoker进行负载均衡,选出一个服务Invoker 执行Filter链 AsyncToSyncInvoker完成异步转同步,因为DubboInvoker的执行是异步非阻塞的,所以如果是同步调用,则会在此处阻塞,知道拿到响应结果 DubboInvoker开始异步非阻塞的调用HeaderExcha

2021-11-19 11:26:33 1360

原创 Elastic Search相关

es 怎么解决查询慢的问题?1、只存关键数据,其他数据存入hbase,查询的时候根据id 查询一批数据,然后根据id的范围去hbase中查询,效率会相当高。2、因为es有一个file system cache ,第一次查询数据时,其实是去磁盘读,然后刷进缓存的,所以缓存要存热点数据,内存容量有限,,我们可以先预热一下,比如后台有一个刷到缓存的数据进程,,这样每次查询都会去缓存中查询。。倒排索引?字典表(内存中 hash表形式存储)倒排列表 磁盘中以跳表的形式存储(链表+索引的

2021-11-19 11:24:57 1463

原创 分布式锁相关

Redis锁实现:加锁操作:set key value nx px 3000 如果成功上锁成功,如果不成功就每间隔1s 尝试去拿这把锁释放锁操作: lua脚本:比较当前value是否与redis中value一致,一致才删除。。存在的问题:1、redis宕机了,,或者主从切换数据丢了,然后锁就失效了。2、一旦一个线程死了,如果没有设置合理的过期时间,那么就释放不了这把锁了。Red-Lock 算法:这个场景假设有一个redis cluster 有5个r...

2021-11-19 11:23:46 652

原创 大数据相关

一.hadoop是什么Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。二 .hadoop能干什么hadoop擅长日志分析,facebook就用Hive来进行日志分析,2009年时facebook就有非编程人员的30%的人使用HiveQL进行数据分析;淘宝搜索中的自

2021-11-19 11:23:09 115

原创 mq相关知识

为什么使用mq?解耦、异步、消峰mq怎么保证高可用?比如kafaka高可用:一个topic有多个partition分布在不同的机器上,类似于分片,每个partition对应有至少两个副本纵向部署在不同机器上,分布主从。mq 选型问题?activemq:万级请求,很成熟,但社区不活跃,不是分布式rabbitmq:延时很低,管理界面强大,社区活跃,不是分布式rocketmq:单机吞吐量十万级,阿里的可靠,java的源码kafaka:单机十万级,分布

2021-11-19 11:19:51 115

原创 网络知识点

为什么会发生TCP粘包、拆包?发生TCP粘包、拆包主要是由于下面一些原因:1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。2.应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。3.进行MSS(最大报文长度)大小的TCP分段,当TCP报文长度-TCP头部长度>MSS的时候将发生拆包。4.接收方法不及时读取套接字缓冲区数据,这将发生粘包。粘包、拆包解决办法?TCP本身是面向流的,作为网络服务器,如何

2021-11-18 18:16:58 255

原创 多线程和锁

ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么?(1)每个Thread维护着一个ThreadLocalMap的引用(2)ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储(3)ThreadLocal创建的副本是存储在自己的threadLocals中的,也就是自己的ThreadLocalMap。(4)ThreadLocalMap的键值为ThreadLocal对象,而且可以有多个threadLocal变量,因此保存在map中(5..

2021-11-18 18:15:31 312

原创 Spring知识点

描述一下Spring中Bean的生命周期解析类得到BeanDefinition 如果有多个构造方法,则要推断构造方法 确定好构造方法后,进行实例化得到一个对象 对对象中的加了@Autowired注解的属性进行属性填充 回调Aware方法,比如BeanNameAware,BeanFactoryAware 调用BeanPostProcessor的初始化前的方法 调用初始化方法 调用BeanPostProcessor的初始化后的方法,在这里会进行AOP 如果当前创建的bean是单例的则会把be

2021-11-18 18:14:34 167

原创 Redis知识点梳理

脑裂问题(由于网络原因选举出两个master,此时client还在写一个老的master)解决方案:通过配置 min-slave-to-write 和 min-slave-max-lag 要求至少有一个slave复制和同步数据延迟不能超过10秒,就是说一旦所有slave复制数据都超过了10秒,整个时候master就不再接受请求了(client 端可以通过降级或者将消息写到kafaka 然后每10秒拉去消息尝试重新写到master)主从复制的完整流程:1 slave .

2021-11-18 18:13:55 369

原创 数据结构和算法

AVL树:平衡二叉树,一般是用平衡因子差值决定并通过旋转来实现,左右子树树高差不超过1,那么和红黑树比较它是严格的平衡二叉树,平衡条件非常严格(树高差只有1),只要插入或删除不满足上面的条件就要通过旋转来保持平衡。由于旋转是非常耗费时间的。我们可以推出AVL树适合用于插入删除次数比较少,但查找多的情况。红黑树:平衡二叉树,通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其他路径长2倍,因而是近似平衡的。所以相对于严格要求平衡的AVL树来说,它的旋转保持平衡次数较少.

2021-11-18 18:13:03 350

原创 JVM知识点

JVM 分为三个模块:1、类加载子系统2、运行时数据区3、执行引擎类加载过程:1 、加载(将磁盘class文件加载到内存)2、连接 2.1、验证 验证字节码的正确性 2.2、准备 给类的静态变量分配内存 并赋值默认值 2.3、解析 类装载器装载类所引用的其他类3、初始化 为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,此处赋予的才是程...

2021-11-18 18:12:15 329

原创 DDD知识点

面临的问题:代码可读性很差,每个服务之间调用繁杂,流程混乱 修改优化某服务业务代码时,促使无关的服务的测试用例失败,同时单个功能开发者很难快速就明确问题关键所在。 测试用例特别难编写,需要 mock 大量数据来拉起整块服务DDD解决的问题: 1、DDD 帮助解决微服务拆分困境: DDD 对业务分析时,首先会使用「聚合」把关联性强的业务概念划分在一个边界下,并限定「聚合」和「聚合」之间只能通过「聚合根」来访问,这是第一层边界。其次,在「聚合」基础之上根据「业务相关性」、「业

2021-11-18 18:11:19 507

原创 Mysql

mysql acid特性详细分析:https://www.cnblogs.com/kismetv/p/10331633.html你们先上线上怎么分库分表的?库:取模表:整除后在取模32*32 =1024张表 4台服务器 每台8个库线上预估能存50个亿的数据 目前存了20亿。。如果想提高写并发 可以扩容机器,,将每台机器只放一个库即可。。。mysql主从复制原理:1、主库和从库各有一个io线程来通信做主从同步2、主库io线程从..

2021-11-18 18:07:44 141

原创 如何设计一个秒杀系统

秒杀系统的核心特点:秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。 秒杀业务流程比较简单,一般就是下订单减库存客户端设计:-代理层设计:1、缓存一些读多写少的数据 ,比如用户信息2、限流 ,限制某一个IP的某段时间的请求量,防止某一个ip请求太多次限流的阈值可以动态调控,比如服务器有一台挂了,那么可以减少阈值,,可以通过lua脚本来动态读取zk的服务器情况..

2021-11-18 18:02:46 129

原创 java 基础

进程、线程、协程区别: 1、进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。  2、线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序

2021-11-18 17:58:49 425

原创 zookeeper学习笔记之-RequestProcessor详解

PrepRequestProcessor通常是一个Requestprocessor Chain中的第一个Processor,用来预处理请求。主要包括:检查ACL,如果不匹配ACL,则直接结束对该请求的处理 生成并记录ChangeRecord 设置持久化txn 调用下一个RequestProcessor通俗一点理解就是,过滤Request,不是所有的Request都是合法的,所以需要对Request进行合法的验证,验证通过后,对于Request而言就要进行持久化了,所以Prep..

2020-07-26 12:47:41 567

原创 zookeeper学习笔记之-Zookeeper连接建立流程

SendThread功能负责建立socket连接 负责从outgoingQueue中获取命令数据发送给服务端 ping命令 CRUD命令 auth命令 负责读取服务端响应数据 ping的结果 auth结果 通知 监听器事件:添加到waitingEvents队列中。 设置数据包Packet的响应信息 注册监听器 如果是异步调用,则把Packet添加到waitingEvents队列中。 如果是同步调用,则notifyAll ..

2020-07-26 12:47:35 357

原创 zookeeper学习笔记之-Zookeeper中的Watch

watcher 机制主要提供了服务通知功能Watche的分类客户端三类,服务端两类dataWatches:表示监听的是某节点的数据变化,比如数据的新增、修改、删除 childWathes:表示监听的是某节点的孩子节点的变化,如果某个节点新增或删除了,会触发其父节点上的NodeChildrenChanged事件 existWatches(只在客户端):服务端无需单独触发该事件,由客户端接收其他事件自己判断,比如客户端接收到一个NodeCreated事件,客户端如果注册了existWa.

2020-07-26 12:47:29 506

原创 zookeeper学习笔记之-Zookeeper中Session的底层原理

Session的创建流程客户端和服务端Socket连接建立成功后,客户端会向服务端发送一个ConnectRequest请求,服务端接收到ConnectRequest请求后,会创建SessionImpl对象,并且把SessionImpl对象放入sessionsById中(sessionById是一个Map),并且会把Session的过期时间更新到sessionExpiryQueue中,然后会在服务端内部构造一个OpCode.createSession的Request,该Request...

2020-07-26 12:47:23 386

原创 zookeeper学习笔记之-Zookeeper如何解决脑裂问题

什么是脑裂脑裂(split-brain)就是“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”,我们都知道,如果一个人有多个大脑,并且相互独立的话,那么会导致人体“手舞足蹈”,“不听使唤”。脑裂通常会出现在集群环境中,比如ElasticSearch、Zookeeper集群,而这些集群环境有一个统一的特点,就是它们有一个大脑,比如ElasticSearch集群中有Master节点,Zookeeper集群中有Leader节点。本篇文章着重来给大家讲一下Zookeeper...

2020-07-26 12:47:17 245

原创 zookeeper学习笔记之-Zookeeper快速领导者选举原理

人类选举的基本原理正常情况下,选举是一定要投票的。我们应该都经历过投票,在投票时我们可能会将票投给和我们关系比较好的人,如果你和几个候选人都比较熟,这种情况下你会将选票投给你认为能力比较强的人,如果你和几个候选人都不熟,并且你自己也是候选人的话,这时你应该会认为你是这些候选人里面最厉害的那个人,大家都应该选你,这时你就会去和别人交流以获得别人的投票,但是很有可能在交流的过程中,你发现了比你更厉害的人,这时你如果脸皮不是那么厚的话,你应该会改变你的决定,去投你觉得更厉害的人,最终你将得到在你心中.

2020-07-26 12:47:09 235

原创 zookeeper学习笔记之-Zookeeper集群两阶段提交原理

Leader、Follower、Observer中的RequestProcess整理:https://www.processon.com/view/link/5e993d5de0b34d6feab4b435Zookeeper集群为了保证数据一致性,利用两阶段提交机制。对于Leader节点和非Leader节点(Follower或Observer)在处理读写请求时是不一样的。 Leader节点 非Leader节点(Follower或...

2020-07-26 12:46:59 1671

原创 zookeeper学习笔记之-Zookeeper集群同步数据原理

Leader和Learner什么时候开始同步数据当服务器启动时,完成了领导者选举后,确定了服务器的角色后(比如Leader、Follower、Observer),会先统一Epoch,然后就开始数据同步,最后再构造RequestProcessor,处理客户端的请求。Learner节点向Leader发送LearnerInfo数据(包含了acceptEpoch),然后等待Leader响应 Leader不停的从Learner节点接收到发送过来的LearnerInfo数据,比较Epoch,超过过..

2020-07-26 12:46:46 599

原创 zookeeper学习笔记之-Zookeeper知识点总结

Zookeeper客户端发送数据Packet整理:https://www.processon.com/view/link/5ea56c5ae0b34d05e1af99ed#map

2020-07-26 12:46:33 172

原创 zookeeper学习笔记之-Zookeeper单机模式下的启动流程与数据接收模型

启动流程启动类:org.apache.zookeeper.server.quorum.QuorumPeerMain调用ZooKeeperServerMain.main(args) 把配置解析成ServerConfig对象 初始化FileTxnSnapLog对象:快照和日志操作工具类 初始化JvmPauseMonitor 初始化ZooKeeperServer 启动AdminServer 创建NIOServerCnxnFactory对象 开启ServerSocketChanne..

2020-07-25 17:56:21 137

原创 zookeeper学习笔记之-Zookeeper详细功能介绍与客户端框架使用

节点类型(znode)持久节点,所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点。 临时节点,和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。 持久顺序节点,这类节点的基本特性和持久节点是一致的。额外的特性是,在ZK中,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的.

2020-07-25 17:55:35 342

原创 zookeeper学习笔记之-分布式系统介绍以及zookeeper快速入门

发展背景单一应用架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。。垂直应用架构当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。分布式服务架构当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。什么是分布式系统?《分布式系统原理和范型》一书中是这样定义分布式系...

2020-07-25 17:54:51 561

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除