ElasticSearch入门及JavaRestClient
JavaRestClient上小节中我们利用ES和Kibana了解了restfu风格的ES基础操作,包括索引库和文档的CRUD
实际应用当中我们如何用代码来操作ES呢?
ES官方提供了各种不同语言的客户端用来操作ES。这些客户端的本质就是组装DSL语句,通过HTTP请求发送给ES。
官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
其中java 的API 是JavaRestClient,它又包括两种
Java Low Level Rest Client
Java High Level Rest Client
这里学习的是Java High Level Rest Client
JavaRestClient索引库操作预备数据数据库中导入黑马提供的sql脚本,表名hotel-demo
字段
类型
长度
注释
id
bigint
20
酒店id
name
varchar
255
酒店名称
address
varchar
255
酒店地址
price
int
10
酒店 ...
ElasticSearch入门及简单DSL
转自 ElasticSearch | Kyle’s Blog (cyborg2077.github.io)
初识ElasticSearch了解ESElasticSearch的作用ElasticSearch是一个分布式的搜索引擎
海量数据中快速寻找有相关关键字的条目
搜索引擎中常用
ELK技术栈(elastic stack)
ElasticSearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域
日志信息帮助快速排查错误
而ElasticSearch是elastic stack的核心,负责存储、搜索、分析数据
ElasticSearch底层又由Lucene实现
ElasticSearch和Lucene
ElasticSearch底层是基于Lucene来实现的
Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发,官网地址:https://lucene.apache.org/
Lucene的优势
易扩展
高性能(基于倒排索引)
...
VMware虚拟机网络配置
们可以在选项栏的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式)
引入我们在VMware的“编辑”下的“虚拟网络编辑器”中看到VMnet0(桥接模式)、VMnet1(仅主机模式)、VMnet8(NAT模式)
这时什么意思呢?
VMware软件安装完成之后,会在电脑上虚拟出三块虚拟交换机和两块虚拟网卡。
其实,我们现在看到的VMnet0表示的是用于桥接模式下的虚拟交换机;VMnet1表示的是用于仅主机模式下的虚拟交换机;VMnet8表示的是用于NAT模式下的虚拟交换机。
同时,在主机上对应的有VMware Network Adapter VMnet1和VMware Network Adapter VMnet8两块虚拟网卡,它们分别作用于仅主机模式与NAT模式下。
注意 ,网桥模式下没有VMware Network Adapter VMnet0虚拟网卡
总结:
VMnet0:用于虚拟桥接网络下的虚拟交换机。
VMnet8:用于虚拟NAT网络下的虚拟交换机。
VMnet1:用于虚拟Host-Only网络下的虚拟交换机。 ...
JVM笔记 编译期间处理和类加载流程及优化
本章了解源代码到字节码的过程中编译器对源码做了那些优化处理?
字节码要经过类加载器的加载,了解各种类加载器以及类加载的各个阶段
类加载器将字节码加载到JVM中就可以执行程序了,执行程序主要依靠执行引擎提供的解释器进行解释执行
与此同时,在解释执行的过程中还会对一些热点代码进行进一步的编译处理
学习本章前 需了解 java的类文件结构以及字节码相关知识
1 编译期处理(语法糖)所谓的 语法糖 ,其实就是指 javac 编译器把 .java 源码编译为 .class 字节码的过程中,自动生成和转换 的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利(给糖吃嘛)
注意,以下代码的分析,借助了 javap 工具,idea 的反编译功能,idea 插件 jclasslib 等工具。另外,编译器转换的结果直接就是 class 字节码(所谓真正的字节码只能时二进制形式的),只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记
1.1 默认构造器public class Candy1 {
& ...
TCP三次握手和四次挥手
相关面试题 :
为什么要三次握手?
第 2 次握手传回了ACK,为什么还要传回SYN?
为什么要四次挥手?
为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?
三次握手
建立一个 TCP 连接需要“三次握手”,缺一不可 :
一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务器的确认;
二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态
三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。
为什么要三次握手?(重要)三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己 ...
JVM笔记 类文件结构与字节码指令
目标本章主要了解一下 java字节码
也就是.class文件的类文件的接口
了解常见字节码指令
1 类文件结构(.class)先来看以及简单的hello world 程序:
// HelloWorld.java
package cn.itcast.jvm.t5
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}
执行 javac -parameters -d . HellowWorld.java // -parameters -d 保留参数名称信息
编译为 HelloWorld.class 后是这个样子的:
下面的1.1 - 2.1节就来分析这些字节码,额,如果觉得头疼(不行,我的头好痛啊,看到这些数字就头大),当然也可以直接跳过直接看2.2节
[root@localhost ~]# od -t xC HelloWorld.class
0000000 ca fe ba be 0 ...
HashMap
HashMap要求
掌握 HashMap 的基本数据结构
掌握树化
理解索引计算方法、二次 hash 的意义、容量对索引计算的影响
掌握 put 流程、扩容、扩容因子
理解并发使用 HashMap 可能导致的问题
理解 key 的设计
1)基本数据结构
1.7 数组 + 链表
1.8 数组 + (链表 | 红黑树)
更形象的演示,见资料中的 hash-demo.jar,运行需要 jdk14 以上环境,进入 jar 包目录,执行下面命令
java -jar --add-exports java.base/jdk.internal.misc=ALL-UNNAMED hash-demo.jar
2)树化与退化树化意义
红黑树用来避免 DoS 攻击,防止链表超长时性能下降,树化应当是偶然情况,是保底策略
hash 表的查找,更新的时间复杂度是 $O(1)$,而红黑树的查找,更新的时间复杂度是 $O(log_2n )$,TreeNode 占用空间也比普通 Node 的大,如非必要,尽量还是使用链表
hash 值如果足够随机,则在 hash 表内按泊松分布,在负载 ...
java基础篇3 线程进程 死锁
多线程线程和进程进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。
在 Java 中,当我们启动 main 函数时其实就是启动了⼀个 JVM 的进程,⽽ main 函数所在的线程就是这个进程中的⼀个线程,也称主线程。
线程 但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。
请简要描述线程与进程的关系,区别及优缺点
⼀个进程中可以有多个线程,多个线程共享进程的堆和⽅法区 (JDK1.8 之后的元空间)资源,但是每个线程有⾃⼰的程序计数器、虚拟机栈 和 本地⽅法栈。
总结 :线程 是 进程 划分成的更⼩的运⾏单位。线程和进程最⼤的不同在于基本上各进程是独⽴的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响。线程执⾏开销⼩,但不利于资源的管理和保护;⽽进程正相反
程 ...
MySQL基本知识1
MySQL 基础架构 语句执行流程MySQL 基本架构MySQL 基本架构概览下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的。
先简单介绍一下下图涉及的一些组件的基本作用帮助大家理解这幅图,在 1.2 节中会详细介绍到这些组件的作用。
连接器: 身份认证和权限相关(登录 MySQL 的时候)。
查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。
分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
优化器: 按照 MySQL 认为最优的方案去执行。
执行器: 执行语句,然后从存储引擎返回数据。
简单来说 MySQL 主要分为 Server 层和存储引擎层:
Server 层:主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binlog 日志模块。
存储引擎: 主要负责数据的 ...
JVM笔记 垃圾回收机制
本文主要介绍JVM的垃圾回收机制
Java相对于C/C++ 程序原来说,几乎不用考虑对象资源创建后的回收工作,这得益于JVM的垃圾回收机制GC
但是作为企业中的高级程序员来说,只会代码编写是不够的,还要再JVM整体性能上进行针对性评估,会利用诊断工具定位代码或者模块缺陷,会设定JVM参数针对性调优
1 如何判断对象可以回收1.1 引用计数法
引用计数归零时进行垃圾回收
弊端:循环引用问题
早期的python使用这种方案
1.2 可达性分析算法
根对象(root:跟定不能被垃圾回收的对象叫做根对象)
Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
扫描堆中的对象,看是否能够沿着 GC Root对象 为起点的引用链找到该对象,找不到,表示可以
回收
哪些对象可以作为 GC Root ?
1、System Class 系统核心类 对象
2、Native Stack JavaJVM与操作系统相关的类对象(详见本地方法栈)
3、Busy Monitor 正在被加锁的对象
4、Thread 活动线程 栈帧内使用的局部变量引用的对象
(PS:用MAT工具查看根对象 ...