1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-20 22:17:09 +08:00

Merge pull request #4 from Snailclimb/master

daily update
This commit is contained in:
shahainloong 2020-11-03 11:38:06 +08:00 committed by GitHub
commit 6cd3b85e1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 283 additions and 413 deletions

104
README.md
View File

@ -1,13 +1,14 @@
👍《JavaGuide 面试突击版》PDF 版本+3 本 PDF Java 学习手册,在公众号 **[JavaGuide](#公众号)** 后台回复“**面试突击**”即可获取。 👍推荐 [0.73折购买阿里云服务器1核2G 84元即可薅1年力度很大推荐3年新用户优惠更大非新人的话可用朋友/亲人的身份证购买)](https://www.aliyun.com/1111/pintuan-share?ptCode=MTUyNTA5NzQ1MTc4MDE0OHx8MTE0fDE%3D&userCode=hf47liqn)
👍 图解操作系统+HTTP+计算机网络的 PDF 资料[点此链接即可下载](https://cowtransfer.com/s/fbed14f0c22a4d)。 👍推荐 [在线阅读](https://snailclimb.gitee.io/javaguide) (Github 访问速度比较慢可能会导致部分图片无法刷新出来)
> 一些闲话: 👍推荐 [图解Java+操作系统+HTTP+计算机网络的 PDF 资料](#优质原创PDF资源)
>
> 1. **JavaGuide 介绍**:关于 JavaGuide 的相关介绍请看:[关于 JavaGuide 的一些说明](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok) 。PDF 版本请看:[完结撒花JavaGuide 面试突击版来啦!](./docs/javaguide面试突击版.md) 。 ## 一些闲话:
> 2. **在线阅读** :如果 Github 访问速度比较慢或者图片无法刷新出来的话,可以转移到[码云](https://gitee.com/SnailClimb/JavaGuide)查看或者[在线阅读](https://snailclimb.gitee.io/javaguide)。如果你要提交 issue 或者 pr 的话建议到 [Github](https://github.com/Snailclimb/JavaGuide) 提交。
> 1. **介绍**:关于 JavaGuide 的相关介绍请看:[关于 JavaGuide 的一些说明](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok) 。PDF 版本请看:[完结撒花JavaGuide 面试突击版来啦!](./docs/javaguide面试突击版.md) 。
>2. **PDF版本** [《JavaGuide 面试突击版》PDF 版本](#公众号) 。
> 3. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指南》](https://xiaozhuanlan.com/javainterview?rel=javaguide) ,欢迎加入[我的星球](https://wx.zsxq.com/dweb2/index/group/48418884588288)获取更多实用干货。 > 3. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试进阶指南》](https://xiaozhuanlan.com/javainterview?rel=javaguide) ,欢迎加入[我的星球](https://wx.zsxq.com/dweb2/index/group/48418884588288)获取更多实用干货。
> 4. **阿里云活动** :阿里云最近在做活动,服务器不到 10 元/月,小伙伴们搭建一个网站提高简历质量。支持国内开源做的比较好的公司![点击此链接直达活动首页。](https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=hf47liqn)
> 5. **联系我** :如要进群或者请教问题,请[联系我](#联系我) (备注来自 Github。请直入问题工作时间不回复 > 5. **联系我** :如要进群或者请教问题,请[联系我](#联系我) (备注来自 Github。请直入问题工作时间不回复
> 6. **转载须知** 以下所有文章如非文首说明皆为我Guide哥的原创转载在文首注明出处如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️ > 6. **转载须知** 以下所有文章如非文首说明皆为我Guide哥的原创转载在文首注明出处如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!⛽️
@ -98,7 +99,7 @@
- [待办](#待办) - [待办](#待办)
- [联系我](#联系我) - [联系我](#联系我)
- [捐赠支持](#捐赠支持) - [捐赠支持](#捐赠支持)
- [Contributor](#contributor) - [Contributor](#贡献者)
- [公众号](#公众号) - [公众号](#公众号)
<!-- /code_chunk_output --> <!-- /code_chunk_output -->
@ -116,9 +117,9 @@
**重要知识点详解:** **重要知识点详解:**
1. [枚举](docs/java/basis/用好Java中的枚举真的没有那么简单.md) (很重要的一个数据结构,用好枚举真的没有那么简单!) 1. [枚举](docs/java/basis/用好Java中的枚举真的没有那么简单.md) (很重要的一个数据结构,用好枚举真的没有那么简单!)
2. [Java 常见关键字总结final、static、this、super!](docs/java/basis/Java常见关键字总结:final,static,this,super.md) 2. [Java 常见关键字总结final、static、this、super!](docs/java/basis/Java常见关键字总结.md)
3. [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/什么是反射机制?反射机制的应用场景有哪些?.md) 3. [什么是反射机制?反射机制的应用场景有哪些?](docs/java/basis/反射机制.md)
4. [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/静态代理+JDK,CGLIB动态代理实战.md) 4. [代理模式详解:静态代理+JDK/CGLIB 动态代理实战](docs/java/basis/代理模式详解.md)
5. [BIO,NIO,AIO 总结 ](docs/java/basis/BIO,NIO,AIO总结.md) 5. [BIO,NIO,AIO 总结 ](docs/java/basis/BIO,NIO,AIO总结.md)
### 容器 ### 容器
@ -181,7 +182,10 @@
### 算法 ### 算法
算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:[《硬核的算法学习书籍+资源推荐》](docs/dataStructures-algorithms/算法学习资源推荐.md) 。 算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
- [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
**常见算法问题总结:** **常见算法问题总结:**
@ -418,15 +422,24 @@ CAP 也就是 Consistency一致性、Availability可用性、Partiti
## 其他 ## 其他
### 贡献者
[你可以点此链接查看JavaGuide的所有贡献者。](https://github.com/Snailclimb/JavaGuide/graphs/contributors) 感谢你们让 JavaGuide 变得更好!如果你们来到武汉一定要找我,我请你们吃饭玩耍。
*悄悄话JavaGuide 会不定时为贡献者们送福利。*
### 待办 ### 待办
- [x] Netty 总结 - [x] Netty 总结
- [ ] 数据结构总结重构 - [ ] 数据结构总结重构
- [ ] 将 JavaGuide 的基础知识部分抽出来单独弄一个 CS-Guide
### 联系我 ### 优质原创PDF资源
![个人微信](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-08/wechat3.jpeg) ![](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-2@main/%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%93%E4%B8%9A/image-20201027160348395.png)
为了避免恶意传播,微信搜“**Github掘金计划**”后台回复**“006”**即可获取。
<img src="https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-2@main/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/qrcode_for_gh_8b9b6034ac19_258.jpg" style="text-align:right"/>
### 捐赠支持 ### 捐赠支持
@ -434,67 +447,16 @@ CAP 也就是 Consistency一致性、Availability可用性、Partiti
[点击捐赠支持作者](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok) [点击捐赠支持作者](https://www.yuque.com/snailclimb/dr6cvl/mr44yt#vu3ok)
### Contributor ### 联系我
下面是笔主收集的一些对本仓库提过有价值的 pr 或者 issue 的朋友,人数较多,如果你也对本仓库提过不错的 pr 或者 issue 的话,你可以加我的微信与我联系。下面的排名不分先后! <img src="https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images-3@main/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/31603935587_.pic_hd.jpg" style="zoom:67%;" />
<a href="https://github.com/LiWenGu">
<img src="https://avatars0.githubusercontent.com/u/15909210?s=460&v=4" width="45px">
</a>
<a href="https://github.com/fanofxiaofeng">
<img src="https://avatars0.githubusercontent.com/u/3983683?s=460&v=4" width="45px">
</a>
<a href="https://github.com/fanchenggang">
<img src="https://avatars2.githubusercontent.com/u/8225921?s=460&v=4" width="45px">
</a>
<a href="https://github.com/Rustin-Liu">
<img src="https://avatars2.githubusercontent.com/u/29879298?s=400&v=4" width="45px">
</a>
<a href="https://github.com/ipofss">
<img src="https://avatars1.githubusercontent.com/u/5917359?s=460&v=4" width="45px"></a>
<a href="https://github.com/Gene1994">
<img src="https://avatars3.githubusercontent.com/u/24930369?s=460&v=4" width="45px">
</a>
<a href="https://github.com/spikesp">
<img src="https://avatars0.githubusercontent.com/u/12581996?s=460&v=4" width="45px"></a>
<a href="https://github.com/illusorycloud">
<img src="https://avatars3.githubusercontent.com/u/31980412?s=460&v=4" width="45px">
</a>
<a href="https://github.com/kinglaw1204">
<img src="https://avatars1.githubusercontent.com/u/20039931?s=460&v=4" width="45px">
</a>
<a href="https://github.com/jun1st">
<img src="https://avatars2.githubusercontent.com/u/14312378?s=460&v=4" width="45px">
</a>"
<a href="https://github.com/fantasygg">
<img src="https://avatars3.githubusercontent.com/u/13445354?s=460&v=4" width="45px">
</a>
<a href="https://github.com/debugjoker">
<img src="https://avatars3.githubusercontent.com/u/26218005?s=460&v=4" width="45px">
</a>
<a href="https://github.com/zhyank">
<img src="https://avatars0.githubusercontent.com/u/17696240?s=460&v=4" width="45px">
</a>
<a href="https://github.com/Goose9527">
<img src="https://avatars2.githubusercontent.com/u/43314997?s=460&v=4" width="45px">
</a>
<a href="https://github.com/yuechuanx">
<img src="https://avatars3.githubusercontent.com/u/19339293?s=460&v=4" width="45px">
</a>
<a href="https://github.com/cnLGMing">
<img src="https://avatars2.githubusercontent.com/u/15910705?s=460&v=4" width="45px">
</a>
<a href="https://github.com/fanchenggang">
<img src="https://avatars0.githubusercontent.com/u/20358122?s=460&v=4" width="45px">
</a>
### 公众号 ### 公众号
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号“**JavaGuide**”。
**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java 面试突击"** 即可免费领取! **《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V3.0 PDF 版本[公众号](#公众号)后台回复 **"面试突击"** 即可免费领取!
**Java 工程师必备学习资源:** 一些 Java 工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 ![我的公众号](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-08/167598cd2e17b8ec.png)
![我的公众号](https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-08/167598cd2e17b8ec.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 579 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,138 +0,0 @@
先占个坑,说一下我觉得算法这部分学习比较好的规划:
1. 未入门(对算法和基本数据结构不了解)之前建议先找一本入门书籍看;
2. 如果时间比较多可以看一下我推荐的经典部分的书籍,《算法》这本书是首要要看的,其他推荐的神书看自己时间和心情就好,不要太纠结。
3. 如果要准备面试时间比较紧的话就不需要再去看《算法》这本书了时间来不及当然你也可以选取其特定的章节查看。我也推荐了几本不错的专门为算法面试准备的书籍比如《剑指offer》和《程序员代码面试指南》。除了这两本书籍的话我在下面推荐了 Leetcode 和牛客网这两个常用的刷题网站以及一些比较好的题目资源。
## 书籍推荐
> 以下提到的部分书籍的 PDF 高清阅读版本在我的公众号“JavaGuide”后台回复“书籍”即可获取。
先来看三本入门书籍,这三本入门书籍中的任何一本拿来作为入门学习都非常好。我个人比较倾向于 **《我的第一本算法书》** 这本书籍,虽然它相比于其他两本书集它的豆瓣评分略低一点。我觉得它的配图以及讲解是这三本书中最优秀,唯一比较明显的问题就是没有代码示例。但是,我觉得这不影响它是一本好的算法书籍。因为本身下面这三本入门书籍的目的就不是通过代码来让你的算法有多厉害,只是作为一本很好的入门书籍让你进入算法学习的大门。
### 入门
![](images/我的第一本算法书.jpeg)
**[我的第一本算法书](https://book.douban.com/subject/30357170/) (豆瓣评分 7.10.2K+人评价)**
一本不那么“专业”的算法书籍。和下面两本推荐的算法书籍都是比较通俗易懂,“不那么深入”的算法书籍。我个人非常推荐,配图和讲解都非常不错!
![](images/算法图解.jpeg)
**[《算法图解》](https://book.douban.com/subject/26979890/)(豆瓣评分 8.41.5K+人评价)**
入门类型的书籍,读起来比较浅显易懂,非常适合没有算法基础或者说算法没学好的小伙伴用来入门。示例丰富,图文并茂,以让人容易理解的方式阐释了算法.读起来比较快,内容不枯燥!
![啊哈!算法](images/啊哈!算法.png)
**[啊哈!算法](https://book.douban.com/subject/25894685/) (豆瓣评分 7.70.5K+人评价)**
和《算法图解》类似的算法趣味入门书籍。
### 经典
![](images/算法-4.jpeg)
**[《算法 第四版》](https://book.douban.com/subject/10432347/)(豆瓣评分 9.30.4K+人评价)**
我在大二的时候被我们的一个老师强烈安利过自己也在当时购买了一本放在宿舍到离开大学的时候自己大概看了一半多一点。因为内容实在太多了另外这本书还提供了详细的Java代码非常适合学习 Java 的朋友来看,可以说是 Java 程序员的必备书籍之一了。
再来介绍一下这本书籍吧!这本书籍算的上是算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。
> **下面这些书籍都是经典中的经典,但是阅读起来难度也比较大,不做太多阐述,神书就完事了!推荐先看 《算法》,然后再选下面的书籍进行进一步阅读。不需要都看,找一本好好看或者找某本书的某一个章节知识点好好看。**
![](images/编程珠玑.jpeg)
**[编程珠玑](https://book.douban.com/subject/3227098/)(豆瓣评分 9.12K+人评价)**
经典名著被无数读者强烈推荐的书籍几乎是顶级程序员必看的书籍之一了。这本书的作者也非常厉害Java之父 James Gosling 就是他的学生。
很多人都说这本书不是教你具体的算法,而是教你一种编程的思考方式。这种思考方式不仅仅在编程领域适用,在其他同样适用。
![](images/算法设计手册.png)
**[《算法设计手册》](https://book.douban.com/subject/4048566/)豆瓣评分9.1 45人评价**
被 [Teach Yourself Computer Science](https://teachyourselfcs.com/) 强烈推荐的一本算法书籍。
![](images/算法导论.jpeg)
**[《算法导论》](https://book.douban.com/subject/20432061/) (豆瓣评分 9.20.4K+人评价)**
![](images/计算机程序设计艺术.png)
**[《计算机程序设计艺术第1卷](https://book.douban.com/subject/1130500/)(豆瓣评分 9.40.4K+人评价)**
### 面试
![](images/剑指Offer.png)
**[《剑指Offer》](https://book.douban.com/subject/6966465/)(豆瓣评分 8.30.7K+人评价)**
这本面试宝典上面涵盖了很多经典的算法面试题,如果你要准备大厂面试的话一定不要错过这本书。
《剑指Offer》 对应的算法编程题部分的开源项目解析:[CodingInterviews](https://github.com/gatieme/CodingInterviews)
![](images/Github-CodingInterviews.png)
![](images/程序员代码面试指南.jpeg)
**[程序员代码面试指南IT名企算法与数据结构题目最优解第2版](https://book.douban.com/subject/30422021/) (豆瓣评分 8.70.2K+人评价)**
题目相比于《剑指 offer》 来说要难很多,题目涵盖面相比于《剑指 offer》也更加全面。全书一共有将近300道真实出现过的经典代码面试题。
![](images/编程之美.jpeg)
**[编程之美](https://book.douban.com/subject/3004255/)(豆瓣评分 8.43K+人评价)**
这本书收集了约60道算法和程序设计题目这些题目大部分在近年的笔试、面试中出现过或者是被微软员工热烈讨论过。作者试图从书中各种有趣的问题出发引导读者发现问题分析问题解决问题寻找更优的解法。
## 网站推荐
我比较推荐大家可以刷一下 Leetcode ,我自己平时没事也会刷一下,我觉得刷 Leetcode 不仅是为了能让你更从容地面对面试中的手撕算法问题,更可以提高你的编程思维能力、解决问题的能力以及你对某门编程语言 API 的熟练度。当然牛客网也有一些算法题,我下面也整理了一些。
### [LeetCode](https://leetcode-cn.com/)
[如何高效地使用 LeetCode](https://leetcode-cn.com/articles/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%9C%B0%E4%BD%BF%E7%94%A8-leetcode/)
- [《程序员代码面试指南》](https://leetcode-cn.com/problemset/lcci/)
- [《剑指offer》](https://leetcode-cn.com/problemset/lcof/)
### [牛客网](https://www.nowcoder.com)
**[在线编程](https://www.nowcoder.com/activity/oj)**
- [《剑指offer》](https://www.nowcoder.com/ta/coding-interviews)
- [《程序员代码面试指南》](https://www.nowcoder.com/ta/programmer-code-interview-guide)
- [2019 校招真题](https://www.nowcoder.com/ta/2019test)
- [大一大二编程入门训练](https://www.nowcoder.com/ta/beginner-programmers)
- .......
**[大厂编程面试真题](https://www.nowcoder.com/contestRoom?filter=0&orderByHotValue=3&target=content&categories=-1&mutiTagIds=2491&page=1)**

View File

@ -159,9 +159,9 @@ select sql_no_cache count(*) from usr;
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元这个转账会涉及到两个关键操作就是将小明的余额减少1000元将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃导致小明余额减少而小红的余额没有增加这样就不对了。事务就是保证这两个关键操作要么都成功要么都要失败。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元这个转账会涉及到两个关键操作就是将小明的余额减少1000元将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃导致小明余额减少而小红的余额没有增加这样就不对了。事务就是保证这两个关键操作要么都成功要么都要失败。
### 事的四大特性(ACID) ### 事的四大特性(ACID)
![的特性](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/事务特性.png) ![的特性](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/事务特性.png)
1. **原子性Atomicity** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 1. **原子性Atomicity** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
2. **一致性Consistency** 执行事务后,数据库从一个正确的状态变化到另一个正确的状态; 2. **一致性Consistency** 执行事务后,数据库从一个正确的状态变化到另一个正确的状态;

View File

@ -30,7 +30,7 @@
### 2. 使用缓存为系统带来了什么问题 ### 2. 使用缓存为系统带来了什么问题
**软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 但是,你使用好了之后,这把剑就是好剑 **软件系统设计中没有银弹,往往任何技术的引入都像是把双刃剑。** 你使用的方式得当,就能为系统带来很大的收益。否则,只是费了精力不讨好
简单来说,为系统引入缓存之后往往会带来下面这些问题: 简单来说,为系统引入缓存之后往往会带来下面这些问题:
@ -51,17 +51,13 @@ _那本地缓存的方案有哪些呢且听 Guide 给你来说一说。_
**一JDK 自带的 `HashMap``ConcurrentHashMap` 了。** **一JDK 自带的 `HashMap``ConcurrentHashMap` 了。**
`ConcurrentHashMap` 可以看作是线程安全版本的 `HashMap` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:过期时间、淘汰机制、命中率统计这三点。 `ConcurrentHashMap` 可以看作是线程安全版本的 `HashMap` ,两者都是存放 key/value 形式的键值对。但是,大部分场景来说不会使用这两者当做缓存,因为只提供了缓存的功能,并没有提供其他诸如过期时间之类的功能。一个稍微完善一点的缓存框架至少要提供:**过期时间****淘汰机制****命中率统计**这三点。
**二: `Ehcache``Guava Cache``Spring Cache` 这三者是使用的比较多的本地缓存框架。** **二: `Ehcache``Guava Cache``Spring Cache` 这三者是使用的比较多的本地缓存框架。**
`Ehcache` 的话相比于其他两者更加重量。不过,相比于 `Guava Cache``Spring Cache` 来说, `Ehcache` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。 - `Ehcache` 的话相比于其他两者更加重量。不过,相比于 `Guava Cache``Spring Cache` 来说, `Ehcache` 支持可以嵌入到 hibernate 和 mybatis 作为多级缓存,并且可以将缓存的数据持久化到本地磁盘中、同时也提供了集群方案(比较鸡肋,可忽略)。
- `Guava Cache``Spring Cache` 两者的话比较像。`Guava` 相比于 `Spring Cache` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 `ConcurrentHashMap` 的思想有异曲同工之妙。
`Guava Cache``Spring Cache` 两者的话比较像。 - 使用 `Spring Cache` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
`Guava` 相比于 `Spring Cache` 的话使用的更多一点,它提供了 API 非常方便我们使用,同时也提供了设置缓存有效时间等功能。它的内部实现也比较干净,很多地方都和 `ConcurrentHashMap` 的思想有异曲同工之妙。
使用 `Spring Cache` 的注解实现缓存的话,代码会看着很干净和优雅,但是很容易出现问题比如缓存穿透、内存溢出。
**三: 后起之秀 Caffeine。** **三: 后起之秀 Caffeine。**
@ -69,22 +65,22 @@ _那本地缓存的方案有哪些呢且听 Guide 给你来说一说。_
本地缓存固然好,但是缺陷也很明显,比如多个相同服务之间的本地缓存的数据无法共享。 本地缓存固然好,但是缺陷也很明显,比如多个相同服务之间的本地缓存的数据无法共享。
_下面我们从为什么要有分布式缓存为接入点来正式进入 Redis 的相关问题总结。_
### 4. 为什么要有分布式缓存?/为什么不直接用本地缓存? ### 4. 为什么要有分布式缓存?/为什么不直接用本地缓存?
_我们可以把分布式缓存Distributed Cache 看作是一种内存数据库的服务它的最终作用就是提供缓存数据的服务。_ 本地的缓存的优势非常明显:**低依赖**、**轻量**、**简单**、**成本低**。
但是,本地缓存
1. **本地缓存对分布式架构支持不友好**,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
2. **本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
**我们可以把分布式缓存Distributed Cache 看作是一种内存数据库的服务,它的最终作用就是提供缓存数据的服务。**
如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。 如下图所示,就是一个简单的使用分布式缓存的架构图。我们使用 Nginx 来做负载均衡,部署两个相同的服务到服务器,两个服务使用同一个数据库和缓存。
![集中式缓存架构](./images/redis-all/集中式缓存架构.png) ![集中式缓存架构](./images/redis-all/集中式缓存架构.png)
本地的缓存的优势是低依赖,比较轻量并且通常相比于使用分布式缓存要更加简单。 2.
再来分析一下本地缓存的局限性:
1. **本地缓存对分布式架构支持不友好**,比如同一个相同的服务部署在多台机器上的时候,各个服务之间的缓存是无法共享的,因为本地缓存只在当前机器上有。
2. **本地缓存容量受服务部署所在的机器限制明显。** 如果当前系统服务所耗费的内存多,那么本地缓存可用的容量就很少。
使用分布式缓存之后,缓存部署在一台单独的服务器上,即使同一个相同的服务部署在再多机器上,也是使用的同一份缓存。 并且,单独的分布式缓存服务的性能、容量和提供的功能都要更加强大。 使用分布式缓存之后,缓存部署在一台单独的服务器上,即使同一个相同的服务部署在再多机器上,也是使用的同一份缓存。 并且,单独的分布式缓存服务的性能、容量和提供的功能都要更加强大。

View File

@ -1,95 +1,93 @@
点击关注[公众号](#公众号)及时获取笔主最新更新文章并可免费领取本文档配套的《Java 面试突击》以及 Java 工程师必备学习资源。 <!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
<!-- TOC --> <!-- code_chunk_output -->
- [1. Java 基本功](#1-java-基本功) - [1. Java 基本功](#1-java-基本功)
- [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识) - [1.1. Java 入门(基础概念与常识)](#11-java-入门基础概念与常识)
- [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点) - [1.1.1. Java 语言有哪些特点?](#111-java-语言有哪些特点)
- [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答) - [1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答](#112-关于-jvm-jdk-和-jre-最详细通俗的解答)
- [1.1.2.1. JVM](#1121-jvm) - [1.1.2.1. JVM](#1121-jvm)
- [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre) - [1.1.2.2. JDK 和 JRE](#1122-jdk-和-jre)
- [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比) - [1.1.3. Oracle JDK 和 OpenJDK 的对比](#113-oracle-jdk-和-openjdk-的对比)
- [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别) - [1.1.4. Java 和 C++的区别?](#114-java-和-c的区别)
- [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同) - [1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#115-什么是-java-程序的主类-应用程序和小程序的主类有何不同)
- [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别) - [1.1.6. import java 和 javax 有什么区别?](#116-import-java-和-javax-有什么区别)
- [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存) - [1.1.7. 为什么说 Java 语言“编译与解释并存”?](#117-为什么说-java-语言编译与解释并存)
- [1.2. Java 语法](#12-java-语法) - [1.2. Java 语法](#12-java-语法)
- [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别) - [1.2.1. 字符型常量和字符串常量的区别?](#121-字符型常量和字符串常量的区别)
- [1.2.2. 关于注释?](#122-关于注释) - [1.2.2. 关于注释?](#122-关于注释)
- [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么) - [1.2.3. 标识符和关键字的区别是什么?](#123-标识符和关键字的区别是什么)
- [1.2.4. Java中有哪些常见的关键字](#124-java中有哪些常见的关键字) - [1.2.4. Java中有哪些常见的关键字](#124-java中有哪些常见的关键字)
- [1.2.5. 自增自减运算符](#125-自增自减运算符) - [1.2.5. 自增自减运算符](#125-自增自减运算符)
- [1.2.6. continue、break、和return的区别是什么](#126-continuebreak和return的区别是什么) - [1.2.6. continue、break、和return的区别是什么](#126-continue-break-和return的区别是什么)
- [1.2.7. Java泛型了解么什么是类型擦除介绍一下常用的通配符](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符) - [1.2.7. Java泛型了解么什么是类型擦除介绍一下常用的通配符](#127-java泛型了解么什么是类型擦除介绍一下常用的通配符)
- [1.2.8. ==和equals的区别](#128-和equals的区别) - [1.2.8. ==和equals的区别](#128-和equals的区别)
- [1.2.9. hashCode()与 equals()](#129-hashcode与-equals) - [1.2.9. hashCode()与 equals()](#129-hashcode与-equals)
- [1.3. 基本数据类型](#13-基本数据类型) - [1.3. 基本数据类型](#13-基本数据类型)
- [1.3.1. Java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢) - [1.3.1. Java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢](#131-java中的几种基本数据类型是什么对应的包装类型是什么各自占用多少字节呢)
- [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱) - [1.3.2. 自动装箱与拆箱](#132-自动装箱与拆箱)
- [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池) - [1.3.3. 8种基本类型的包装类和常量池](#133-8种基本类型的包装类和常量池)
- [1.4. 方法(函数)](#14-方法函数) - [1.4. 方法(函数)](#14-方法函数)
- [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么) - [1.4.1. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#141-什么是方法的返回值返回值在类的方法里的作用是什么)
- [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递) - [1.4.2. 为什么 Java 中只有值传递?](#142-为什么-java-中只有值传递)
- [1.4.3. 重载和重写的区别](#143-重载和重写的区别) - [1.4.3. 重载和重写的区别](#143-重载和重写的区别)
- [1.4.3.1. 重载](#1431-重载) - [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝)
- [1.4.3.2. 重写](#1432-重写) - [1.4.5. 方法的四种类型](#145-方法的四种类型)
- [1.4.4. 深拷贝 vs 浅拷贝](#144-深拷贝-vs-浅拷贝)
- [1.4.5. 方法的四种类型](#145-方法的四种类型)
- [2. Java 面向对象](#2-java-面向对象) - [2. Java 面向对象](#2-java-面向对象)
- [2.1. 类和对象](#21-类和对象) - [2.1. 类和对象](#21-类和对象)
- [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别) - [2.1.1. 面向对象和面向过程的区别](#211-面向对象和面向过程的区别)
- [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override) - [2.1.2. 构造器 Constructor 是否可被 override?](#212-构造器-constructor-是否可被-override)
- [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用) - [2.1.3. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#213-在-java-中定义一个不做事且没有参数的构造方法的作用)
- [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些) - [2.1.4. 成员变量与局部变量的区别有哪些?](#214-成员变量与局部变量的区别有哪些)
- [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同) - [2.1.5. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#215-创建一个对象用什么运算符对象实体与对象引用有何不同)
- [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么) - [2.1.6. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#216-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么)
- [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性) - [2.1.7. 构造方法有哪些特性?](#217-构造方法有哪些特性)
- [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是) - [2.1.8. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?](#218-在调用子类构造方法之前会先调用父类没有参数的构造方法其目的是)
- [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同) - [2.1.9. 对象的相等与指向他们的引用相等,两者有什么不同?](#219-对象的相等与指向他们的引用相等两者有什么不同)
- [2.2. 面向对象三大特征](#22-面向对象三大特征) - [2.2. 面向对象三大特征](#22-面向对象三大特征)
- [2.2.1. 封装](#221-封装) - [2.2.1. 封装](#221-封装)
- [2.2.2. 继承](#222-继承) - [2.2.2. 继承](#222-继承)
- [2.2.3. 多态](#223-多态) - [2.2.3. 多态](#223-多态)
- [2.3. 修饰符](#23-修饰符) - [2.3. 修饰符](#23-修饰符)
- [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的) - [2.3.1. 在一个静态方法内调用一个非静态成员为什么是非法的?](#231-在一个静态方法内调用一个非静态成员为什么是非法的)
- [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同) - [2.3.2. 静态方法和实例方法有何不同](#232-静态方法和实例方法有何不同)
- [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper) - [2.3.3. 常见关键字总结:static,final,this,super](#233-常见关键字总结staticfinalthissuper)
- [2.4. 接口和抽象类](#24-接口和抽象类) - [2.4. 接口和抽象类](#24-接口和抽象类)
- [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么) - [2.4.1. 接口和抽象类的区别是什么?](#241-接口和抽象类的区别是什么)
- [2.5. 其它重要知识点](#25-其它重要知识点) - [2.5. 其它重要知识点](#25-其它重要知识点)
- [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的) - [2.5.1. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?](#251-string-stringbuffer-和-stringbuilder-的区别是什么-string-为什么是不可变的)
- [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结) - [2.5.2. Object 类的常见方法总结](#252-object-类的常见方法总结)
- [2.5.3. == 与 equals(重要)](#253--与-equals重要) - [2.5.3. == 与 equals(重要)](#253-与-equals重要)
- [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要) - [2.5.4. hashCode 与 equals (重要)](#254-hashcode-与-equals-重要)
- [2.5.4.1. hashCode介绍](#2541-hashcode介绍) - [2.5.4.1. hashCode介绍](#2541-hashcode介绍)
- [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode) - [2.5.4.2. 为什么要有 hashCode](#2542-为什么要有-hashcode)
- [2.5.4.3. hashCode与 equals的相关规定](#2543-hashcode与-equals的相关规定) - [2.5.4.3. hashCode与 equals的相关规定](#2543-hashcode与-equals的相关规定)
- [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办) - [2.5.5. Java 序列化中如果有些字段不想进行序列化,怎么办?](#255-java-序列化中如果有些字段不想进行序列化怎么办)
- [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法) - [2.5.6. 获取用键盘输入常用的两种方法](#256-获取用键盘输入常用的两种方法)
- [3. Java 核心技术](#3-java-核心技术) - [3. Java 核心技术](#3-java-核心技术)
- [3.1. 反射机制](#31-反射机制) - [3.1. 反射机制](#31-反射机制)
- [3.1.1. 静态编译和动态编译](#311静态编译和动态编译) - [3.1.1.静态编译和动态编译](#311静态编译和动态编译)
- [3.1.2. 反射机制优缺点](#312反射机制优缺点) - [3.1.2.反射机制优缺点](#312反射机制优缺点)
- [3.1.3. 反射的应用场景](#313反射的应用场景) - [3.1.3.反射的应用场景](#313反射的应用场景)
- [3.2. 异常](#32-异常)
- [3.2. 异常](#32-异常) - [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图)
- [3.2.1. Java 异常类层次结构图](#321-java-异常类层次结构图) - [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法)
- [3.2.2. Throwable 类常用方法](#322-throwable-类常用方法) - [3.2.3. try-catch-finally](#323-try-catch-finally)
- [3.2.3. try-catch-finally](#323-try-catch-finally) - [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally)
- [3.2.4. 使用 `try-with-resources` 来代替`try-catch-finally`](#324-使用-try-with-resources-来代替try-catch-finally) - [3.3. 多线程](#33-多线程)
- [3.3. 多线程](#33-多线程) - [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程-程序-进程的基本概念以及他们之间关系是什么)
- [3.3.1. 简述线程、程序、进程的基本概念。以及他们之间关系是什么?](#331-简述线程程序进程的基本概念以及他们之间关系是什么) - [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态)
- [3.3.2. 线程有哪些基本状态?](#332-线程有哪些基本状态) - [3.4. 文件与 I\O 流](#34-文件与-io-流)
- [3.4. 文件与 I\O 流](#34-文件与-io-流) - [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种)
- [3.4.1. Java 中 IO 流分为几种?](#341-java-中-io-流分为几种) - [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流)
- [3.4.1.1. 既然有了字节流,为什么还要有字符流?](#3411-既然有了字节流为什么还要有字符流) - [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别)
- [3.4.1.2. BIO,NIO,AIO 有什么区别?](#3412-bionioaio-有什么区别)
- [4. 参考](#4-参考) - [4. 参考](#4-参考)
- [5. 公众号](#5-公众号)
<!-- /TOC --> <!-- /code_chunk_output -->
## 1. Java 基本功 ## 1. Java 基本功
@ -1394,12 +1392,3 @@ Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上
- https://www.educba.com/oracle-vs-openjdk/ - https://www.educba.com/oracle-vs-openjdk/
- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top - https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top
## 5. 公众号
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
**《Java 面试突击》:** 由本文档衍生的专为面试而生的《Java 面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java 面试突击"** 即可免费领取!
**Java 工程师必备学习资源:** 一些 Java 工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png)

View File

@ -1,23 +1,23 @@
<!-- TOC --> <!-- TOC -->
- [1. 基础](#_1-基础) - [1. 基础](#1-基础)
- [1.1. 正确使用 equals 方法](#_11-正确使用-equals-方法) - [1.1. 正确使用 equals 方法](#11-正确使用-equals-方法)
- [1.2. 整型包装类值的比较](#_12-整型包装类值的比较) - [1.2. 整型包装类值的比较](#12-整型包装类值的比较)
- [1.3. BigDecimal](#_13-bigdecimal) - [1.3. BigDecimal](#13-bigdecimal)
- [1.3.1. BigDecimal 的用处](#_131-bigdecimal-的用处) - [1.3.1. BigDecimal 的用处](#131-bigdecimal-的用处)
- [1.3.2. BigDecimal 的大小比较](#_132-bigdecimal-的大小比较) - [1.3.2. BigDecimal 的大小比较](#132-bigdecimal-的大小比较)
- [1.3.3. BigDecimal 保留几位小数](#_133-bigdecimal-保留几位小数) - [1.3.3. BigDecimal 保留几位小数](#133-bigdecimal-保留几位小数)
- [1.3.4. BigDecimal 的使用注意事项](#_134-bigdecimal-的使用注意事项) - [1.3.4. BigDecimal 的使用注意事项](#134-bigdecimal-的使用注意事项)
- [1.3.5. 总结](#_135-总结) - [1.3.5. 总结](#135-总结)
- [1.4. 基本数据类型与包装数据类型的使用标准](#_14-基本数据类型与包装数据类型的使用标准) - [1.4. 基本数据类型与包装数据类型的使用标准](#14-基本数据类型与包装数据类型的使用标准)
- [2. 集合](#_2-集合) - [2. 集合](#_2-集合)
- [2.1. Arrays.asList()使用指南](#_21-arraysaslist使用指南) - [2.1. Arrays.asList()使用指南](#21-arraysaslist使用指南)
- [2.1.1. 简介](#_211-简介) - [2.1.1. 简介](#211-简介)
- [2.1.2. 《阿里巴巴Java 开发手册》对其的描述](#_212-阿里巴巴java-开发手册对其的描述) - [2.1.2. 《阿里巴巴Java 开发手册》对其的描述](#212-阿里巴巴java-开发手册对其的描述)
- [2.1.3. 使用时的注意事项总结](#_213-使用时的注意事项总结) - [2.1.3. 使用时的注意事项总结](#213-使用时的注意事项总结)
- [2.1.4. 如何正确的将数组转换为ArrayList?](#_214-如何正确的将数组转换为arraylist) - [2.1.4. 如何正确的将数组转换为ArrayList?](#214-如何正确的将数组转换为arraylist)
- [2.2. Collection.toArray()方法使用的坑&如何反转数组](#_22-collectiontoarray方法使用的坑如何反转数组) - [2.2. Collection.toArray()方法使用的坑&如何反转数组](#22-collectiontoarray方法使用的坑如何反转数组)
- [2.3. 不要在 foreach 循环里进行元素的 remove/add 操作](#_23-不要在-foreach-循环里进行元素的-removeadd-操作) - [2.3. 不要在 foreach 循环里进行元素的 remove/add 操作](#23-不要在-foreach-循环里进行元素的-removeadd-操作)
<!-- /TOC --> <!-- /TOC -->
@ -83,7 +83,7 @@ System.out.println(a.equals(b));//true
当使用自动装箱方式创建一个Integer对象时当数值在-128 ~127时会将创建的 Integer 对象缓存起来当下次再出现该数值时直接从缓存中取出对应的Integer对象。所以上述代码中x和y引用的是相同的Integer对象。 当使用自动装箱方式创建一个Integer对象时当数值在-128 ~127时会将创建的 Integer 对象缓存起来当下次再出现该数值时直接从缓存中取出对应的Integer对象。所以上述代码中x和y引用的是相同的Integer对象。
**注意:**如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 **注意:** 如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。
## 1.3. BigDecimal ## 1.3. BigDecimal

View File

Before

Width:  |  Height:  |  Size: 278 KiB

After

Width:  |  Height:  |  Size: 278 KiB

View File

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 128 KiB

View File

@ -300,7 +300,15 @@ JDK1.2 以后Java 对引用的概念进行了扩充,将引用分为强引
运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢? 运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢?
假如在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池。 ~~**JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆Heap中开辟了一块区域存放运行时常量池。**~~
> 修正([issue747](https://github.com/Snailclimb/JavaGuide/issues/747)[reference](https://blog.csdn.net/q5706503/article/details/84640762))
>
> 1. **JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代**
> 2. **JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代**
> 3. **JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace)**
假如在字符串常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"abc" 就会被系统清理出常量池了。
### 2.6 如何判断一个类是无用的类 ### 2.6 如何判断一个类是无用的类
@ -309,8 +317,8 @@ JDK1.2 以后Java 对引用的概念进行了扩充,将引用分为强引
判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 3 个条件才能算是 **“无用的类”** 判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足下面 3 个条件才能算是 **“无用的类”**
- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。 - 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。
- 加载该类的 ClassLoader 已经被回收。 - 加载该类的 `ClassLoader` 已经被回收。
- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。 - 该类对应的 `java.lang.Class` 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。 虚拟机可以对满足上述 3 个条件的无用类进行回收,这里说的仅仅是“可以”,而并不是和对象一样不使用了就会必然被回收。

View File

@ -304,14 +304,14 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
### 3.3 对象的访问定位 ### 3.3 对象的访问定位
建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种: 建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种:
1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; 1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; ![对象的访问定位-使用句柄](./pictures/java内存区域/对象的访问定位-使用句柄.png)
![对象的访问定位-使用句柄](./pictures/java内存区域/对象的访问定位-使用句柄.png)
2. **直接指针:** 如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 reference 中存储的直接就是对象的地址。 2. **直接指针:** 如果使用直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而 reference 中存储的直接就是对象的地址。
![对象的访问定位-直接指针](./pictures/java内存区域/对象的访问定位-直接指针.png) ![对象的访问定位-直接指针](./pictures/java内存区域/对象的访问定位-直接指针.png)
**这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。** **这两种对象访问方式各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。**

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

After

Width:  |  Height:  |  Size: 341 KiB

View File

@ -68,7 +68,7 @@ Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚
### 初始化 ### 初始化
初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行类构造器 `<clinit> ()`方法的过程。 初始化是类加载的最后一步,也是真正执行类中定义的 Java 程序代码(字节码),初始化阶段是执行初始化方法 `<clinit> ()`方法的过程。
对于`<clinit>` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 `<clinit>` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。 对于`<clinit>` 方法的调用,虚拟机会自己确保其在多线程环境中的安全性。因为 `<clinit>` 方法是带锁线程安全,所以在多线程环境下进行类初始化的话可能会引起死锁,并且这种死锁很难被发现。

View File

@ -172,9 +172,9 @@ public class Employee {
上述这些信息中,各个修饰符都是布尔值,要么有某个修饰符,要么没有,很适合使用标志位来表示。而字段叫什么名字、字段被定义为什么数据类型这些都是无法固定的,只能引用常量池中常量来描述。 上述这些信息中,各个修饰符都是布尔值,要么有某个修饰符,要么没有,很适合使用标志位来表示。而字段叫什么名字、字段被定义为什么数据类型这些都是无法固定的,只能引用常量池中常量来描述。
**字段的 access_flags 的取值:** **字段的 access_flag 的取值:**
![字段的access_flags的取值](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/字段的access_flags的取值.png) ![字段的 access_flag 的取值](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/JVM/image-20201031084342859.png)
### 2.7 方法表集合 ### 2.7 方法表集合
@ -193,7 +193,7 @@ Class 文件存储格式中对方法的描述与对字段的描述几乎采用
**方法表的 access_flag 取值:** **方法表的 access_flag 取值:**
![方法表的 access_flag 取值](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/方法表的access_flag的所有标志位.png) ![方法表的 access_flag 取值](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/JVM/image-20201031084248965.png)
注意:因为`volatile`修饰符和`transient`修饰符不可以修饰方法,所以方法表的访问标志中没有这两个对应的标志,但是增加了`synchronized``native``abstract`等关键字修饰方法,所以也就多了这些关键字对应的标志。 注意:因为`volatile`修饰符和`transient`修饰符不可以修饰方法,所以方法表的访问标志中没有这两个对应的标志,但是增加了`synchronized``native``abstract`等关键字修饰方法,所以也就多了这些关键字对应的标志。

View File

@ -91,7 +91,7 @@ public class ThreadPoolExecutor extends AbstractExecutorService
**`ScheduledThreadPoolExecutor` 类描述:** **`ScheduledThreadPoolExecutor` 类描述:**
```java ```java
//ScheduledExecutorService实现了ExecutorService接口 //ScheduledExecutorService继承ExecutorService接口
public class ScheduledThreadPoolExecutor public class ScheduledThreadPoolExecutor
extends ThreadPoolExecutor extends ThreadPoolExecutor
implements ScheduledExecutorService implements ScheduledExecutorService

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
docs/network/images/isp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,6 +1,9 @@
本文是我在大二学习计算机网络期间整理的, 大部分内容都来自于谢希仁老师的《计算机网络》这本书。 本文是我在大二学习计算机网络期间整理, 大部分内容都来自于谢希仁老师的《计算机网络》这本书。
为了内容更容易理解,我对之前的整理进行了一波重构,并配上了一些相关的示意图便于理解。
![](https://img-blog.csdnimg.cn/img_convert/e7177b00248e30dc49bd6061093a0590.png)
![](images/计算机网络第七版.png)
<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} --> <!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=false} -->
@ -34,9 +37,8 @@
<!-- /code_chunk_output --> <!-- /code_chunk_output -->
## 1. 计算机网络概述
![计算机网络概述](images/计算机网络概述.png) ## 1. 计算机网络概述
### 1.1. 基本术语 ### 1.1. 基本术语
@ -44,15 +46,35 @@
2. **链路link ** : 从一个结点到另一个结点的一段物理线路。中间没有任何其他交点。 2. **链路link ** : 从一个结点到另一个结点的一段物理线路。中间没有任何其他交点。
3. **主机host** :连接在因特网上的计算机。 3. **主机host** :连接在因特网上的计算机。
4. **ISPInternet Service Provider** :因特网服务提供者(提供商)。 4. **ISPInternet Service Provider** :因特网服务提供者(提供商)。
![ISP (Internet Service Provider) Definition](https://img-blog.csdnimg.cn/img_convert/b83f6951e3f8f4bcde5b227257d603a8.png)
5. **IXPInternet eXchange Point** 互联网交换点 IXP 的主要作用就是允许两个网络直接相连并交换分组,而不需要再通过第三个网络来转发分组。 5. **IXPInternet eXchange Point** 互联网交换点 IXP 的主要作用就是允许两个网络直接相连并交换分组,而不需要再通过第三个网络来转发分组。
![IXP Traffic Levels During the Stratos Skydive — RIPE Labs](https://img-blog.csdnimg.cn/img_convert/7a9568a9e94001fc110801addc8c4ec0.png)
<p style="text-align:center;font-size:13px;color:gray">https://labs.ripe.net/Members/fergalc/ixp-traffic-during-stratos-skydive</p>
6. **RFC(Request For Comments)** :意思是“请求评议”,包含了关于 Internet 几乎所有的重要的文字资料。 6. **RFC(Request For Comments)** :意思是“请求评议”,包含了关于 Internet 几乎所有的重要的文字资料。
7. **广域网 WANWide Area Network** :任务是通过长距离运送主机发送的数据。 7. **广域网 WANWide Area Network** :任务是通过长距离运送主机发送的数据。
8. **城域网 MANMetropolitan Area Network**:用来将多个局域网进行互连。 8. **城域网 MANMetropolitan Area Network**:用来将多个局域网进行互连。
9. **局域网 LANLocal Area Network** 学校或企业大多拥有多个互连的局域网。 9. **局域网 LANLocal Area Network** 学校或企业大多拥有多个互连的局域网。
![MAN & WMAN | Red de área metropolitana, Redes informaticas, Par trenzado](https://img-blog.csdnimg.cn/img_convert/25a5789f8e18995c649f2f864d51e7a9.png)
<p style="text-align:center;font-size:13px;color:gray">http://conexionesmanwman.blogspot.com/</p>
10. **个人区域网 PANPersonal Area Network** :在个人工作的地方把属于个人使用的电子设备用无线技术连接起来的网络 。 10. **个人区域网 PANPersonal Area Network** :在个人工作的地方把属于个人使用的电子设备用无线技术连接起来的网络 。
11. **端系统end system** :处在因特网边缘的部分即是连接在因特网上的所有的主机。
![Advantages and disadvantages of personal area network (PAN) - IT Release](https://img-blog.csdnimg.cn/img_convert/5c99dd6011439b1fab6cd2fece155dd5.png)
<p style="text-align:center;font-size:13px;color:gray">https://www.itrelease.com/2018/07/advantages-and-disadvantages-of-personal-area-network-pan/</p>
12. **分组packet ** :因特网中传送的数据单元。由首部 header 和数据段组成。分组又称为包,首部可称为包头。 12. **分组packet ** :因特网中传送的数据单元。由首部 header 和数据段组成。分组又称为包,首部可称为包头。
13. **存储转发store and forward ** :路由器收到一个分组,先存储下来,再检查其首部,查找转发表,按照首部中的目的地址,找到合适的接口转发出去。 13. **存储转发store and forward ** :路由器收到一个分组,先检查分组是否正确,并过滤掉冲突包错误。确定包正确后,取出目的地址,通过查找表找到想要发送的输出端口地址,然后将该包发送出去。
![](https://img-blog.csdnimg.cn/20201025142342169.gif#pic_center)
14. **带宽bandwidth** :在计算机网络中,表示在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。常用来表示网络的通信线路所能传送数据的能力。单位是“比特每秒”,记为 b/s。 14. **带宽bandwidth** :在计算机网络中,表示在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。常用来表示网络的通信线路所能传送数据的能力。单位是“比特每秒”,记为 b/s。
15. **吞吐量throughput ** :表示在单位时间内通过某个网络(或信道、接口)的数据量。吞吐量更经常地用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。吞吐量受网络的带宽或网络的额定速率的限制。 15. **吞吐量throughput ** :表示在单位时间内通过某个网络(或信道、接口)的数据量。吞吐量更经常地用于对现实世界中的网络的一种测量,以便知道实际上到底有多少数据量能够通过网络。吞吐量受网络的带宽或网络的额定速率的限制。
@ -69,13 +91,13 @@
9. 网络协议即协议,是为进行网络中的数据交换而建立的规则。计算机网络的各层以及其协议集合,称为网络的体系结构。 9. 网络协议即协议,是为进行网络中的数据交换而建立的规则。计算机网络的各层以及其协议集合,称为网络的体系结构。
10. **五层体系结构由应用层,运输层,网络层(网际层),数据链路层,物理层组成。运输层最主要的协议是 TCP 和 UDP 协议,网络层最重要的协议是 IP 协议。** 10. **五层体系结构由应用层,运输层,网络层(网际层),数据链路层,物理层组成。运输层最主要的协议是 TCP 和 UDP 协议,网络层最重要的协议是 IP 协议。**
![七层体系结构图](images/七层体系结构图.png) ![s](https://img-blog.csdnimg.cn/2020102514243717.png#pic_center)
下面的内容会介绍计算机网络的五层体系结构:**物理层+数据链路层+网络层(网际层)+运输层+应用层**。 下面的内容会介绍计算机网络的五层体系结构:**物理层+数据链路层+网络层(网际层)+运输层+应用层**。
## 2. 物理层Physical Layer ## 2. 物理层Physical Layer
![物理层](images/物理层.png) ![物理层](https://img-blog.csdnimg.cn/img_convert/4749289d6e152bab1c8a8ccfc946a797.png)
### 2.1. 基本术语 ### 2.1. 基本术语
@ -85,17 +107,28 @@
4. **单工simplex ** : 只能有一个方向的通信而没有反方向的交互。 4. **单工simplex ** : 只能有一个方向的通信而没有反方向的交互。
5. **半双工half duplex ** :通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)。 5. **半双工half duplex ** :通信的双方都可以发送信息,但不能双方同时发送(当然也就不能同时接收)。
6. **全双工full duplex** : 通信的双方可以同时发送和接收信息。 6. **全双工full duplex** : 通信的双方可以同时发送和接收信息。
7. **奈氏准则** : 在任何信道中,码元的传输的效率是有上限的,传输速率超过此上限,就会出现严重的码间串扰问题,使接收端对码元的判决(即识别)成为不可能。
8. **基带信号baseband signal** : 来自信源的信号。指没有经过调制的数字信号或模拟信号。 ![](https://img-blog.csdnimg.cn/img_convert/c5be4756d2d6f46cbb6d785d5b86faf1.png)
9. **带通频带信号bandpass signal** :把基带信号经过载波调制后,把信号的频率范围搬移到较高的频段以便在信道中传输(即仅在一段频率范围内能够通过信道),这里调制过后的信号就是带通信号。
10. **调制modulation ** : 对信号源的信息进行处理后加到载波信号上,使其变为适合在信道传输的形式的过程。 7. **失真**失去真实性主要是指接受到的信号和发送的信号不同有磨损和衰减。影响失真程度的因素1.码元传输速率 2.信号传输距离 3.噪声干扰 4.传输媒体质量
11. **信噪比signal-to-noise ratio ** : 指信号的平均功率和噪声的平均功率之比,记为 S/N。信噪比dB=10\*log10S/N
12. **信道复用channel multiplexing ** :指多个用户共享同一个信道。(并不一定是同时)。 ![](https://img-blog.csdnimg.cn/img_convert/aef3aac72e86c1ee6ccb8a91647f656c.png)
13. **比特率bit rate ** :单位时间(每秒)内传送的比特数。
14. **波特率baud rate** :单位时间载波调制状态改变的次数。针对数据信号对载波的调制速率。 8. **奈氏准则** : 在任何信道中,码元的传输的效率是有上限的,传输速率超过此上限,就会出现严重的码间串扰问题,使接收端对码元的判决(即识别)成为不可能。
15. **复用multiplexing** :共享信道的方法。 9. **香农定理** :在带宽受限且有噪声的信道中,为了不产生误差,信息的数据传输速率有上限值。
16. **ADSLAsymmetric Digital Subscriber Line ** :非对称数字用户线。 10. **基带信号baseband signal** : 来自信源的信号。指没有经过调制的数字信号或模拟信号。
17. **光纤同轴混合网HFC 网)** :在目前覆盖范围很广的有线电视网的基础上开发的一种居民宽带接入网 11. **带通频带信号bandpass signal** :把基带信号经过载波调制后,把信号的频率范围搬移到较高的频段以便在信道中传输(即仅在一段频率范围内能够通过信道),这里调制过后的信号就是带通信号。
12. **调制modulation ** : 对信号源的信息进行处理后加到载波信号上,使其变为适合在信道传输的形式的过程。
13. **信噪比signal-to-noise ratio ** : 指信号的平均功率和噪声的平均功率之比,记为 S/N。信噪比dB=10\*log10S/N
14. **信道复用channel multiplexing ** :指多个用户共享同一个信道。(并不一定是同时)。
![信道复用技术](https://img-blog.csdnimg.cn/img_convert/a4889adaad3314f882e2cfab5f382064.png)
15. **比特率bit rate ** :单位时间(每秒)内传送的比特数。
16. **波特率baud rate** :单位时间载波调制状态改变的次数。针对数据信号对载波的调制速率。
17. **复用multiplexing** :共享信道的方法。
18. **ADSLAsymmetric Digital Subscriber Line ** :非对称数字用户线。
19. **光纤同轴混合网HFC 网)** :在目前覆盖范围很广的有线电视网的基础上开发的一种居民宽带接入网
### 2.2. 重要知识点总结 ### 2.2. 重要知识点总结
@ -131,7 +164,7 @@
## 3. 数据链路层Data Link Layer ## 3. 数据链路层Data Link Layer
![数据链路层](images/数据链路层.png) ![数据链路层](https://img-blog.csdnimg.cn/img_convert/8d24d1684552fa9cc824ce72b3087637.png)
### 3.1. 基本术语 ### 3.1. 基本术语
@ -142,8 +175,11 @@
5. **MTUMaximum Transfer Uint ** :最大传送单元。帧的数据部分的的长度上限。 5. **MTUMaximum Transfer Uint ** :最大传送单元。帧的数据部分的的长度上限。
6. **误码率 BERBit Error Rate ** :在一段时间内,传输错误的比特占所传输比特总数的比率。 6. **误码率 BERBit Error Rate ** :在一段时间内,传输错误的比特占所传输比特总数的比率。
7. **PPPPoint-to-Point Protocol ** :点对点协议。即用户计算机和 ISP 进行通信时所使用的数据链路层协议。以下是 PPP 帧的示意图: 7. **PPPPoint-to-Point Protocol ** :点对点协议。即用户计算机和 ISP 进行通信时所使用的数据链路层协议。以下是 PPP 帧的示意图:
![PPP](https://user-gold-cdn.xitu.io/2018/4/1/1627f8291c6b032c?w=624&h=359&f=jpeg&s=44271) ![PPP](https://img-blog.csdnimg.cn/img_convert/298dbdeb16f98cec02c3954d8d95c1d6.png)
8. **MAC 地址Media Access Control 或者 Medium Access Control** :意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在 OSI 模型中,第三层网络层负责 IP 地址,第二层数据链路层则负责 MAC 地址。因此一个主机会有一个 MAC 地址,而每个网络位置会有一个专属于它的 IP 地址 。地址是识别某个系统的重要标识符,“名字指出我们所要寻找的资源,地址指出资源所在的地方,路由告诉我们如何到达该处。 8. **MAC 地址Media Access Control 或者 Medium Access Control** :意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在 OSI 模型中,第三层网络层负责 IP 地址,第二层数据链路层则负责 MAC 地址。因此一个主机会有一个 MAC 地址,而每个网络位置会有一个专属于它的 IP 地址 。地址是识别某个系统的重要标识符,“名字指出我们所要寻找的资源,地址指出资源所在的地方,路由告诉我们如何到达该处。
![ARP (Address Resolution Protocol) explained](https://img-blog.csdnimg.cn/img_convert/002b2e6e45d66e805008fafc310afef0.png)
9. **网桥bridge** :一种用于数据链路层实现中继,连接两个或多个局域网的网络互连设备。 9. **网桥bridge** :一种用于数据链路层实现中继,连接两个或多个局域网的网络互连设备。
10. **交换机switch ** :广义的来说,交换机指的是一种通信系统中完成信息交换的设备。这里工作在数据链路层的交换机指的是交换式集线器,其实质是一个多接口的网桥 10. **交换机switch ** :广义的来说,交换机指的是一种通信系统中完成信息交换的设备。这里工作在数据链路层的交换机指的是交换式集线器,其实质是一个多接口的网桥
@ -171,7 +207,7 @@
## 4. 网络层Network Layer ## 4. 网络层Network Layer
![网络层](images/网络层.png) ![网络层](https://img-blog.csdnimg.cn/img_convert/fbf78bdcf3db11526ac1a234a8b98234.png)
### 4.1. 基本术语 ### 4.1. 基本术语
@ -199,7 +235,7 @@
## 5. 传输层Transport Layer ## 5. 传输层Transport Layer
![传输层](images/传输层.png) ![传输层](https://img-blog.csdnimg.cn/img_convert/09eb87a29bed99775ef5bde5eb216971.png)
### 5.1. 基本术语 ### 5.1. 基本术语
@ -208,6 +244,9 @@
3. **传输层的复用与分用** :复用指发送方不同的进程都可以通过统一个运输层协议传送数据。分用指接收方的运输层在剥去报文的首部后能把这些数据正确的交付到目的应用进程。 3. **传输层的复用与分用** :复用指发送方不同的进程都可以通过统一个运输层协议传送数据。分用指接收方的运输层在剥去报文的首部后能把这些数据正确的交付到目的应用进程。
4. **TCPTransmission Control Protocol** :传输控制协议。 4. **TCPTransmission Control Protocol** :传输控制协议。
5. **UDPUser Datagram Protocol** :用户数据报协议。 5. **UDPUser Datagram Protocol** :用户数据报协议。
![TCP和UDP](https://img-blog.csdnimg.cn/img_convert/2bd5bf90676c338864807ade87b7bdea.png)
6. **端口port ** :端口的目的是为了确认对方机器是那个进程在于自己进行交互,比如 MSN 和 QQ 的端口不同,如果没有端口就可能出现 QQ 进程和 MSN 交互错误。端口又称协议端口号。 6. **端口port ** :端口的目的是为了确认对方机器是那个进程在于自己进行交互,比如 MSN 和 QQ 的端口不同,如果没有端口就可能出现 QQ 进程和 MSN 交互错误。端口又称协议端口号。
7. **停止等待协议stop-and-wait** :指发送方每发送完一个分组就停止发送,等待对方确认,在收到确认之后在发送下一个分组。 7. **停止等待协议stop-and-wait** :指发送方每发送完一个分组就停止发送,等待对方确认,在收到确认之后在发送下一个分组。
8. **流量控制** : 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。 8. **流量控制** : 就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。
@ -249,24 +288,45 @@
## 6. 应用层Application Layer ## 6. 应用层Application Layer
![应用层](./images/应用层.png) ![应用层](https://img-blog.csdnimg.cn/img_convert/3ff57c0632bc7f4017723b1d1b7d3a52.png)
### 6.1. 基本术语 ### 6.1. 基本术语
1. **域名系统DNS** DNSDomain Name System域名系统万维网上作为域名和 IP 地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。通过域名,最终得到该域名对应的 IP 地址的过程叫做域名解析或主机名解析。DNS 协议运行在 UDP 协议之上,使用端口号 53。在 RFC 文档中 RFC 2181 对 DNS 有规范说明RFC 2136 对 DNS 的动态更新进行说明RFC 2308 对 DNS 查询的反向缓存进行说明。 1. **域名系统DNS** 域名系统DNSDomain Name System将人类可读的域名 (例如www.baidu.com) 转换为机器可读的 IP 地址 (例如220.181.38.148)。我们可以将其理解为专为互联网设计的电话薄。
![](https://img-blog.csdnimg.cn/img_convert/6af26a3293530061785df50e70d53e07.png)
<p style="text-align:right;font-size:12px">https://www.seobility.net/en/wiki/HTTP_headers</p>
2. **文件传输协议FTP** FTP 是 File TransferProtocol文件传输协议的英文简称而中文简称为“文传协议”。用于 Internet 上的控制文件的双向传输。同时它也是一个应用程序Application。基于不同的操作系统有不同的 FTP 应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在 FTP 的使用当中,用户经常遇到两个概念:"下载"Download和"上传"Upload。 "下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用 Internet 语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。 2. **文件传输协议FTP** FTP 是 File TransferProtocol文件传输协议的英文简称而中文简称为“文传协议”。用于 Internet 上的控制文件的双向传输。同时它也是一个应用程序Application。基于不同的操作系统有不同的 FTP 应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在 FTP 的使用当中,用户经常遇到两个概念:"下载"Download和"上传"Upload。 "下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用 Internet 语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
![FTP工作过程](https://img-blog.csdnimg.cn/img_convert/3f1abf8adba4aa317eca69c489e3db23.png)
3. **简单文件传输协议TFTP** TFTPTrivial File Transfer Protocol,简单文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69。 3. **简单文件传输协议TFTP** TFTPTrivial File Transfer Protocol,简单文件传输协议)是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69。
4. **远程终端协议TELENET** Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用 telnet 程序,用它连接到服务器。终端使用者可以在 telnet 程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个 telnet 会话必须输入用户名和密码来登录服务器。Telnet 是常用的远程控制 Web 服务器的方法。 4. **远程终端协议TELENET** Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用 telnet 程序,用它连接到服务器。终端使用者可以在 telnet 程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个 telnet 会话必须输入用户名和密码来登录服务器。Telnet 是常用的远程控制 Web 服务器的方法。
5. **万维网WWW** WWW 是环球信息网的缩写亦作“Web”、“WWW”、“'W3'”英文全称为“World Wide Web”中文名字为“万维网”"环球网"等,常简称为 Web。分为 Web 客户端和 Web 服务器程序。WWW 可以让 Web 客户端(常用浏览器)访问浏览 Web 服务器上的页面。是一个由许多互相链接的超文本组成的系统通过互联网访问。在这个系统中每个有用的事物称为一样“资源”并且由一个全局“统一资源标识符”URI标识这些资源通过超文本传输协议Hypertext Transfer Protocol传送给用户而后者通过点击链接来获得资源。万维网联盟英语World Wide Web Consortium简称 W3C又称 W3C 理事会。1994 年 10 月在麻省理工学院MIT计算机科学实验室成立。万维网联盟的创建者是万维网的发明者蒂姆·伯纳斯-李。万维网并不等同互联网,万维网只是互联网所能提供的服务其中之一,是靠着互联网运行的一项服务。 5. **万维网WWW** WWW 是环球信息网的缩写亦作“Web”、“WWW”、“'W3'”英文全称为“World Wide Web”中文名字为“万维网”"环球网"等,常简称为 Web。分为 Web 客户端和 Web 服务器程序。WWW 可以让 Web 客户端(常用浏览器)访问浏览 Web 服务器上的页面。是一个由许多互相链接的超文本组成的系统通过互联网访问。在这个系统中每个有用的事物称为一样“资源”并且由一个全局“统一资源标识符”URI标识这些资源通过超文本传输协议Hypertext Transfer Protocol传送给用户而后者通过点击链接来获得资源。万维网联盟英语World Wide Web Consortium简称 W3C又称 W3C 理事会。1994 年 10 月在麻省理工学院MIT计算机科学实验室成立。万维网联盟的创建者是万维网的发明者蒂姆·伯纳斯-李。万维网并不等同互联网,万维网只是互联网所能提供的服务其中之一,是靠着互联网运行的一项服务。
6. **万维网的大致工作工程:** 6. **万维网的大致工作工程:**
![万维网的大致工作工程](images/计算机网络知识点总结/万维网的大致工作工程.png) ![万维网的大致工作工程](https://img-blog.csdnimg.cn/img_convert/735f55501e81898aa61b8032f7dbcb73.png)
7. **统一资源定位符URL** :统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL它包含的信息指出文件的位置以及浏览器应该怎么处理它。 7. **统一资源定位符URL** :统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL它包含的信息指出文件的位置以及浏览器应该怎么处理它。
8. **超文本传输协议HTTP** 超文本传输协议HTTPHyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。1960 年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法并称之为超文本hypertext,这成为了 HTTP 超文本传输协议标准架构的发展根基。 8. **超文本传输协议HTTP** 超文本传输协议HTTPHyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。1960 年美国人 Ted Nelson 构思了一种通过计算机处理文本信息的方法并称之为超文本hypertext,这成为了 HTTP 超文本传输协议标准架构的发展根基。
9. **代理服务器Proxy Server** 代理服务器Proxy Server是一种网络实体它又称为万维网高速缓存。 代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。代理服务器可在客户端或服务器工作,也可以在中间系统工作。
10. **简单邮件传输协议(SMTP)** : SMTPSimple Mail Transfer Protocol即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。 通过 SMTP 协议所指定的服务器,就可以把 E-mail 寄到收信人的服务器上了整个过程只要几分钟。SMTP 服务器则是遵循 SMTP 协议的发送邮件服务器,用来发送或中转发出的电子邮件。 HTTP 协议的本质就是一种浏览器与服务器之间约定好的通信格式。HTTP 的原理如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/b273efef5f2388e26414135672b00295.png)
10. **代理服务器Proxy Server** 代理服务器Proxy Server是一种网络实体它又称为万维网高速缓存。 代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。代理服务器可在客户端或服务器工作,也可以在中间系统工作。
11. **简单邮件传输协议(SMTP)** : SMTPSimple Mail Transfer Protocol即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。 通过 SMTP 协议所指定的服务器,就可以把 E-mail 寄到收信人的服务器上了整个过程只要几分钟。SMTP 服务器则是遵循 SMTP 协议的发送邮件服务器,用来发送或中转发出的电子邮件。
![一个电子邮件被发送的过程](https://img-blog.csdnimg.cn/img_convert/b16da4d4fea63de5fce53f54973967d7.png)
<p style="text-align:right;font-size:12px">https://www.campaignmonitor.com/resources/knowledge-base/what-is-the-code-that-makes-bcc-or-cc-operate-in-an-email/<p>
11. **搜索引擎** :搜索引擎Search Engine是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息在对信息进行组织和处理后为用户提供检索服务将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。 11. **搜索引擎** :搜索引擎Search Engine是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息在对信息进行组织和处理后为用户提供检索服务将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。
![搜索引擎](https://img-blog.csdnimg.cn/img_convert/68fe865a9d87de361c45f4a42d624035.png)
12. **垂直搜索引擎** :垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引擎则显得更加专注、具体和深入。 12. **垂直搜索引擎** :垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引擎则显得更加专注、具体和深入。
13. **全文索引** :全文索引技术是目前搜索引擎的关键技术。试想在 1M 大小的文件中搜索一个词,可能需要几秒,在 100M 的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。 13. **全文索引** :全文索引技术是目前搜索引擎的关键技术。试想在 1M 大小的文件中搜索一个词,可能需要几秒,在 100M 的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。
14. **目录索引** :目录索引( search index/directory),顾名思义就是将网站分门别类地存放在相应的目录中,因此用户在查询信息时,可选择关键词搜索,也可按分类目录逐层查找。 14. **目录索引** :目录索引( search index/directory),顾名思义就是将网站分门别类地存放在相应的目录中,因此用户在查询信息时,可选择关键词搜索,也可按分类目录逐层查找。

View File

@ -262,7 +262,7 @@ echo $length2 #输出5
echo ${array[2]} #输出3 echo ${array[2]} #输出3
unset array[1]# 删除下标为1的元素也就是删除第二个元素 unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5 for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5
unset arr_number; # 删除数组中的所有元素 unset array; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容 for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容
``` ```

View File

@ -64,7 +64,7 @@
🙋 **我:** 好的! 下图是 Java 内存区域,我们从 JVM 的角度来说一下线程和进程之间的关系吧! 🙋 **我:** 好的! 下图是 Java 内存区域,我们从 JVM 的角度来说一下线程和进程之间的关系吧!
> 如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下这篇文章:[《可能是把 Java 内存区域讲的最清楚的一篇文章》](<[https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F](https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java内存区域)>) > 如果你对 Java 内存区域 (运行时数据区) 这部分知识不太了解的话可以阅读一下这篇文章:[《可能是把 Java 内存区域讲的最清楚的一篇文章》](https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/Java内存区域)
![jvm运行时数据区域](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/ff96fed0e2a354bb16bbc84dcedf503a.png) ![jvm运行时数据区域](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/ff96fed0e2a354bb16bbc84dcedf503a.png)

View File

@ -1,22 +1,3 @@
<!-- MarkdownTOC -->
- [消息队列其实很简单](#消息队列其实很简单)
- [一 什么是消息队列](#一-什么是消息队列)
- [二 为什么要用消息队列](#二-为什么要用消息队列)
- [\(1\) 通过异步处理提高系统性能(削峰、减少响应所需时间)](#1-通过异步处理提高系统性能削峰减少响应所需时间)
- [\(2\) 降低系统耦合性](#2-降低系统耦合性)
- [三 使用消息队列带来的一些问题](#三-使用消息队列带来的一些问题)
- [四 JMS VS AMQP](#四-jms-vs-amqp)
- [4.1 JMS](#41-jms)
- [4.1.1 JMS 简介](#411-jms-简介)
- [4.1.2 JMS两种消息模型](#412-jms两种消息模型)
- [4.1.3 JMS 五种不同的消息正文格式](#413-jms-五种不同的消息正文格式)
- [4.2 AMQP](#42-amqp)
- [4.3 JMS vs AMQP](#43-jms-vs-amqp)
- [五 常见的消息队列对比](#五-常见的消息队列对比)
<!-- /MarkdownTOC -->
# 消息队列其实很简单 # 消息队列其实很简单
@ -24,36 +5,48 @@
## 一 什么是消息队列 ## 一 什么是消息队列
我们可以把消息队列比作是一个存放消息的容器当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQRabbitMQKafkaRocketMQ我们后面会一一对比这些消息队列。 **我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。**
另外,我们知道队列 Queue 是一种先进先出的数据结构所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3...对于消费者就会按照1,2,3...的顺序来消费。但是偶尔也会出现消息被消费的顺序不对的情况,比如某个消息消费失败又或者一个 queue 多个consumer 也会导致消息被消费的顺序不对,我们一定要保证消息被消费的顺序正确。 ![Message queue](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/message-queue-small.png)
除了上面说的消息消费顺序的问题,使用消息队列,我们还要考虑如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?......等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外需要我们保障一致性等问题。 消息队列是分布式系统中重要的组件之一。使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。
我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。
## 二 为什么要用消息队列 ## 二 为什么要用消息队列
我觉得使用消息队列主要有点好处: 我觉得使用消息队列主要有点好处:
1. 通过异步处理提高系统性能(削峰、减少响应所需时间) 1. **通过异步处理提高系统性能(减少响应所需时间)。**
2. 降低系统耦合性。 2. **削峰/限流**
3. **降低系统耦合性。**
如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。 如果在面试的时候你被面试官问到这个问题的话,一般情况是你在你的简历上涉及到消息队列这方面的内容,这个时候推荐你结合你自己的项目来回答。
《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提升。 《大型网站技术架构》第四章和第七章均有提到消息队列对应用性能及扩展性的提升。
### (1) 通过异步处理提高系统性能(削峰、减少响应所需时间) ### 2.1 通过异步处理提高系统性能(减少响应所需时间)
![通过异步处理提高系统性能](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Asynchronous-message-queue.png) ![通过异步处理提高系统性能](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/Asynchronous-message-queue.png)
如上图,**在不使用消息队列服务器的时候,用户的请求数据直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。**
通过以上分析我们可以得出**消息队列具有很好的削峰作用的功能**——即**通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。** 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
![削峰](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消息队列.png)
将用户的请求数据存储到消息队列之后就立即返回结果。随后,系统再对消息进行消费。
因为**用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败**。因此使用消息队列进行异步处理之后,需要**适当修改业务流程进行配合**,比如**用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功**,以免交易纠纷。这就类似我们平时手机订火车票和电影票。 因为**用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败**。因此使用消息队列进行异步处理之后,需要**适当修改业务流程进行配合**,比如**用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功**,以免交易纠纷。这就类似我们平时手机订火车票和电影票。
### (2) 降低系统耦合性 ### 2.2 削峰/限流
**先将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再慢慢根据自己的能力去消费这些消息,这样就避免直接把后端服务打垮掉。**
举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。如下图所示:
![削峰](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-11/削峰-消息队列.png)
### 2.3 降低系统耦合性
使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧: 使用消息队列还可以降低系统耦合性。我们知道如果模块之间不存在直接调用,那么新增模块或者修改模块就对其他模块影响较小,这样系统的可扩展性无疑更好一些。还是直接上图吧:

View File

@ -6,7 +6,7 @@
#### 固定窗口计数器算法 #### 固定窗口计数器算法
规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现给定一个变量counter来记录处理的请求数量当1分钟之内处理一个请求之后counter+11分钟之内的如果counter=100的话后续的请求就会被全部拒绝。等到 1分钟结束后将counter回归成0重新开始计数ps只要过了一个周期就讲counter回归成0 该算法规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现给定一个变量counter来记录处理的请求数量当1分钟之内处理一个请求之后counter+11分钟之内的如果counter=100的话后续的请求就会被全部拒绝。等到 1分钟结束后将counter回归成0重新开始计数ps只要过了一个周期就讲counter回归成0
这种限流算法无法保证限流速率因而无法保证突然激增的流量。比如我们限制一个接口一分钟只能访问10次的话前半分钟一个请求没有接收后半分钟接收了10个请求。 这种限流算法无法保证限流速率因而无法保证突然激增的流量。比如我们限制一个接口一分钟只能访问10次的话前半分钟一个请求没有接收后半分钟接收了10个请求。
@ -14,7 +14,7 @@
#### 滑动窗口计数器算法 #### 滑动窗口计数器算法
算的上是固定窗口计数器算法的升级版。滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:它把时间以一定比例分片。例如我们的口限流每分钟处理60个请求我们可以把 1 分钟分为60个窗口。每隔1秒移动一次每个窗口一秒只能处理 不大于 60(请求数)/60窗口数 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。 该算法算的上是固定窗口计数器算法的升级版。滑动窗口计数器算法相比于固定窗口计数器算法的优化在于:它把时间以一定比例分片。例如我们的口限流每分钟处理60个请求我们可以把 1 分钟分为60个窗口。每隔1秒移动一次每个窗口一秒只能处理 不大于 60(请求数)/60窗口数 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。
很显然:当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。 很显然:当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。
@ -32,4 +32,4 @@
![令牌桶算法](https://static001.infoq.cn/resource/image/ec/93/eca0e5eaa35dac938c673fecf2ec9a93.png) ![令牌桶算法](https://static001.infoq.cn/resource/image/ec/93/eca0e5eaa35dac938c673fecf2ec9a93.png)
### ###