自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhangCheng的博客

记录一些学习总结和理解

  • 博客(122)
  • 收藏
  • 关注

原创 Flink基础原理

第二步,由flinkClient依据StreamGraph 进行优化,将数据不需要跨taskmanager进行分组聚合等操作的(One-to-One关系),比较简单的直接流向后一个算子的这种,合并成一个subtask。允许同一个job下的subtask(子任务,也就是分解出来的各个算子)可以共享slot,这样可以使得同一个slot运行整个job(每个task)的流水线(pipleline)、TaskManager最多能同时并发执行的任务是可以控制的,那就是3个,因为不能超过slot的数量。

2022-11-15 17:18:12 1690 2

原创 Elasticsearch 写入和查询优化底层原理

一、Elasticsearch 写入原理二、es 写入涉及到的概念三、写入的特性优化方案一:优化方案二:五、es优化1、写优化:2、读优化

2022-06-12 13:53:42 812

原创 Elasticsearch 聚合

一、基本概念3、例子说明:(1)、Bucketing,桶聚合term关键字就是桶聚合,设置桶聚合的匹配字段是gender桶聚合的基础上进行子聚合,这是桶聚合与指标聚合的父子聚合子聚合与父聚合的结果是平级的,以下例子,terms就是父聚合的结果集,所以子聚合就需要卸载terms同一级的后面。结果就是在分桶的基础上去计算每个桶里面的age的平均数。(2)、Metric指标聚合对某个字段进行统计分析,常用的指标聚合,avg(平均)、sum(求和)、max*(最大值)、min(最小值)、cardinal

2022-06-08 22:57:53 628

原创 Elasticsearch 分词器

一、normalization(归一化)二、character fifter三、token fifter四、分词器(4)、中文分词器(IK)(5)、热更新

2022-06-04 22:12:43 830

原创 Elasticsearch Query DSL 整理总结(查询)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2022-06-03 10:56:04 1122

原创 elasticsearch的映射 (mapping)

一、概念映射 (mapping)就是指定索引(index)里面的每个文档中的字段的类型,设置字段的存储和查询的分析策略。es对不同的字段类型,有不同的存储和检索策略,比如对于text类型的字段,会经过各类分词处理(大小写转换/同义词转换),才会建立对应的倒排索引。但是对于数值\时间等默认的keyword字段,会直接将整个值建立到倒排索引中。如果不在创建索引的时候手动设置的话,es也会根据字段值进行自动映射。二、映射的组成1、Meta-fields:用于自定义文档的元数据,每个文档都有对应

2022-05-30 22:39:09 604 1

原创 倒排索引详细解析

一、核心概念1、索引是什么?索引的作用是辅助快速检索数据,不同的索引形式(B\B+\倒排索引),实际上就是数据结构不同,最终索引的落地形式还是文件,也就是不同的数据结构的文件数据,就是不同的索引,适用于不同的场景。2、B+树结构的索引能解决大数据检索的问题吗? (1)、一般全文检索,检索的是文本,文本数据一般是比较大的,如果B+树的节点存储的是文本,那么会造成一个磁盘块存储不了多少数据, 最终造成B+树的深度增大.IO次数变多,搜索效率就会很慢。 (2)、B+树结构无法解决模糊检索的要

2022-05-29 20:50:25 1164

原创 elasticsearch基本概念

一、数据结构es是文档型的存储方式,一条数据就是一个文档,对于用户来说就是一条JSON.一个索引下面,有多个文档,一个文档里面有多个字段(灵活的,非结构化的,也就是每个文档的字段都可以不一样)。二、集群(Cluster)/节点(Node)/分片(Shards)/副本(Replicasedit)集群: 实际上就是多个es实例,启动后,只要cluster.name是相同的, 相互之间网络关系也是通的,就是一个es集群。节点: 实际上就是一个es实例,es的数据存储和搜索等功能都是通过这

2022-05-27 21:47:12 521

