Skip to content

Commit 0039e72

Browse files
committed
[docs update]进一步完善CompletableFuture 详解
1 parent 5782cb1 commit 0039e72

File tree

6 files changed

+267
-40
lines changed

6 files changed

+267
-40
lines changed

docs/cs-basics/data-structure/bloom-filter.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ tag:
55
- 数据结构
66
---
77

8-
海量数据处理以及缓存穿透这两个场景让我认识了 布隆过滤器 ,我查阅了一些资料来了解它,但是很多现成资料并不满足我的需求,所以就决定自己总结一篇关于布隆过滤器的文章。希望通过这篇文章让更多人了解布隆过滤器,并且会实际去使用它!
8+
布隆过滤器相信大家没用过的话,也已经听过了。
99

10-
下面我们将分为几个方面来介绍布隆过滤器:
10+
布隆过滤器主要是为了解决海量数据的存在性问题。对于海量数据中判定某个数据是否存在且容忍轻微误差这一场景(比如缓存穿透、海量数据去重)来说,非常适合。
11+
12+
文章内容概览:
1113

1214
1. 什么是布隆过滤器?
1315
2. 布隆过滤器的原理介绍。
@@ -20,7 +22,7 @@ tag:
2022

2123
首先,我们需要了解布隆过滤器的概念。
2224

23-
布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
25+
布隆过滤器(Bloom Filter,BF)是一个叫做 Bloom 的老哥于 1970 年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。
2426

2527
Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
2628

docs/database/mysql/mysql-index.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -180,11 +180,11 @@ MySQL 8.x 中实现的索引新特性:
180180

181181
PS: 不懂的同学可以暂存疑,慢慢往下看,后面会有答案的,也可以自行搜索。
182182

183-
1. **唯一索引(Unique Key)**唯一索引也是一种约束。**唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。** 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
184-
2. **普通索引(Index)****普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。**
185-
3. **前缀索引(Prefix)**前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小,
183+
1. **唯一索引(Unique Key)**:唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 NULL,一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率。
184+
2. **普通索引(Index)**:普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和 NULL。
185+
3. **前缀索引(Prefix)**:前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小,
186186
因为只取前几个字符。
187-
4. **全文索引(Full Text)**全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
187+
4. **全文索引(Full Text)**:全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
188188

189189
二级索引:
190190

@@ -228,8 +228,8 @@ PS: 不懂的同学可以暂存疑,慢慢往下看,后面会有答案的,
228228

229229
**缺点**
230230

231-
- **依赖于有序的数据**跟聚簇索引一样,非聚簇索引也依赖于有序的数据
232-
- **可能会二次查询(回表)**这应该是非聚簇索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
231+
- **依赖于有序的数据**:跟聚簇索引一样,非聚簇索引也依赖于有序的数据
232+
- **可能会二次查询(回表)**:这应该是非聚簇索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。
233233

234234
这是 MySQL 的表的文件截图:
235235

@@ -349,7 +349,7 @@ ALTER TABLE `cus_order` ADD INDEX id_score_name(score, name);
349349

350350
### 最左前缀匹配原则
351351

352-
最左前缀匹配原则指的是,在使用联合索引时,**MySQL** 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询(如 **`>`****`<`**)才会停止匹配。对于 **`>=`****`<=`****`BETWEEN`****`like`** 前缀匹配的范围查询,并不会停止匹配。所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。
352+
最左前缀匹配原则指的是,在使用联合索引时,**MySQL** 会根据联合索引中的字段顺序,从左到右依次到查询条件中去匹配,如果查询条件中存在与联合索引中最左侧字段相匹配的字段,则就会使用该字段过滤一批数据,直至联合索引中全部字段匹配完成,或者在执行过程中遇到范围查询(如 **`>`****`<`** )才会停止匹配。对于 **`>=`****`<=`****`BETWEEN`****`like`** 前缀匹配的范围查询,并不会停止匹配。所以,我们在使用联合索引时,可以将区分度高的字段放在最左边,这也可以过滤更多数据。
353353

