Skip to content

Commit 6782819

Browse files
committed
refactor:精简专栏、新增专栏
1 parent 48e45ce commit 6782819

File tree

8 files changed

+464
-115
lines changed

8 files changed

+464
-115
lines changed

docs/.vuepress/config.js

Lines changed: 117 additions & 115 deletions
Large diffs are not rendered by default.

docs/md/es/ES基本概念.md

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
Elasticsearch,分布式,高性能,高可用,可伸缩的搜索、分析系统。
2+
# ES基本概念
3+
4+
## 1 概述
5+
6+
### 按主题
7+
8+
- 书目数据库 (Bibliographic database)
9+
- 企业搜索 (Enterprise search)
10+
- 医学文献检索 (Medical literature retrieval)
11+
- 垂直搜索(Vertical search)
12+
13+
14+
15+
## 2 垂直搜索(站内搜索)
16+
17+
18+
19+
- 互联网搜索:电商网站,招聘网站,新闻网站,各种app
20+
- IT系统搜索:OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单”
21+
22+
搜索,输入一段要搜索的关键字,期望找到这关键字相关信息。
23+
24+
## 3 数据库搜索
25+
26+
数据都存储在数据库里。技术角度,如何实现搜索,电商网站内部的搜索功能的话,就可以考虑,去使用数据库进行搜索。
27+
28+
### 3.1 案例-电商系统搜索
29+
30+
- 搜索含牙膏的商品
31+
- 在数据库中商品名称字段中存储有关键字
32+
33+
不考虑数据库的全文索引,假如商品有 1000 万个,得查找 1000 万次,且每次都需要加载商品的名称字段的整段字符串,并挨个寻找:
34+
![](https://img-blog.csdnimg.cn/201910220054339.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
35+
36+
- 每条记录的指定字段的文本,可能很长
37+
如“商品描述”字段的长度,有长达数千个,甚至数万字符。每次都对每条记录的所有文本进行扫描,难以判断,你包不包含我指定的这个关键词(如“牙膏”)
38+
- 无法将搜索词拆分
39+
尽可能去搜索更多的符合你的期望的结果,如输入“生化机”,就搜索不出来“生化危机”了
40+
41+
用DB实现搜索,不靠谱,性能很差。
42+
43+
## 4 全文检索 & Lucene
44+
45+
### 4.1 全文检索
46+
47+
#### 4.1.1 场景:搜索“生化机”
48+
49+
全文检索:
50+
![](https://img-blog.csdnimg.cn/20191022114619954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
51+
52+
但期望出来右侧的4条记录。将每条数据进行词条拆分。如“生化危机电影”拆成:生化、危机、电影等关键词(拆分结果取决于具体的策略算法)。
53+
每个关键词将对应包含此关键词的数据ID。搜索时,直接匹配这些关键词,就能拿到包含关键词的数据。该过程即全文检索。
54+
55+
词条拆分和词条对应的ID就是倒排索引的的基本原理。
56+
57+
#### 4.1.2 V.S DB
58+
59+
DB的数据共100万条,按之前思路,就要扫描100万次,且每次扫描,都需匹配那个文本所有的字符,确认是否包含搜索的关键词,而且还不能将搜索词拆解开来进行检索。
60+
61+
#### 4.1.3 利用倒排索引
62+
63+
假设100万条数据,拆分出来的词语,假设有1000万个,则倒排索引中,就有1000万行,可能并不需要搜索1000万次。很可能搜索第一次时,就能找到该搜索词对应的数据。也可能是第100次或第1000次。
64+
65+
### 4.2 lucene
66+
67+
一个jar包,包含封装好的各种建立倒排索引及进行搜索的算法。用lucene,就能将已有数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结构。
68+
69+
## 1 基本概念
70+
71+
![](https://img-blog.csdnimg.cn/79cf42fd234b4eeab236160fa9034317.png)
72+
73+
### segment file(Lucene)
74+
75+
存储倒排索引的文件,每个segment本质上就是个倒排索引,每s都会生成一个segment文件。
76+
77+
当文件过多时,ES会自动segment merge(合并文件),合并时会同时将已标注删除的文档物理删除。
78+
79+
### commit point
80+
81+
记录当前所有可用的segment,每个commit point都会维护一个.del文件(ES删除数据本质不属于物理删除)。
82+
83+
当ES删改操作时,先在.del文件声明某个document已被删除,文件内记录了在某个segment内某个文档已被删除。
84+
85+
当查询请求过来时,在segment中被删除的文件是能够查出来的,但当返回结果时会根据commit point维护的那个.del文件,将已删除的文档过滤。
86+
87+
### translog日志文件
88+
89+
为防止ES宕机造成数据丢失保证可靠存储,ES会将每次写入数据同时写到translog日志。
90+
91+
## 5 Elasticsearch的适用场景
92+
93+
- 维基百科,类似百度百科
94+
- The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
95+
- Stack Overflow
96+
- GitHub(开源代码管理),搜索上千亿行代码
97+
- 电商网站,检索商品
98+
- 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana)
99+
- 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
100+
- BI系统,商业智能,Business Intelligence。如大型商场集团,BI分析某区域最近3年用户消费金额趋势及用户群体组成构成,产出相关的数张报表,xx区最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化
101+
- 国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
102+
103+
## 6 特点
104+
105+
(1)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据,服务大公司;也可以运行在单机上,服务小公司
106+
(2)不是新技术,主要将全文检索、数据分析以及分布式技术合并,才形成独一无二ES;lucene(全文检索),商用的数据分析软件(也是有的),分布式数据库(mycat)
107+
(3)对用户开箱即用,简单,作为中小型应用,直接3min部署ES,就可作为生产环境系统来使用,数据量不大,操作不太复杂
108+
(4)数据库的功能面对很多领域不够用;特殊的功能,比如全文检索,同义词处理,相关度排名,复杂数据分析,海量数据的近实时处理;Elasticsearch作为传统数据库的一个补充
109+
110+
## 7 功能
111+
112+
### 7.1 分布式的搜索引擎和数据分析引擎
113+
114+
搜索:百度,网站的站内搜索,IT系统的检索
115+
数据分析:电商网站,最近7天牙膏这种商品销量排名前10的商家有哪些;新闻网站,最近1个月访问量排名前3的新闻版块是哪些
116+
分布式,搜索,数据分析
117+
118+
### 7.2 全文检索,结构化检索,数据分析
119+
120+
全文检索:我想搜索商品名称包含牙膏的商品
121+
122+
```sql
123+
select * from products where product_name like "%牙膏%"
124+
```
125+
126+
结构化检索:搜索商品分类为日化用品的商品
127+
128+
```sql
129+
select * from products where category_id='日化用品'
130+
```
131+
132+
部分匹配、自动完成、搜索纠错、搜索推荐
133+
数据分析:分析每个商品分类下有多少个商品
134+
135+
```sql
136+
select category_id,count(*) from products group by category_id
137+
```
138+
139+
### 7.3 对海量数据进行近实时处理
140+
141+
- 分布式:ES可自动将海量数据分散到多台服务器,去存储和检索。
142+
- 海量数据处理:分布式后,就可采用大量服务器去存储和检索数据,实现海量数据的处理
143+
- 近实时:检索个数据要花费1h(这就不要近实时,离线批处理,batch-processing)。在秒级别对数据进行搜索和分析
144+
145+
跟分布式/海量数据相反的:lucene,单机应用,只能在单台服务器上使用,最多只能处理单台服务器可以处理的数据量。
146+
147+
## 8 意义
148+
149+
![](https://img-blog.csdnimg.cn/20191022114857908.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_SmF2YUVkZ2U=,size_1,color_FFFFFF,t_70)
150+
151+
152+
使用 lucene 开发搜索服务,部署在一台机器上面,但是无法解决当数据量增大的时候出现的问题(图上右侧)。对此,ES就是利器:
153+
154+
- 自动维护数据的分布到多个节点的索引建立、检索请求分布到多个节点的执行
155+
- 自动维护数据的冗余副本,保证一些机器宕机了,不会丢失任何数据
156+
- 更多高级功能
157+
- 复杂搜索功能,聚合分析的功能,基于地理位置的搜索(距离我当前位置 1公里 以内的烤肉店)

docs/md/java/JVM专栏概述.md

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# JVM专栏概述
2+
3+
## 0 为啥要学习JVM专栏?
4+
5+
### 每个Java程序都离不开JVM
6+
7+
你玩得转么?学JVM不需要理由,不学JVM才需要理由!
8+
9+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240319145348823.png)
10+
11+
### 打通JVM理论与实践,构建完整JVM知识体系
12+
13+
JVM是中高级Java开发工程师深入理解Java代码的关键,也是Java面试的重要考核部分
14+
15+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240319145447438.png)
16+
17+
### 基础-进阶-实战
18+
19+
迅速提升Java开发经验,掌握JVM调优高效操作技术
20+
21+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240319145518816.png)
22+
23+
### JVM实战项目
24+
25+
实际工作中怎么调优,做一遍你就懂了。结合专栏中的JVM技术点,在项目中实现性能监控与优化的企业级调优
26+
27+
- Java 工程师进阶加薪必修课
28+
- 4 大模块全方位拆解 JVM
29+
- 帮助你编写高效 Java 代码
30+
- 揭秘 Oracle 最新 Java 黑科技
31+
32+
## 2 专栏介绍
33+
34+
作为开发工程师,你也许会在日常编程中被 Java 的启动性能和内存耗费所震惊,继而对 Java 语言产生怀疑;或许在使用虚拟机遇见内存溢出等一系列异常时头疼万分,困扰于为什么会出现各种问题。
35+
36+
和语言朝夕相处的开发者们,提及代码的详细运行过程也难免会一时语塞。这都是由于 Java 虚拟机封装得太好,让使用者几乎感觉不到它的存在。虽然这种“一次编写,到处运行”优势颇多,但是却也让我们忽略了学习 Java 虚拟机的必要。
37+
38+
熟知 Java 虚拟机的工作原理可以大幅提升日常编程的效率,对寻常 Bug 的修复更是轻而易举。同时,这也是 Java 技术的重要组成成分之一,是实现技术进阶必不可缺的知识。
39+
40+
本专栏通过揭秘 Java 虚拟机的工作原理,详细阐述 Java 程序是如何被执行并且被优化的。介绍的内容并不限于某一个版本,从 8 到 21 都会涉及。通过学习此专栏,你将了解如何编写高效的代码,如何对 Bug 达到最优处理,以及如何针对自己的应用调整虚拟机的运行参数。
41+
42+
本课程从源码到运行、类加载,再到内存分配和垃圾回收,以及JVM调优的技巧与实战。理论-实战-面试三结合,带你剖析整个JVM知识体系,一次性学习,解决JVM问题。
43+
44+
专栏分四大模块。
45+
46+
### 模块一 Java 虚拟机基本原理
47+
48+
剖析 Java 虚拟机的运行机制,逐次介绍 Java 虚拟机的设计决策以及工程实现。
49+
50+
### 模块二 高效编译
51+
52+
在本模块中,作者将带你探索 Java 编译器,以及内嵌于 Java 虚拟机中的即时编译器,帮助你更好地理解 Java 语言特性,继而写出简洁高效的代码。
53+
54+
### 模块三 代码优化
55+
56+
在实践过程中我们经常会遇到形形色色的性能问题,解决方法不外乎加机器加内存。本模块将介绍上述方法失效后的 Plan B,即如何利用工具定位并解决代码中的潜在问题,以及在已有工具不适用的情况下,如何打造专属轮子。此外,本模块还将介绍对 JVM 内存管理失去信心的开发者所选取的解决方案,以备不时之需。
57+
58+
### 模块四 虚拟机黑科技
59+
60+
当一门程序语言成熟稳定后,技术大神们便热衷于用这种语言开发实现编译器或虚拟机。在 Java 10 中,Graal 已作为试验性即时编译器一同发布。本模块将详细科普 GraalVM 的各个组成部分,其中包括编译器 Graal,语言实现框架 Truffle,以及支持 Ahead-of-Time(AOT)编译的 SubstrateVM。
61+
62+
## 3 专栏大纲
63+
64+
65+
66+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/image-20240319150736471.png)
67+
68+
## 4 适合人群
69+
70+
- 希望了解底层 Java 虚拟机实现的开发者
71+
- 有一定 Java 基础,希望达成技术进阶的 Java 工程师
72+
- 希望在面试中对答如流的 Java 语言应聘者,以及希望考倒应聘者的面试官们
73+
- 想要了解 Oracle GraalVM 黑科技,或考虑借此技术转型的开发人员