原创 Activiti分支/网格/驳回操作

一、概念任务节点处理完成之后,后面的处理可能需要根据不同的调节走不同的流程(选择一条路径,串行),或者是将任务分发到多个审批人头上(分发到多条流程路径),或者在某个任务节点要判断多个人审批之后才能继续执行(多条路径汇聚到一点)。这种操作就要用到流程分支的概念,一个分支相当于就是一个子流程,有串行流,也有并行流。二、连线流程在连线上设置条件,根据条件判断后面的流程走那个分支,这样做的好处在于方便快捷,坏处在于如果所以连线都没有满足条件,则当前流程会异常结束,不会有异常显示。步骤: 在bp

2022-05-22 22:06:30 3873

原创 Activiti数据表及流转

一、概念Activiti工作原理的本质就是提高一系列的API,对25张数据库表进行操作,流程数据就在这些表里面流转,所以弄清楚这些表的作用,和流程在每个阶段在这些表的流转情况很重要。所有的表都以ACT_开头,第二部分是表示表的用途的两个字母标识,用途也和服务的API对应。1、ACT_RE_*: 'RE'表示repository,用于存储流程定义信息(根据bpmn文件生成的流程定义信息,根据zip流程部署包生成的部署信息, 流程设计的模型数据等)。2、ACT_RU_*: 'RU'表示runt

2022-05-22 14:02:33 1838

原创 Activiti工作流基本概念

一、核心思想理解: Activiti核心思想,实际上就是提供一系列的API,对他规定的23张数据库表进行操作。所有的数据流转,都是在这23张表里面完成,其中RE表存储流程部署相关信息,RU表存储运行时信息,HI表存储历史信息。通过表里面的业务键,与具体的业务信息关联起来。 通过流程设计插件,画BPMN流程图,实际上就是xml文件,规定了一个流程里面的每个节点的信息,每个节点可以通过设置变量的方式,填充一些信息,比如审批人/审批组等信息。在运行的时候,通过API里面提供的参数和方法,将具体的值填充到

2022-05-20 16:13:16 706

原创 行为型设计模式—chain of responsibility(责任链模式)/observer(观察者模式)/mediator(中介者模式)/iterator(迭代器模式)

一、chain of responsibility(责任链模式)(1)、思想对数据的处理形成一条链条,一个节点处理完成之后再由下个节点进行处理。(2)、步骤 1. 声明fifler接口,声明fifter方法 2. 声明fifter接口实现类,实现fifter方法 3. 声明FilterChain类,对各个fifter实现对象进行管理,包括增加/删除/索引管理等 4. FilterChain类里面维护成员变量List<Ififter> fifterList,和index,dofi

2021-10-19 11:51:20 198

原创 行为型设计模式—strategy(策略模式)/command(命令模式)/memento(备忘录模式)/state(状态模式)

一、行为型设计模式的作用关注点在于类和对象如何协作,各自分担职责。二、strategy(策略模式)(1)、思想通过客户端构造方法,注入不同的抽象实现子类类,执行相同的客户端方法,执行不同的逻辑,替代if else,公有逻辑都在抽象类里面定义好了,所有传入不同的抽象子类都会执行同一个公有逻辑。(2)、步骤 1. 创建抽象类,创建公有的具体方法和抽象方法 2. 创建不同的子类重写抽象方法 3. 在客户端通过构造方法,注入不同的子类。 4. 调用的时候传入不同子类,就可以实现不同的私

2021-10-19 11:24:17 340

原创 构建型设计模式—facade(门面模式)/flyweight(享元模式)/composite(组合模式)/template(模板模式)

一、facade(门面模式)1、思想大量对象集中在一个门面对象里面,统一进行管理,进行方法调用。2、步骤 1. 声明多个普通类。 2. 创建门面类,门面对象里面通过static块初始化要管理的对象,赋值给成员变量。 3. 门面对象的方法里面按需求调用不同的成员变量方法 4. 客户端创建门面对象,通过门面对象调用方法去执行被管理对象的方法。3、步骤//心脏科public class heart { public void consult(){ System.

