ElasticSearch查询浅谈
什么是ElasticSearchElasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。
简单来说ES是一个搜索引擎,通过URI Search API和 DSL Search API 两种搜索方式,它的底层数据结构是倒排索引,实现快速搜索。
ElasticSearch 一般存储的是非机构化的数据,简单来说就是JSON。它可以根据JSON内容自动生成索引(index),针对自动生成索引也可以使用index template 自动生成对应的mapping,也可以自己创建索引在导入数据。(我们一般在生产上都是先指定索引在导入数据)。
ES中的一些名词解释索引(index):ES中索引是文档的容器,是一类文档的结合,Index体现了逻辑空间的概念,每个索引都有自己的mapping的定义。用于定义包含文档的字段名和字段类型。
查看索引的对应的DSL 语句
12345678910#查看所有index的详细信息GET /_cat/indicesgreen open kibana_sample_data ...
Java热点代码的性能测试工具JMH
什么是JMHJMH:Java Microbenchmark Harness Java 微基准测试工具。
JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM.
JMH是Java测试工具,用于构建、运行和分析用Java和其他针对JVM的语言编写纳秒/微秒/毫秒级别的基准测试。
BenchMark:又叫做基准测试,主要用来测试一些方法的性能,可以根据不同的参数以不同的单位进行计算(例如可以使用吞吐量为单位,也可以使用平均时间作为单位,在 BenchmarkMode 里面进行调整)。
Micro Benchmark:简单地说就是在 method 层面上的 benchmark,精度可以精确到微秒级。
OPS, Opeartion Per Second: 每秒操作量,是衡量性能的重要指标,数值越大,性能越好。类似的有 TPS, QPS
Warmup 预热: ...
MySQL的死锁
前言 I have a pen I have an apple Ugh Apple pen 这首PPAP大多数人都应该听过,不过今天不是讨论唱歌而是一个和PPAP差不多的事情 I have a MySQL I have DeadLock Ugh MySQL-DeadLock。 MySQL的死锁。
什么是死锁死锁(DeadLock):当两个以上的运算单元,双方都在等待对方停止执行,以获取系统资源,但是没有一方提前退出时,就称为死锁。一般出现死锁会满足以下四种情况:
互斥条件:一个资源每次只能被一个运算单元使用。
持有和等待:一个运算单元可以在等待时持有系统资源,保持不释放。
禁止抢占:运算单元持有资源,在使用完之前不可以被强行退出。
循环等待:一系列运算单元互相持有其他运算单元所需要的资源。
只要破坏以上四个条件中的任意一个就可以解决这个死锁问题,这也是后面解决死锁问题的基本思路。
在操作系统里资源持有的维度是进程,所以上述运算单元可以理解为一个进程(这种死锁一般是指操作系统维度的进程管理)。根本原因还是因为并发和资源的分配的问题。
MySQL加锁的过程之前文章有讨论MySQL的锁 ...
Reactor模式与EventLoop
什么是Reactor模型Reactor 模型 也可以叫Reactor 模式也可以,毕竟设计模式(design pattern)。Reactor模型(Reactor Pattern)比较生硬的翻译就是反应器模式。它是一种事件处理模式(event handing pattern),用于处理一个或多个并发输入的服务请求给服务处理器(service handler)。服务处理器(service handler)将请求多路分解同步派发给业务关联的请求处理器(request handler)。
Reactor 模式的组成资源(resource):任何向系统输入的请求,或者消耗系统输出。(client request)
同步事件多路分解器(Synchronous Event Demultiplexer):使用一个事件循环去阻塞所有的资源,当同步资源没有被阻塞多路分解器会把资源发送给dispatcher(分配器)。
工作逻辑:如果一个资源没有被读取完就会被阻塞,多路分解器就会使用select()方法在这个资源上,直到这个资源可以被读取,在同步调用read()方法使资源不被阻塞,同时多路分解器吧资源分 ...
MySQL中的锁与MVCC
前言MySQL是现在非常主流的开源数据库软件,在大多数公司的OLAP(on-line transaction processing)系统中作为RDS(Relation Database Server)。
对MySQL熟悉的肯定知道MySQL在保证并发条件下数据的准确性,增加了事务、锁。而且还引入MVCC提高MySQL对于多并发的读写操作效率。之前文章介绍了MySQL的事务的四种隔离级别(读未提交,读已提交,可重复读,串行化)。但是没有具体分析MySQL在可重复读的情况下是如何读和写。下面我们具体分析一下MySQL如何保证隔离级别和隔离级别如何实现,主要介绍锁和MVCC模式。
锁锁这个概念大家都应该是熟悉的,一般解决并发和资源共享问题都会用锁来解决。将共享资源用锁锁住,其他的四事务就不能使用,只能当前事务使用。(使用锁也会造成死锁问题,这个是我们后面要讨论的)现在我们先把锁和事务关系搞清楚,什么时候会用什么样的锁,锁是怎么加上的。锁是存在存储引擎层面。
事务并发情况一般锁在事务并发情况下出现,对于MySQL数据只有两种操作读和写,那么按照排列组合,多事务(两个事务)并发就会有四种情况,读 ...
SpringBoot启动的过程分析
前言前面两篇文章,简单说SpringBoot在web容器中启动,也就是把代码打成war包放到Tomcat/Jetty的服务器上启动,现在随着容器化越来越成熟,应用越来越多使用jar包的形式去部署,也就是jar包内包含web容器,通用命令 java -jar app.jar这种方式去启动服务。而且这种也更好的实现动态部署和弹性升级控制。一般我们把这种集成了web容器的jar包叫FatJar。顺便说下jar包也是zip压缩的变种所以使用zip解压工具直接打开。
FatJar的结构如何获取一个FatJar,这个简单只要在maven的控制栏执行一下package命令就可以了。
我们找到对应的目录,Idea是把这个jar包放到Target的临时目录里面。我们解压jar包,使用tree命令去执行。如果你执行玩发现没有对应的lib打进来,或者不是一个可以执行jar只有class文件。在打包的pom文件中加入这段代码
12345678910111213141516<build> <plugins> <plugin> ...
Spring如何实现MVC-下篇(SpringBoot是如何实现初始化)
前言上篇我们着重讲了SpringMVC与Servlet关系,而且SpringMVC通过web.xml配置设置DispatcherServlet启动,同时启动webApplicationContext容器,然后通过refresh()方法,把所有Spring相关的bean注册和启动,这里包括controller,Interceptor,viewResolver,view等等组件。
在上篇文章的结尾我说了另外一种另外的一种启动webApplicationContext容器的方法。这是Servlet3.0协议引进的ServletContainerInitializer。下面我就讲讲ServletContainerInitializer具体作用和它与SpringBoot关系。SpringBoot主要解决了Spring的配置,有一个思想叫约定大于配置。而这种约定大于配置,或者使有默认的以来的SpringBean的注入都是依赖于SPI。关于SPI我之前在自己动手写starter的文章中有提及,想要看的可以去翻翻。
因为SpringMVC基本都已经过时了,因为现在开发中不仅仅是Web端,还有手机端,微 ...