docs/md/java/core/todo.md

Whitespace-only changes.

docs/md/java/develop-jvm/todo.md

Whitespace-only changes.

docs/md/java/interview/todo.md

Whitespace-only changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 并发编程实战专栏概述
2+
3+
## 1 你将获得
4+
5+
- 全面了解并发编程核心原理;
6+
- 深入掌握 12 个 Java 并发工具类;
7+
- 搞懂 9 种最常见的并发设计模式;
8+
- 4 大经典并发编程实战案例。
9+
10+
## 2 专栏介绍
11+
12+
对于一个 Java 程序员而言,**能否熟练掌握并发编程是判断他优秀与否的重要标准之一**。因为并发编程是 Java 语言中最为晦涩的知识点,它涉及操作系统、内存、CPU、编程语言等多方面的基础能力,更为考验一个程序员的内功。
13+
14+
那到底应该怎么学习并发编程呢?Java SDK 的并发工具包有很多,是要死记硬背每一个工具的优缺点和使用场景吗?当然不是,想要学好并发编程,你需要从一个个单一的知识和技术中“跳出来”,高屋建瓴地看问题,并逐步建立自己的知识体系。
15+
16+
本专栏希望能够帮助你建立起一张处理并发问题的全景图,让你能够彻底理解并发问题的本质所在。同时,专栏还会深入介绍 Java 并发编程技术背后的逻辑关系以及应用场景,助你能够游刃有余地游走在这些技术之中。
17+
18+
5 大模块。
19+
20+
**1. 并发理论基础**
21+
这个模块主要介绍并发编程相关的概念和理论。但不会死板地堆叠结论,而是关注具体概念和理论的产生背景,挖掘它们背后的逻辑关系,发现核心矛盾并寻找解决方案。比如,深度认识 Java 内存模型、死锁产生的原因和解决方案、线程间的协作机制,等等。
22+
23+
**2. 并发工具类**
24+
这个模块主要探讨 Java SDK 里的并发工具类。这些工具类大部分都是基于管程实现的,所以这里会首先介绍隐藏在并发包中的管程及其使用。紧接着还会为你详细解读信号量、读写锁、CountDownLatch 和 CyclicBarrier,以及并发编程的三个核心问题“分工”“同步”“互斥”相关的技术内容。
25+
26+
**3. 并发设计模式**
27+
并发设计模式是解决并发问题的最佳实践。这个模块将会介绍 9 种常见的设计模式。其中,前 3 种设计模式的核心思想是避免共享变量,从而避免并发问题;后面 6 种设计模式则都属于典型的分工模式。
28+
29+
**4. 案例分析**
30+
这个模块着重分析 4 个经典的开源框架是如何处理并发问题的,包括高性能限流器 Guava RateLimiter、高性能网络应用框架 Netty、高性能队列 Disruptor、高性能数据库连接池 HiKariCP,希望能够帮你融会贯通相关知识点,并从实战场景中思考问题的最优解。
31+
32+
**5. 其他并发模型**
33+
34+
并发问题是一个通用问题,Java 语言解决并发问题采用的是共享内存模型,但这个模型并不是解决并发问题唯一的模型。这个模块将会介绍共享内存模型之外的模型,主要有 Actor 模型、软件事务内存、协程和 CSP 模型。
35+
36+
## 3 专栏大纲
37+
38+
![](https://codeselect.oss-cn-shanghai.aliyuncs.com/d513beec13a20d5e858257313b3605c0.jpg)

0 commit comments

Comments
 (0)