2021-10-19 10:01:24 217

原创 构建型设计模式—adapter(适配器模式)/bridge(桥接模式)/decorator(装饰者模式)

一、构建型设计模式的作用关注点在于如何将多个类或对象,整体布局成一个更强大的结构二、adapter(适配器模式)(1)、思想 当原接口不能处理某种数据的时候,就交给一个适配器去处理(类似于转接头原理)。适配器根据不同的参数,来确定用哪一个扩展的对象方法(哪一个插卡连接)来处理数据。重点就在于根据参数的不同,选择不同的处理方式,在客户端要看不出内部实现,逻辑全在适配器里判断。(2)、步骤 1. 声明原接口,创建接口方法。 2. 声明原接口实现类,持有适配器,,重写接口方法,方法里面根据

2021-10-18 15:11:16 300

原创 创建型设计模式—factory(工厂模式)/protoype(原型模式)/builder(建造者模式)

一、Factory Method(工厂方法模式)(1)、思想将创建对象的过程抽象成工厂接口,将需要创建的某一类对象抽象成产品抽象类。通过不同的工厂接口实现类,去创建不同的对象这样就可以在外部,利用多态的特性,工厂接口指向不同的工厂接口实现类,去创建不同的对象。(2)、步骤 1. 创建工厂接口类,声明工厂方法,方法返回抽象产品类 2. 创建抽象产品类 3. 创建不同的工厂接口实现类,重写接口方法,返回不同的产品。 4. 外部调用时,用接口指向不同的接口实现类,调用相同的方法创建不同的对

2021-10-18 11:47:01 331

原创 创建型设计模式—singleton(单例模式)

一、创建型设计模式的作用关注点在与怎样创建对象,将创建对象和使用对象分离二、核心思想:单例模式的核心在于要保证内存里面始终只存在一个类对象。主要从2个方面考虑:1、必须私有化构造方法,防止在外部new对象2、必须提供一个公有方法给外部调用,这个公有方法里面实现单例创建对象的逻辑三、实现方式1、利用类加载机制(急加载)(1)、思想 利用类加载机制,在类加载的时候,被static修饰的成员变量就会加载到内存中, 并且在是类对象可以保证内存中只有一个。 缺点在于在类加载的时候就会初

2021-10-18 11:16:52 151

原创 elasticsearch基础语法(DSL)