354354
相关阅读:[联合索引的最左匹配原则全网都在说的一个错误结论](https://mp.weixin.qq.com/s/8qemhRg5MgXs1So5YCv0fQ)
355355

docs/high-performance/message-queue/rabbitmq-questions.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ PS:也可能直接问什么是消息队列?消息队列就是一个使用队
2525
## RabbitMQ 特点?
2626

2727
- **可靠性**: RabbitMQ 使用一些机制来保证可靠性, 如持久化、传输确认及发布确认等。
28-
- **灵活的路由** : 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个 交换器绑定在一起, 也可以通过插件机制来实现自己的交换器。
28+
- **灵活的路由** : 在消息进入队列之前,通过交换器来路由消息。对于典型的路由功能, RabbitMQ 己经提供了一些内置的交换器来实现。针对更复杂的路由功能,可以将多个交换器绑定在一起, 也可以通过插件机制来实现自己的交换器。
2929
- **扩展性**: 多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展 集群中节点。
3030
- **高可用性** : 队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队 列仍然可用。
3131
- **多种协议**: RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP, MQTT 等多种消息 中间件协议。

docs/interview-preparation/resume-guide.md

+22-10
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ icon: jianli
2626
- 一般情况下你的简历上注明你会的东西才会被问到(Java 基础、集合、并发、MySQL、Redis 、Spring、Spring Boot 这些算是每个人必问的),比如写了你熟练使用 Redis,那面试官就很大概率会问你 Redis 的一些问题,再比如你写了你在项目中使用了消息队列,那面试官大概率问很多消息队列相关的问题。
2727
- 技能熟练度在很大程度上也决定了面试官提问的深度。
2828

29-
在不夸大自己能力的情况下,写出一份好的简历也是一项很棒的能力。
29+
在不夸大自己能力的情况下,写出一份好的简历也是一项很棒的能力。一般情况下,技术能力和学习能力比较厉害的,写出来的简历也比较棒!
3030

3131
## 简历模板
3232

@@ -36,13 +36,13 @@ icon: jianli
3636

3737
下面是我收集的一些还不错的简历模板:
3838

39-
- 适合中文的简历模板收集(推荐,免费):<https://github.com/dyweb/awesome-resume-for-chinese>
40-
- 木及简历(部分收费) : <https://www.mujicv.com/>
41-
- 简单简历(付费):<https://easycv.cn/>
42-
- 站长简历:<https://jianli.chinaz.com/>
39+
- 适合中文的简历模板收集(推荐,开源免费):<https://github.com/dyweb/awesome-resume-for-chinese>
40+
- 木及简历(推荐,部分免费) : <https://www.mujicv.com/>
41+
- 简单简历(推荐,部分免费):<https://easycv.cn/>
42+
- 极简简历(免费): <https://www.polebrief.com/index>
43+
- Markdown 简历排版工具(开源免费):<https://resume.mdnice.com/>
44+
- 站长简历(收费,支持AI生成):<https://jianli.chinaz.com/>
4345
- typora+markdown+css 自定义简历模板 :<https://github.com/Snailclimb/typora-markdown-resume>
44-
- 极简简历 : <https://www.polebrief.com/index>
45-
- Markdown 简历排版工具:<https://resume.mdnice.com/>
4646
- 超级简历(部分收费) : <https://www.wondercv.com/>
4747

4848
上面这些简历模板大多是只有 1 页内容,很难展现足够的信息量。如果你不是顶级大牛(比如 ACM 大赛获奖)的话,我建议还是尽可能多写一点可以突出你自己能力的内容(校招生 2 页之内,社招生 3 页之内,记得精炼语言,不要过多废话)。
@@ -53,6 +53,10 @@ icon: jianli
5353
- 技术名词最好规范大小写比较好,比如 java->Java ,spring boot -> Spring Boot 。这个虽然有些面试官不会介意,但是很多面试官都会在意这个细节的。
5454
- 中文和数字英文之间加上空格的话看起来会舒服一点。
5555

56+
另外,知识星球里还有真实的简历模板可供参考,地址:<https://t.zsxq.com/12ypxGNzU> (需加入[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)获取)。
57+
58+
![](https://oss.javaguide.cn/javamianshizhibei/image-20230918073550606.png)
59+
5660
## 简历内容
5761

5862
### 个人信息
@@ -138,6 +142,8 @@ icon: jianli
138142

139143
项目介绍尽量压缩在两行之内,不需要介绍太多,但也不要随便几个字就介绍完了。
140144

145+
146+
141147
**2、技术架构直接写技术名词就行,不要再介绍技术是干嘛的了,没意义,属于无效介绍。**
142148

143149
![](https://oss.javaguide.cn/github/javaguide/interview-preparation/46c92fbc5160e65dd85c451143177144.png)
@@ -156,11 +162,17 @@ icon: jianli
156162
- 使用 xxx 技术优化了 xxx 模块,响应时间从 2s 降低到 0.2s。
157163
- ......
158164

159-
示例
165+
个人职责介绍示例
160166

161-
- 使用 Sharding-JDBC 对 MySQL 数据库进行分库分表,优化千万级大表,单表数据量保持在 500w 以下。
167+
- 基于 Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权,使用 RBAC 权限模型实现动态权限控制。
168+
- 参与项目订单模块的开发,负责订单创建、删除、查询等功能。
169+
- 整合 Canal + RocketMQ 将 MySQL 增量数据(如商品、订单数据)同步到 ES。
170+
- 排查并解决扣费模块由于扣费父任务和反作弊子任务使用同一个线程池导致的死锁问题。
171+
- 负责用户统计模块的开发,使用 CompletableFuture 并行加载后台用户统计模块的数据信息,平均相应时间从 3.5s 降低到 1s。
172+
- 使用 Sharding-JDBC 以用户 ID 后 4 位作为 Shard Key 对订单表进行分库分表,共 3 个库,每个库 2 个订单表,单表数据量保持在 500w 以下。自定义雪花算法生成订单 ID 的规则,把分片键同时作为的订单 ID 一部分,避免了额外存储订单 ID 与路由键的关系。
162173
- 热门数据(如首页、热门博客)使用 Redis+Caffeine 两级缓存,解决了缓存击穿和穿透问题,查询速度毫秒级,QPS 30w+。
163-
- 使用 CompletableFuture 优化购物车查询模块,对获取用户信息、商品详情、优惠券信息等异步 RPC 调用进行编排,响应时间从 2s 降低 0.2s。
174+
- 使用 CompletableFuture 优化购物车查询模块,对获取用户信息、商品详情、优惠券信息等异步 RPC 调用进行编排,响应时间从 2s 降低为 0.2s。
175+
- 搭建 EasyMock 服务,用于模拟第三方平台接口,方便了在网络隔离情况下的接口对接工作。
164176

165177
**4、如果你觉得你的项目技术比较落后的话,可以自己私下进行改进。重要的是让项目比较有亮点,通过什么方式就无所谓了。**
166178

0 commit comments

Comments
 (0)