一、curd基本操作(原生api)1、查询出所有索引类似于sql的查询节点信息GET _cat/indices2、创建索引,指定mapping(映射关系)类似于sql的创建表,指定表字段的各种属性PUT bank{ "mappings": { "properties": { "id":{"type": "integer"}, "en_name":{"type": "keyword"}, "zn_name":{"type": "text"},

2021-09-28 14:46:39 1404

原创 security oauth sso

一、关于oauth.2协议客户端去访问服务端资源,要经过以下步骤:1、客户端请求认证服务器,获取到一个授权码(认证服务器上提前注册了客户端 的ip、端口、秘钥等信息)。2、返回授权码到客户端,这个授权码是一次性的, 并且和认证信息authentication是一一对应的。3、客户端带上授权码访问认证服务器, 通过授权码可以找到对应的authentication(认证信息), 生成token将token存入redis (token值为key,value为通过认证信息查

2020-12-31 16:11:43 196

原创 security jwt

一、JWT原理jwt实际上就是一个编码和加密后的字符串,分为三部分:1、header声明类型和加密算法{ "typ": "JWT", "alg": "HS256"}2、playload(主体信息) 按信息类型分为:<1>、标准中注册的声明(Registered claims): jwt提供的固定的声明信息,比如 iss: jwt 签发者 sub: jwt 所面向的用户 aud: 接收 jwt 的一方 exp: jwt 的过期时间,这个过期时

2020-12-31 16:07:59 539 1

原创 spring security基础概念

一、什么是spring security?1、分为用户认证(Authentication)和用户授权(Authorization)两个部分. 用户认证指的是验证某个用户是否为系统中的合法主体, 也就是说用户能否访问该系统。 用户授权指的是验证某个用户是否有权限执行某个操作。2、 框架简介要对Web资源进行保护,最好的办法莫过于Filter要想对方法调用进行保护,最好的办法莫过于AOP。springSecurity进行认证和鉴权的时候,就是利用的一系列的Filter来进行拦截的。请求

2020-12-31 16:04:27 575

原创 Netty服务器端和客户端流程解析

一、服务端时序图:1、创建ServerBootStrap实例2、通过ServerBootStrap实例创建EventLoopGroup(线程池,事件循环组)3、有客户端连接请求,就通过EventLoopGroup生成一个channel(通道,类似于socket), 将其注册到EventLoop(线程)里面,这个线程会循环监听channel的IO事件。4、创建管道ChannelPipeline和channel绑定,里面有多个阀门ChannelHandler (具体的处理逻辑就写在这里),

2020-12-25 17:37:51 775

原创 Netty核心组件解析

一、Channel:1、客户端连接上服务器之后,就会产生一个channel,就是一个通道。2、可以理解为socket,通过channel来完成IO操作(read、write、bind、connect等等) 也是数据入站和出站的载体。二、EventLoop 和 EventLoopGroup 1、EventLoop就是一个用于监控事件的一个组件,所有Channel都会被分配到具体的 EventLoop上。 2、一个EventLoop可以监控多个channel。 3、EventL

2020-12-25 17:34:34 462

原创 Reactor和Netty模式详解

一、经典的I/O服务设计 ———— BIO模式1、流程:(1)、服务器端的Server是一个线程,通过死循环来阻塞的监听客户端的连接请求和通信。(2)、当客户端向服务器端发起连接请求,服务器端通过ServerSocket.accept()阻塞 返回一个Socket对象,此Socket对象和对应的客户端建立连接。(3)、构建一个handler,将Socket传入该handler(处理程序), 并创建一个线程来执行这个handler。(4)、当该客户端和服务器端完成通信关闭连接

2020-12-25 17:32:06 995

原创 Socket和NIO深入分析

一、TCP/UDP:同:都属于传输层协议,传输层协议只关心传输数据,而不关心数据的封装异:1、TCP是可靠性传输协议,点对点的传输,有连接状态,可能会发生粘包和拆包2、UPD不可靠,广播性质的传输,无连接状态,不会发生粘包和拆包为什么:1、可靠性:TCP是基于流来传输的,发送端发送数据,会先将数据发送到系统内核,再通过网络发送到接收端内核,接收端收到后,会发送ack到发送端,发送端收到后才会情况内核缓存。而UDP发送到接收端之后,没有确认机制,直接情况内核缓存,可能会数据丢失。

2020-12-25 17:26:58 719

原创 webSocket+Stomp+SockJS+rabbitmq推送原理和使用

一、websocket与httphttp是基于短连接的,无法实现长连接,无法实现双工通信。websocket是基于长连接的,可以双工通信。这两个协议都属于应用层,都是基于tcp传输层协议实现的。websocket第一次连接的时候,是发送的http请求,请求成功后,升级为socket连接。第一次请求头会带着两个参数,告诉服务器,协议要升级。服务端确认并返回后,就升级(与http无关了)Upgrade: websocketConnection: Upgrade二、Websocket的作

2020-12-25 17:24:03 1400 1

原创 IO模型

一、IO模型分类1、同步阻塞IO(Blocking IO):即传统的IO模型。2、同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的, 非阻塞IO要求socket被设置为NONBLOCK。3、异步阻塞IO:即经典的Reactor设计模式,也称为IO多路复用。4、异步非阻塞IO:即经典的Proactor设计模式。二、IO操作分为哪些部分:1、先从磁盘、socket套接字等读取数据到操作系统内存。2、再从操作系统内存读取数据到用户线程中。三、同步和异步区

2020-12-25 17:19:09 275

原创 Http、Socket、WebSocket之间联系与区别

一、TCP/IP协议栈详解1、TCP/IP协议栈分为4层:(1)、网络层(IP):(高速公路),只管建立通道。(2)、传输层(TCP和UDP):(卡车),只管传输数据。(3)、应用层(HTTP和WebSocket) (货物箱),管理传输的数据的具体格式, 利用tcp传输协议,在客户端和服务端之间传输封装好的数据。(4)、抽象层(SOCKET)(港口码头/车站),位于应用层和传输层之间,利用socket操作复杂的传输层协议的功能,相当于提供的一组api,可以让我们不直接操作传输

2020-12-25 17:15:28 206

原创 多线程执行任务,取结果归集

开启线程池并需要获取结果归集的情况下,如何实现,以及优劣,下面是任务执行完,结果归集时,几种方式:一.ExecutorService+Futrue原理:Future接口封装了取消,获取线程结果,以及状态判断是否取消,是否完成这几个方法demo:使用线程池提交Callable接口任务,返回Future接口,添加进list,最后遍历FutureList且内部使用while轮询,并发获取结果(1)、创建线程池ExecutorService exs = Executors.newFixedThrea

2020-12-22 14:23:13 1870

原创 Callable、Future和FutureTask

一、Callable与Runnable区别Runnable:无返回值,不会抛出异常Callable:有返回值,并会抛出异常。二、Future对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。通过get方法获取执行结果,该方法会阻塞直到任务返回结果。boolean cancel(boolean mayInterruptIfRunning);取消任务,mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务

2020-12-22 14:08:28 252

原创 线程辅助类CountDownLatch、CyclicBarrier和Semaphore

一.CountDownLatch用法1、作用: 类似于一个倒数计时器,一个线程的执行,要等这个计时器归零的时候再执行, 就可以用这个工具类。2、用法:(1)、通过构造方法,构造出这个计数器final CountDownLatch latch = new CountDownLatch(2);(2)、在需要倒数计时才执行的线程代码中设置阻塞等待latch.await();(3)、在其它线程逻辑中对计数器进行倒数递减latch.countDown();(4)、当count为0的时候,

2020-12-22 14:07:24 131

原创 阻塞队列和线程池

一、阻塞队列(1)、用处:如果不用阻塞队列,那么对于容器的添加和删除元素,就需要手动去实现同步锁,防止元素为空时再取数据,元素满了再加数据的情况发送。阻塞队列相当于封装了这一种同步逻辑。·(2)、几种主要的阻塞队列 ArrayBlockingQueue: 基于数组,必须指定容量大小,默认为非公平的队列, 即等待时间最长的任务不一定能先执行。 LinkedBlockingQueue: 基于链表实现,也就是不用指定容器大小,默认大小为Integer.MAX_VAL

2020-12-22 14:06:02 324

原创 同步容器

一.为什么会出现同步容器?像ArrayList、LinkedList、HashMap这些容器都是非线程安全的。如果有多个线程并发地访问这些容器时,就会出现线程安全问题。因此,在编写程序时,必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。二、Java中的同步容器类(1)、Vector、Stack、HashTable(2)、Collections类中提供的静态工厂方法创建的类 Vector实现了List接口,Vector实际上就是一个数组

2020-12-22 14:02:54 188 1

原创 volatile和ThreadLocal

一.深入剖析volatile关键字1、volatile关键字的两层语义:(1)、保证了不同线程对这个共享变量进行操作时的可见性,即一个线程修改了该变量的值, 这新值对其他线程来说是立即可见的(马上刷新到主内存,其它线程里面原来的副本立即失效, 并马上重新从主内存读取)。(2)、禁止进行指令重排序,也就是volatile修饰的变量,编译后, 和它的前后代码的顺序不会发送改变。2、volatile不能保证原子性比如自增操作,会分为3步:1、读取主内存数据到线程内存,生成一个线

2020-12-22 14:01:08 652

原创 JVM锁

一、synchronized关键字1、synchronized的本质本质上就是在代码块或者方法执行的首尾行添加了两条指令:monitorenter和monitorexitmonitorenter:对象的锁计数加1monitorexit:对象的锁计数减1每个对象的都对应一个监视器锁(monitor)对象,当monitor被占用(大于1)时就会处于锁定状态,其它线程不能访问。在获取对象锁的时候(获取cpu执行权的时候),就调用monitorenter,对象锁加1,此时锁大于0,则其他线程不

2020-12-22 14:00:43 148

原创 jvm线程安全问题

一、什么时候会出现线程安全问题?1、JMM模型:多线程对一个共享的资源进行修改(非原子性操作)的时候,由于每个线程对应不同的线程内存,而JMM(java内存模型)是分为主内存和线程内存的,就会造成线程安全问题(一个线程在线程内存里面已经修改了,但是没有刷新到主内存,另外一个线程从主内存读取的还是未修改过的原值)比如:线程A从主内存读取共享变量为0,存到线程内存后再自增+1,在自增加1之后,还没有把自增后的变量刷新到主内存此时线程B获得cup执行权,从主内存读取到的数据还是为1,这时候就出现

2020-12-21 10:29:53 295

原创 线程概念

一、如何创建线程(1)、继承Thread类重写run方法,在run方法中定义需要执行的任务。创建好了这个继承Thread类的线程类之后,就可以创建线程对象了,然后通过start()方法去启动线程。(2)、实现Runnable接口重写Runnable接口的run方法,在run方法中定义需要执行的任务。创建好了这个实现Runnable接口的类之后,new出实例runnable,传入到Thread类的构造方法中(Thread thread = new Thread(runnable));然后通

2020-12-21 10:02:17 119

原创 JVM GC

一、怎样判断对象是否已经死亡(1)、引用计数法对象头里面有一个计数,当有一个栈中的变量指向这个对象,计数就加1。当栈中的变量销毁,不再指向这个对象,计数就减1。当对象头里面的计数为0时,就标记为可回收对象。这样的方法m不能解决循环引用的问题,如果一个对象A持有对象B,而对象B也持有一个对象A,A与B的counter恒大于1,会使得GC永远无法回收这两个对象。(2)、可达性分析法 从堆中的对象向上查找,一直到GC root(栈变量\静态变量、静态常量等方法区或栈中的数据) 没有任何关系链

2020-12-21 10:01:29 109

原创 类的加载机制

一、什么是类的加载源文件编译之后,会生成.class文件,jvm将.class文件加载进内存,.class里面的描述信息(类名/方法/静态变量/常量等),会存入方法区,然后会在堆内存里面生成一个对应的java.lang.Class对象。这个java.lang.Class对象就是对方法区里面.class文件信息的封装,可以通过这个对象获取方法区中存的信息。二、类的生命周期(1)、加载:将.class文件的信息存入方法区,在堆中生成java.lang.Class对象。(2)、连接阶段:

2020-12-21 10:01:00 472

原创 JVM内存结构

一、概念(1)、jvm在运行时,会将它管理的内存区域分为堆、栈、方法区、程序计数器等区域,(2)、堆(head)和方法区是线程共享的,是存储数据的区域,解决的是数据存储的问题, 即数据怎么放、放在哪儿。(3)、栈(stack)和程序计数器是线程私有的,是运行时的区域,解决程序的运行问题, 如何处理数据。二、分别的作用:(1)、堆(head)是所有线程共享的区域。堆是jvm管理的内存中最大的一块,用来存放对象,总体分为老年代和新生代,其中新生代又分为三个部分,eden

2020-12-21 10:00:34 246

空空如也

空空如也

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

TA关注的人

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