1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

docs: update docs

This commit is contained in:
Mr.Hope 2023-04-28 17:12:53 +08:00
parent cf9e96aa6c
commit 7f877f8e5f
56 changed files with 285 additions and 325 deletions

View File

@ -31,7 +31,7 @@ tag:
CSDN 我就不想多说了,就一大型文章垃圾场,都是各种不规范转载,各种收费下载的垃圾资源。这号称国内流量最大的技术网站贼恶心,吃香太难看,能不用就不要用吧!
像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。
像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/be151d93cd024c6e911d1a694212d91c~tplv-k3u1fbpfcp-zoom-1.image)

View File

@ -7,18 +7,18 @@ tag:
不知不觉已经入职一个多月了,在入职之前我没有在某个公司实习过或者工作过,所以很多东西刚入职工作的我来说还是比较新颖的。学校到职场的转变,带来了角色的转变,其中的差别因人而异。对我而言,在学校的时候课堂上老师课堂上教的东西,自己会根据自己的兴趣选择性接受,甚至很多课程你不想去上的话,还可以逃掉。到了公司就不一样了,公司要求你会的技能你不得不学,除非你不想干了。在学校的时候大部分人编程的目的都是为了通过考试或者找到一份好工作,真正靠自己兴趣支撑起来的很少,到了工作岗位之后我们编程更多的是因为工作的要求,相比于学校的来说会一般会更有挑战而且压力更大。在学校的时候,我们最重要的就是对自己负责,我们不断学习知识去武装自己,但是到了公司之后我们不光要对自己负责,更要对公司负责,毕竟公司出钱请你过来,不是让你一直 on beach 的。
刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows 确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训与往年不同的是今年的培训多了中国本地班TWU-C。作为本地班的第一期学员说句心里话还是很不错。8周的培训除了工作需要用到的基本技术比如ES6、SpringBoot等等之外还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动比如Weekend Trip、 City Tour、Cake time等等。最后三周还会有一个实际的模拟项目这个项目基本和我们正式工作的实际项目差不多我个人感觉很不错。目前这个项目已经正式完成了一个迭代我觉得在做项目的过程中收获最大的不是项目中使用的技术而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训与往年不同的是今年的培训多了中国本地班TWU-C。作为本地班的第一期学员说句心里话还是很不错。8 周的培训,除了工作需要用到的基本技术比如 ES6、SpringBoot 等等之外,还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动,比如 Weekend Trip、 City Tour、Cake time 等等。最后三周还会有一个实际的模拟项目,这个项目基本和我们正式工作的实际项目差不多,我个人感觉很不错。目前这个项目已经正式完成了一个迭代,我觉得在做项目的过程中,收获最大的不是项目中使用的技术,而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责5-6个人。Trainer不定期都会给我们最近表现的 Feedback( 反馈) 我个人觉得这个并不是这是走走形式Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责 5-6 个人。Trainer 不定期都会给我们最近表现的 Feedback( 反馈) 我个人觉得这个并不是这是走走形式Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
另外ThoughtWorks 也是一家非常提倡 Feedback( 反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。
另外ThoughtWorks 也是一家非常提倡 Feedback( 反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/feedback.png)
工作之后,平时更新公众号、专栏还有维护 Github 的时间变少了。实际上,很多时候下班回来后,都有自己的时间来干自己的事情,但是自己也总是找工作太累或者时间比较零散的接口来推掉了。到了今天,翻看 Github 突然发现 14 天前别人在 Github 上给我提的 pr 我还没有处理。这一点确实是自己没有做好的地方,没有合理安排好自己的时间。实际上自己有很多想写的东西,后面会慢慢将他们提上日程。工作之后,更加发现下班后的几个小时如何度过确实很重要 ,如果你觉得自己没有完成好自己白天该做的工作的话,下班后你可以继续忙白天没有忙完的工作,如果白天的工作对于你游刃有余的话,下班回来之后,你大可去干自己感兴趣的事情,学习自己感兴趣的技术。做任何事情都要基于自身的基础,切不可好高骛远。
工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController``@Autowried``@Pathvairable``@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController``@Autowried``@Pathvairable``@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github  上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。
这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。

View File

@ -31,7 +31,7 @@ tag:
不知道其他公司的程序员是怎么样的?我感觉技术积累很大程度在乎平时,单纯依靠工作绝大部分情况只会加快自己做需求的熟练度,当然,写多了之后或多或少也会提升你对代码质量的认识(前提是你有这个意识)。
工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security+JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,Github 地址https://github.com/Snailclimb/spring-security-jwt-guide 。以次为契机,我还分享了
工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security+JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,Github 地址:<https://github.com/Snailclimb/spring-security-jwt-guide> 。以次为契机,我还分享了
- [《一问带你区分清楚 Authentication,Authorization 以及 Cookie、Session、Token》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485626&idx=1&sn=3247aa9000693dd692de8a04ccffeec1&chksm=cea24771f9d5ce675ea0203633a95b68bfe412dc6a9d05f22d221161147b76161d1b470d54b3&token=684071313&lang=zh_CN&scene=21#wechat_redirect)
- [JWT 身份认证优缺点分析以及常见问题解决方案](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485655&idx=1&sn=583eeeb081ea21a8ec6347c72aa223d6&chksm=cea2471cf9d5ce0aa135f2fb9aa32d98ebb3338292beaccc1aae43d1178b16c0125eb4139ca4&token=1737409938&lang=zh_CN#rd)
@ -53,4 +53,4 @@ tag:
**所以,我觉得技术的积累和沉淀很大程度在乎工作之外的时间(大佬和一些本身就特别厉害的除外)。**
**未来还有很长的路要走,即使再有精力也学不完你想学的所有技术,适当取舍、适当妥协,适当娱乐。**
**未来还有很长的路要走,即使再有精力也学不完你想学的所有技术,适当取舍、适当妥协,适当娱乐。**

View File

@ -5,7 +5,7 @@ tag:
- 个人经历
---
2021-03-21晚上12点肝完了我正在做的一个项目的前端的某块功能我随手打开了[我的 Github 主页](https://github.com/Snailclimb)。
2021-03-21晚上 12 点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 Github 主页](https://github.com/Snailclimb)。
好家伙!几天没注意,[JavaGuide](https://github.com/Snailclimb/JavaGuide) 这个项目直接上了 100K star。
@ -15,7 +15,7 @@ tag:
![](https://oss.javaguide.cn/github/javaguide/about-the-author/20210323132635635.png)
维护这个项目的过程中,也被某些人 diss 过“md项目没啥含金量给国人丢脸”。
维护这个项目的过程中,也被某些人 diss 过“md 项目,没啥含金量,给国人丢脸!”。
对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎!
@ -23,20 +23,20 @@ tag:
我的公号的小伙伴都是通过这个项目关注我的,趁着午休,简单复盘一下,也算是对关注这个项目的小伙伴负责。
我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
到今天2021-03-23为止这个仓库已经累计有 **2933** 次 commit累计有 **207** 位朋友参与到了项目中来。
![](https://oss.javaguide.cn/github/javaguide/about-the-author/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70.png)
累计有 **511****issue****575****pr**。所有的 pr 都已经被处理仅有15 个左右的 issue 我还未抽出时间处理。
累计有 **511****issue****575****pr**。所有的 pr 都已经被处理,仅有 15 个左右的 issue 我还未抽出时间处理。
![](https://oss.javaguide.cn/github/javaguide/about-the-author/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70-20230309224044850.png)
其实,相比于 star 数量,你看看仓库的 issue 和 pr 更能说明你的项目是否有价值。
那些到处骗 star 甚至是 刷 star 的行为,我就不多说了,有点丢人。人家觉得你的项目还不错,能提供价值,自然就给你点 star 了。
那些到处骗 star 甚至是 刷 star 的行为,我就不多说了,有点丢人。人家觉得你的项目还不错,能提供价值,自然就给你点 star 了。
**未来几年,我还是会持续完善 JavaGuide。**
**希望自己以后能开源一些有价值的轮子吧!继续加油!**
**希望自己以后能开源一些有价值的轮子吧!继续加油!**

View File

@ -5,7 +5,7 @@ tag:
- 杂谈
---
时间回到 2021-02-25我在刷哔哩哔哩的时候发现哔哩哔哩某UP主某培训机构擅自将我在知乎的一个回答做成了视频。
时间回到 2021-02-25我在刷哔哩哔哩的时候发现哔哩哔哩某 UP 主(某培训机构),擅自将我在知乎的一个回答做成了视频。
原滋原味啊!我艹。甚至,连我开头的自我调侃还加上了!真的牛皮!
@ -31,7 +31,7 @@ tag:
其他的视频就不用多看了,是否还是剽窃别人的原创,原封不动地做成视频,大家心里应该有数。
他们这样做的目的就是一个:**引流到自己的QQ群然后忽悠你买课程。**
他们这样做的目的就是一个:**引流到自己的 QQ 群,然后忽悠你买课程。**
我并不认为是这完全都是培训机构的问题。培训机构的员工为了流量而做这种恶心的事情,也导致了现在这种事情被越来越频繁地发生。
@ -69,4 +69,4 @@ tag:
大家不用担心,这都是小事,我女朋友就是学法律的,国内的某法学双一流学校。
咱不怕事!凎!!!
咱不怕事!凎!!!

View File

@ -6,7 +6,7 @@ tag:
- 个人经历
---
> 关于初高中的生活,可以看 2020年我写的[我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager.html)这篇文章。
> 关于初高中的生活,可以看 2020 年我写的[我曾经也是网瘾少年](https://javaguide.cn/about-the-author/internet-addiction-teenager.html)这篇文章。
2019 年 6 月份毕业,距今已经过去了 3 年。趁着高考以及应届生毕业之际,简单聊聊自己的大学生活。
@ -384,4 +384,4 @@ tag:
我身边专科、三本毕业就进大厂的人也比比皆是。我这句话真不是鸡汤,为了鼓励一些学校出身不太好的朋友。
**多行动,少抱怨。**
**多行动,少抱怨。**

View File

@ -45,13 +45,13 @@ category: 走近作者
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/1d38ea3b-da2a-41df-9ac4-087356e9b5b4-20200802185910087.png)
## 为什么自称 Guide哥
## 为什么自称 Guide 哥?
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide哥**。
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide 哥**。
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide哥**。
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide 哥**。
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思给大家拆解一下就清楚了。SnailClimb=Snail蜗牛+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿😁
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思给大家拆解一下就清楚了。SnailClimb=Snail蜗牛+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/37599546f3b34b92a32db579a225aa45~tplv-k3u1fbpfcp-watermark.image)

View File

@ -122,7 +122,7 @@ tag:
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
Markdown 规范请参考:**https://javaguide.cn/javaguide/contribution-guideline.html** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
Markdown 规范请参考:**<https://javaguide.cn/javaguide/contribution-guideline.html>** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
## 有没有什么写作技巧分享?
@ -170,4 +170,4 @@ Markdown 规范请参考:**https://javaguide.cn/javaguide/contribution-guideli
## 总结
总的来说,写技术博客是一件利己利彼的事情。你可能会从中收获到很多东西,你写的东西也可能对别人也有很大的帮助。但是,写技术博客还是比较耗费自己时间的,你需要和工作以及生活做好权衡。
总的来说,写技术博客是一件利己利彼的事情。你可能会从中收获到很多东西,你写的东西也可能对别人也有很大的帮助。但是,写技术博客还是比较耗费自己时间的,你需要和工作以及生活做好权衡。

View File

@ -138,4 +138,3 @@ star: 2
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款**
**星球提供的服务质量还是很高的,非常适合准备面试的同学。我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**

View File

@ -271,4 +271,4 @@ Github 上就有一些名校的计算机网络试验/Project
我上面推荐的书籍的难度还是比较高的,真心很难坚持看完。这里强烈推荐[哈工大的编译原理视频课程](https://www.icourse163.org/course/HIT-1002123007),真心不错,还是国家精品课程,关键还是又漂亮有温柔的美女老师讲的!
![](https://oss.javaguide.cn/github/javaguide/books/20210406152847824.png)
![](https://oss.javaguide.cn/github/javaguide/books/20210406152847824.png)

View File

@ -16,13 +16,11 @@ head:
![](https://oscimg.oschina.net/oscnet/up-e113c726a41874ef5fb19f7ac14e38e16ce.png)
如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
![](https://oscimg.oschina.net/oscnet/up-11de8cb239aa7201cc8d78fa28928b9ec7d.png)
Github上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom) 。
Github 上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom) 。
除了这个用 Java 写的之外,**[db_tutorial](https://github.com/cstack/db_tutorial)** 这个项目是国外的一个大佬用 C 语言写的,朋友们也可以去瞅瞅。
@ -44,7 +42,7 @@ Github上也已经有大佬用 Java 实现过一个简易的数据库,介绍
![](https://oss.javaguide.cn/github/javaguide/books/database-system-implementation.png)
不管是 MySQL 还是Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。
不管是 MySQL 还是 Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。
这本书有些地方还是翻译的比较蹩脚,有能力看英文版的还是建议上手英文版。

View File

@ -40,7 +40,7 @@ icon: "distributed-network"
![](https://oss.javaguide.cn/github/javaguide/books/In-depth-understanding-of-distributed-transactions-xiaoyu.png)
**[《深入理解分布式事务》](https://book.douban.com/subject/35626925/)** 这本书是的其中一位作者是 Apache ShenYuincubating网关创始人、Hmily、RainCat、Myth等分布式事务框架的创始人。
**[《深入理解分布式事务》](https://book.douban.com/subject/35626925/)** 这本书是的其中一位作者是 Apache ShenYuincubating网关创始人、Hmily、RainCat、Myth 等分布式事务框架的创始人。
学习分布式事务的时候,可以参考一下这本书。虽有一些小错误以及逻辑不通顺的地方,但对于各种分布式事务解决方案的介绍,总体来说还是不错的。

View File

@ -6,7 +6,7 @@ icon: "java"
## Java 基础
**[《Head First Java》](https://book.douban.com/subject/2000732/)**
**[《Head First Java》](https://book.douban.com/subject/2000732/)**
![《Head First Java》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103035793.png)
@ -18,7 +18,7 @@ icon: "java"
我个人觉得这本书还是挺适合编程新手阅读的,毕竟是 “Head First” 系列。
**[《Java 核心技术卷 1+卷 2》](https://book.douban.com/subject/34898994/)**
**[《Java 核心技术卷 1+卷 2》](https://book.douban.com/subject/34898994/)**
![《Java 核心技术卷 1》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424101217849.png)
@ -26,7 +26,7 @@ icon: "java"
我当时在大学的时候就买了两本放在寝室,没事的时候就翻翻。建议有点 Java 基础之后再读,介绍的还是比较深入和全面的,非常推荐。
**[《Java 编程思想》](https://book.douban.com/subject/2130190/)**
**[《Java 编程思想》](https://book.douban.com/subject/2130190/)**
![《Java 编程思想》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103124893.png)
@ -34,7 +34,7 @@ icon: "java"
我第一次看的时候还觉得有点枯燥,那时候还在上大二,看了 1/3 就没看下去了。
**[《Java 8实战》](https://book.douban.com/subject/26772632/)**
**[《Java 8 实战》](https://book.douban.com/subject/26772632/)**
![《Java 8实战》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103202625.png)
@ -64,7 +64,7 @@ _这本书还是非常适合我们用来学习 Java 多线程的。这本书的
这本书的质量也是非常过硬!给作者们点个赞!这本书有统一的排版规则和语言风格、清晰的表达方式和逻辑。并且每篇文章初稿写完后,作者们就会互相审校,合并到主分支时所有成员会再次审校,最后再通篇修订了三遍。
在线阅读:[https://redspider.gitbook.io/concurrent/](https://redspider.gitbook.io/concurrent/ ) 。
在线阅读:[https://redspider.gitbook.io/concurrent/](https://redspider.gitbook.io/concurrent/) 。
**[《Java 并发实现原理JDK 源码剖析》](https://book.douban.com/subject/35013531/)**
@ -78,7 +78,7 @@ _这本书还是非常适合我们用来学习 Java 多线程的。这本书的
## JVM
**[《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/)**
**[《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/)**
![《深入理解 Java 虚拟机》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/20210710104655705.png)

View File

@ -14,10 +14,10 @@ category: 计算机书籍
开源的目的是为了大家能一起完善,如果你觉得内容有任何需要完善/补充的地方,欢迎大家在项目 [issues 区](https://github.com/CodingDocs/awesome-cs/issues) 推荐自己认可的技术书籍,让我们共同维护一个优质的技术书籍精选集!
- Github 地址:[https://github.com/CodingDocs/awesome-cs](https://github.com/CodingDocs/awesome-cs)
- Gitee 地址:[https://gitee.com/SnailClimb/awesome-cs](https://gitee.com/SnailClimb/awesome-cs)
- Gitee 地址:[https://gitee.com/SnailClimb/awesome-cs](https://gitee.com/SnailClimb/awesome-cs)
如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份书单感谢
本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github掘金计划**” 后台回复“**书籍**”获取到。
本项目推荐的大部分书籍的 PDF 版本我已经整理到了云盘里,你可以在公众号“**Github 掘金计划**” 后台回复“**书籍**”获取到。
![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409153638398.png)
![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409153638398.png)

View File

@ -8,7 +8,7 @@ icon: "search"
Elasticsearch 在 Apache Lucene 的基础上开发而成,学习 ES 之前,建议简单了解一下 Lucene 的相关概念。
**[《Lucene实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。
**[《Lucene 实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。
![《Lucene实战》-实战](https://oss.javaguide.cn/github/javaguide/books/vAJkdYEyol4e6Nr.png)
@ -24,4 +24,4 @@ Elasticsearch 在 Apache Lucene 的基础上开发而成,学习 ES 之前,
如果你想进一步深入研究 Elasticsearch 原理的话,可以看看张超老师的 **[《Elasticsearch 源码解析与优化实战》](https://book.douban.com/subject/30386800/)** 这本书。这是市面上唯一一本写 Elasticsearch 源码的书。
![《Elasticsearch 源码解析与优化实战》-豆瓣](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f856485931a945639d5c23aaed74fb38~tplv-k3u1fbpfcp-zoom-1.image)
![《Elasticsearch 源码解析与优化实战》-豆瓣](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f856485931a945639d5c23aaed74fb38~tplv-k3u1fbpfcp-zoom-1.image)

View File

@ -32,7 +32,7 @@ head:
Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓是对后生的一大馈赠。
**[《Effective Java 》](https://book.douban.com/subject/30412517/)**
**[《Effective Java 》](https://book.douban.com/subject/30412517/)**
![](https://oss.javaguide.cn/github/javaguide/books/82d510c951384383b325080428af6c0a.png)
@ -128,4 +128,4 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓
最后再推荐两个相关的文档:
- **阿里巴巴 Java 开发手册** https://github.com/alibaba/p3c
- **Google Java 编程风格指南:** http://www.hawstein.com/posts/google-java-style.html
- **Google Java 编程风格指南:** http://www.hawstein.com/posts/google-java-style.html

View File

@ -115,7 +115,7 @@ ER 图由下面 3 个要素组成:
- `truncate` (清空数据) : `truncate table 表名` ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。
- `delete`(删除数据) : `delete from 表名 where 列名=值`,删除某一行的数据,如果不加 `where` 子句和`truncate table 表名`作用类似。
`truncate` 和不带 where``子句的 `delete`、以及 `drop` 都会删除表内的数据,但是 **`truncate` 和 `delete` 只删除数据不删除表的结构(定义),执行 `drop` 语句,此表的结构也会删除,也就是执行 `drop` 之后对应的表不复存在。**
`truncate` 和不带 `where`子句的 `delete`、以及 `drop` 都会删除表内的数据,但是 **`truncate``delete` 只删除数据不删除表的结构(定义),执行 `drop` 语句,此表的结构也会删除,也就是执行`drop` 之后对应的表不复存在。**
### 属于不同的数据库语言

View File

@ -5,10 +5,9 @@ tag:
- 数据库基础
---
MySQL 字符编码集中有两套 UTF-8 编码实现:**`utf8`** 和 **`utf8mb4`**。
如果使用 **`utf8`** 的话存储emoji 符号和一些比较复杂的汉字、繁体字就会出错。
如果使用 **`utf8`** 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。
为什么会这样呢?这篇文章可以从源头给你解答。
@ -65,7 +64,7 @@ GB18030 完全兼容 GB2312 和 GBK 字符集,纳入中国国内少数民族
BIG5 主要针对的是繁体中文,收录了 13000 多个汉字。
### Unicode & UTF-8编码
### Unicode & UTF-8 编码
为了更加适合本国语言,诞生了很多种字符集。
@ -73,7 +72,7 @@ BIG5 主要针对的是繁体中文,收录了 13000 多个汉字。
就比如说你使用 UTF-8 编码方式打开 GB2312 编码格式的文件就会出现乱码。示例:“牛”这个汉字 GB2312 编码后的十六进制数值为 “C5A3”而 “C5A3” 用 UTF-8 解码之后得到的却是 “ţ”。
你可以通过这个网站在线进行编码和解码https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan
你可以通过这个网站在线进行编码和解码:<https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan>
![](https://oss.javaguide.cn/github/javaguide/csdn/836c49b117ee4408871b0020b74c991d.png)
@ -140,7 +139,7 @@ CREATE TABLE `user` (
```sql
INSERT INTO `user` (`id`, `name`, `phone`, `password`)
VALUES
('A00003', 'guide哥😘😘😘', '181631312312', '123456');
('A00003', 'guide哥😘😘😘', '181631312312', '123456');
```
@ -152,9 +151,9 @@ Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'name' at row 1
## 参考
- 字符集和字符编码Charset & Encoding https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
- 十分钟搞清字符集和字符编码http://cenalulu.github.io/linux/character-encoding/
- Unicode-维基百科https://zh.wikipedia.org/wiki/Unicode
- GB2312-维基百科https://zh.wikipedia.org/wiki/GB_2312
- UTF-8-维基百科https://zh.wikipedia.org/wiki/UTF-8
- GB18030-维基百科: https://zh.wikipedia.org/wiki/GB_18030
- 字符集和字符编码Charset & Encoding <https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html>
- 十分钟搞清字符集和字符编码:<http://cenalulu.github.io/linux/character-encoding/>
- Unicode-维基百科:<https://zh.wikipedia.org/wiki/Unicode>
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>

View File

@ -19,16 +19,16 @@ NoSQL 数据库代表HBase 、Cassandra、MongoDB、Redis。
## SQL 和 NoSQL 有什么区别?
| | SQL 数据库 | NoSQL 数据库 |
| :----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档MongoDB、CouchDB键值Redis 、DynamoDB宽列Cassandra 、 HBase图表Neo4j 、 Amazon Neptune、Giraph |
| ACID 属性 | 提供原子性、一致性、隔离性和持久性 (ACID) 属性 | 通常不支持 ACID 事务,为了可扩展、高性能进行了权衡,少部分支持比如 MongoDB 。不过MongoDB 对 ACID 事务 的支持和 MySQL 还是有所区别的。 |
| 性能 | 性能通常取决于磁盘子系统。要获得最佳性能,通常需要优化查询、索引和表结构。 | 性能通常由底层硬件集群大小、网络延迟以及调用应用程序来决定。 |
| 扩展 | 垂直(使用性能更强大的服务器进行扩展)、读写分离、分库分表 | 横向(增加服务器的方式横向扩展,通常是基于分片机制) |
| 用途 | 普通企业级的项目的数据存储 | 用途广泛比如图数据库支持分析和遍历连接数据之间的关系、键值数据库可以处理大量数据扩展和极高的状态变化 |
| 查询语法 | 结构化查询语言 (SQL) | 数据访问语法可能因数据库而异 |
| | SQL 数据库 | NoSQL 数据库 |
| :----------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档MongoDB、CouchDB键值Redis 、DynamoDB宽列Cassandra 、 HBase图表Neo4j 、 Amazon Neptune、Giraph |
| ACID 属性 | 提供原子性、一致性、隔离性和持久性 (ACID) 属性 | 通常不支持 ACID 事务,为了可扩展、高性能进行了权衡,少部分支持比如 MongoDB 。不过MongoDB 对 ACID 事务 的支持和 MySQL 还是有所区别的。 |
| 性能 | 性能通常取决于磁盘子系统。要获得最佳性能,通常需要优化查询、索引和表结构。 | 性能通常由底层硬件集群大小、网络延迟以及调用应用程序来决定。 |
| 扩展 | 垂直(使用性能更强大的服务器进行扩展)、读写分离、分库分表 | 横向(增加服务器的方式横向扩展,通常是基于分片机制) |
| 用途 | 普通企业级的项目的数据存储 | 用途广泛比如图数据库支持分析和遍历连接数据之间的关系、键值数据库可以处理大量数据扩展和极高的状态变化 |
| 查询语法 | 结构化查询语言 (SQL) | 数据访问语法可能因数据库而异 |
## NoSQL 数据库有什么优势?
@ -56,4 +56,4 @@ NoSQL 数据库主要可以分为下面四种类型:
- NoSQL 是什么?- MongoDB 官方文档https://www.mongodb.com/zh-cn/nosql-explained
- 什么是 NoSQL? - AWShttps://aws.amazon.com/cn/nosql/
- NoSQL vs. SQL Databases - MongoDB 官方文档https://www.mongodb.com/zh-cn/nosql-explained/nosql-vs-sql
- NoSQL vs. SQL Databases - MongoDB 官方文档https://www.mongodb.com/zh-cn/nosql-explained/nosql-vs-sql

View File

@ -24,7 +24,6 @@ icon: "configuration"
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
@ -33,7 +32,6 @@ icon: "configuration"
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
@ -46,7 +44,6 @@ icon: "configuration"
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">

View File

@ -283,10 +283,10 @@ System.out.println("是否有第一个锁: " + lock1.isAcquiredInThisProcess());
System.out.println("是否有第二个锁: " + lock2.isAcquiredInThisProcess());
try {
// 资源操作
resource.use();
resource.use();
} finally {
System.out.println("释放多个锁");
lock.release();
lock.release();
}
System.out.println("是否有第一个锁: " + lock1.isAcquiredInThisProcess());
System.out.println("是否有第二个锁: " + lock2.isAcquiredInThisProcess());
@ -394,6 +394,3 @@ private static class LockData
## 总结
这篇文章我们介绍了分布式锁的基本概念以及实现分布式锁的两种常见方式。至于具体选择 Redis 还是 ZooKeeper 来实现分布式锁,还是要看业务的具体需求。如果对性能要求比较高的话,建议使用 Redis 实现分布式锁。如果对可靠性要求比较高的话,建议使用 ZooKeeper 实现分布式锁。

View File

@ -50,4 +50,4 @@ icon: "transanction"
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
</div>

View File

@ -21,7 +21,6 @@ category: 高可用
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
@ -30,7 +29,6 @@ category: 高可用
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
@ -43,7 +41,6 @@ category: 高可用
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">

View File

@ -28,7 +28,7 @@ category: 高可用
5. 系统用到的算法是否还需要优化?
6. 系统是否存在内存泄露的问题?
7. 项目使用的 Redis 缓存多大?服务器性能如何?用的是机械硬盘还是固态硬盘?
8. ......
8. ......
### 1.3 测试人员
@ -63,7 +63,7 @@ category: 高可用
**响应时间就是用户发出请求到用户收到系统处理结果所需要的时间。** 重要吗?实在太重要!
比较出名的 2-5-8 原则是这样描述的通常来说2到5秒页面体验会比较好5到8秒还可以接受8秒以上基本就很难接受了。另外据统计当网站慢一秒就会流失十分之一的客户。
比较出名的 2-5-8 原则是这样描述的通常来说2 5 页面体验会比较好5 8 秒还可以接受8 秒以上基本就很难接受了。另外,据统计当网站慢一秒就会流失十分之一的客户。
但是,在某些场景下我们也并不需要太看重 2-5-8 原则 ,比如我觉得系统导出导入大数据量这种就不需要,系统生成系统报告这种也不需要。
@ -85,15 +85,15 @@ category: 高可用
理清他们的概念,就很容易搞清楚他们之间的关系了。
- **QPSTPS** = 并发数/平均响应时间
- **并发数** = QPS*平均响应时间
- **并发数** = QPS\*平均响应时间
书中是这样描述 QPS 和 TPS 的区别的。
> QPS vs TPSQPS 基本类似于 TPS但是不同的是对于一个页面的一次访问形成一个TPS但一次页面请求可能产生多次对服务器的请求服务器对这些请求就可计入“QPS”之中。如访问一个页面会请求服务器2次一次访问产生一个“T”产生2个“Q”。
> QPS vs TPSQPS 基本类似于 TPS但是不同的是对于一个页面的一次访问形成一个 TPS但一次页面请求可能产生多次对服务器的请求服务器对这些请求就可计入“QPS”之中。如访问一个页面会请求服务器 2 一次访问产生一个“T”产生 2 个“Q”。
### 3.4 性能计数器
**性能计数器是描述服务器或者操作系统的一些数据指标如内存使用、CPU使用、磁盘与网络I/O等情况。**
**性能计数器是描述服务器或者操作系统的一些数据指标如内存使用、CPU 使用、磁盘与网络 I/O 等情况。**
### 四 几种常见的性能测试
@ -127,13 +127,13 @@ category: 高可用
1. Jmeter Apache JMeter 是 JAVA 开发的性能测试工具。
2. LoadRunner一款商业的性能测试工具。
3. Galtling 一款基于Scala 开发的高性能服务器性能测试工具。
3. Galtling :一款基于 Scala 开发的高性能服务器性能测试工具。
4. ab :全称为 Apache Bench 。Apache 旗下的一款测试工具,非常实用。
### 5.2 前端常用
1. Fiddler抓包工具它可以修改请求的数据甚至可以修改服务器返回的数据功能非常强大是Web 调试的利器。
2. HttpWatch: 可用于录制HTTP请求信息的工具。
1. Fiddler抓包工具它可以修改请求的数据甚至可以修改服务器返回的数据功能非常强大 Web 调试的利器。
2. HttpWatch: 可用于录制 HTTP 请求信息的工具。
## 六 常见的性能优化策略

View File

@ -41,4 +41,4 @@ category: 高可用
- [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg)
- [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ)
不过,这些文章大多也都是在介绍概念知识。目前,网上还缺少真正介绍具体要如何去实践落地异地多活架构的资料。
不过,这些文章大多也都是在介绍概念知识。目前,网上还缺少真正介绍具体要如何去实践落地异地多活架构的资料。

View File

@ -38,7 +38,7 @@ category: 高可用
没有银弹!超时值具体该设置多大,还是要根据实际项目的需求和情况慢慢调整优化得到。
更上一层,参考[美团的Java线程池参数动态配置](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)思想,我们也可以将超时弄成可配置化的参数而不是固定的,比较简单的一种办法就是将超时的值放在配置中心中。这样的话,我们就可以根据系统或者服务的状态动态调整超时值了。
更上一层,参考[美团的 Java 线程池参数动态配置](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)思想,我们也可以将超时弄成可配置化的参数而不是固定的,比较简单的一种办法就是将超时的值放在配置中心中。这样的话,我们就可以根据系统或者服务的状态动态调整超时值了。
## 重试机制
@ -68,4 +68,3 @@ category: 高可用
- 微服务之间调用超时的设置治理https://www.infoq.cn/article/eyrslar53l6hjm5yjgyx
- 超时、重试和抖动回退https://aws.amazon.com/cn/builders-library/timeouts-retries-and-backoff-with-jitter/

View File

@ -63,7 +63,7 @@ head:
### 如何找到最合适的 CDN 节点?
GSLB Global Server Load Balance全局负载均衡是 CDN 的大脑负责多个CDN节点之间相互协作最常用的是基于 DNS 的 GSLB。
GSLB Global Server Load Balance全局负载均衡是 CDN 的大脑,负责多个 CDN 节点之间相互协作,最常用的是基于 DNS 的 GSLB。
CDN 会通过 GSLB 找到最合适的 CDN 节点,更具体点来说是下面这样的:
@ -92,15 +92,15 @@ CDN 服务提供商几乎都提供了这种比较基础的防盗链机制。
通常情况下,我们会配合其他机制来确保静态资源被盗用,一种常用的机制是 **时间戳防盗链** 。相比之下,**时间戳防盗链** 的安全性更强一些。时间戳防盗链加密的 URL 具有时效性,过期之后就无法再被允许访问。
时间戳防盗链的 URL 通常会有两个参数一个是签名字符串,一个是过期时间。签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。
时间戳防盗链的 URL 通常会有两个参数一个是签名字符串,一个是过期时间。签名字符串一般是通过对用户设定的加密字符串、请求路径、过期时间通过 MD5 哈希算法取哈希的方式获得。
时间戳防盗链 URL示例
时间戳防盗链 URL 示例:
```
http://cdn.wangsu.com/4/123.mp3? wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTime=1601026312
```
- `wsSecret` :签名字符串。
- `wsSecret` :签名字符串。
- `wsTime`: 过期时间。
![](https://oss.javaguide.cn/github/javaguide/high-performance/cdn/timestamp-anti-theft.png)
@ -120,9 +120,6 @@ http://cdn.wangsu.com/4/123.mp3? wsSecret=79aead3bd7b5db4adeffb93a010298b5&wsTim
## 参考
- 时间戳防盗链 - 七牛云 CDNhttps://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention
- CDN是个啥玩意一文说个明白https://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw
- 《透视 HTTP 协议》- 37 | CDN加速我们的网络服务http://gk.link/a/11yOG
- 时间戳防盗链 - 七牛云 CDN<https://developer.qiniu.com/fusion/kb/1670/timestamp-hotlinking-prevention>
- CDN 是个啥玩意?一文说个明白:<https://mp.weixin.qq.com/s/Pp0C8ALUXsmYCUkM5QnkQw>
- 《透视 HTTP 协议》- 37 | CDN加速我们的网络服务<http://gk.link/a/11yOG>

View File

@ -158,7 +158,7 @@ Nginx 就是最常用的反向代理服务器,它可以将接收到的客户
**Netflix Ribbon** 和 **Spring Cloud Load Balancer** 就是目前 Java 生态最流行的两个负载均衡组件。
Ribbon 是老牌负载均衡组件,由 Netflix 开发,功能比较全面,支持的负载均衡策略也比较多。 Spring Cloud Load Balancer 是 Spring 官方为了取代 Ribbon 而推出的,功能相对更简单一些,支持的负载均衡也少一些。
Ribbon 是老牌负载均衡组件,由 Netflix 开发,功能比较全面,支持的负载均衡策略也比较多。 Spring Cloud Load Balancer 是 Spring 官方为了取代 Ribbon 而推出的,功能相对更简单一些,支持的负载均衡也少一些。
Ribbon 支持的 7 种负载均衡策略:
@ -170,7 +170,7 @@ Ribbon 支持的 7 种负载均衡策略:
- `AvailabilityFilteringRule` :可用敏感性策略(先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例)
- `ZoneAvoidanceRule` :区域敏感性策略(根据服务所在区域的性能和服务的可用性来选择服务实例)
Spring Cloud Load Balancer 支持的 2 种负载均衡策略:
Spring Cloud Load Balancer 支持的 2 种负载均衡策略:
- `RandomLoadBalancer` :随机策略
- `RoundRobinLoadBalancer`(默认) :轮询策略
@ -189,7 +189,7 @@ public class CustomLoadBalancerConfiguration {
}
```
不过Spring Cloud Load Balancer 支持的负载均衡策略其实不止这两种,`ServiceInstanceListSupplier` 的实现类同样可以让其支持类似于 Ribbon 的负载均衡策略。这个应该是后续慢慢完善引入的,不看官方文档还真发现不了,所以说阅读官方文档真的很重要!
不过Spring Cloud Load Balancer 支持的负载均衡策略其实不止这两种,`ServiceInstanceListSupplier` 的实现类同样可以让其支持类似于 Ribbon 的负载均衡策略。这个应该是后续慢慢完善引入的,不看官方文档还真发现不了,所以说阅读官方文档真的很重要!
这里举两个官方的例子:
@ -211,9 +211,9 @@ public class CustomLoadBalancerConfiguration {
}
```
关于Spring Cloud Load Balancer更详细更新的介绍推荐大家看看官方文档https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer ,一切以官方文档为主。
关于 Spring Cloud Load Balancer 更详细更新的介绍,推荐大家看看官方文档:<https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer> ,一切以官方文档为主。
轮询策略基本可以满足绝大部分项目的需求我们的实际项目中如果没有特殊需求的话通常使用的就是默认的轮询策略。并且Ribbon 和 Spring Cloud Load Balancer 都支持自定义负载均衡策略。
轮询策略基本可以满足绝大部分项目的需求我们的实际项目中如果没有特殊需求的话通常使用的就是默认的轮询策略。并且Ribbon 和 Spring Cloud Load Balancer 都支持自定义负载均衡策略。
个人建议如非必需 Ribbon 某个特有的功能或者负载均衡策略的话,就优先选择 Spring 官方提供的 Spring Cloud Load Balancer。
@ -231,6 +231,6 @@ Spring Cloud 2020.0.0 版本移除了 Netflix 除 Eureka 外的所有组件。Sp
## 参考
- 干货 | eBay 的 4 层软件负载均衡实现https://mp.weixin.qq.com/s/bZMxLTECOK3mjdgiLbHj-g
- HTTP Load BalancingNginx 官方文档https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
- 深入浅出负载均衡 - vivo 互联网技术https://www.cnblogs.com/vivotech/p/14859041.html
- 干货 | eBay 的 4 层软件负载均衡实现:<https://mp.weixin.qq.com/s/bZMxLTECOK3mjdgiLbHj-g>
- HTTP Load BalancingNginx 官方文档):<https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/>
- 深入浅出负载均衡 - vivo 互联网技术:<https://www.cnblogs.com/vivotech/p/14859041.html>

View File

@ -159,7 +159,7 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
分片算法主要解决了数据被水平分片之后,数据究竟该存放在哪个表的问题。
- **哈希分片** :求指定 key比如 id 的哈希,然后根据哈希值确定数据应被放置在哪个表中。哈希分片比较适合随机读写的场景,不太适合经常需要范围查询的场景。
- **范围分片** 按照特性的范围区间比如时间区间、ID区间来分配数据比如 将 `id``1~299999` 的记录分到第一个库, `300000~599999` 的分到第二个库。范围分片适合需要经常进行范围查找的场景,不太适合随机读写的场景(数据未被分散,容易出现热点数据的问题)。
- **范围分片** 按照特性的范围区间比如时间区间、ID 区间)来分配数据,比如 将 `id``1~299999` 的记录分到第一个库, `300000~599999` 的分到第二个库。范围分片适合需要经常进行范围查找的场景,不太适合随机读写的场景(数据未被分散,容易出现热点数据的问题)。
- **地理位置分片** :很多 NewSQL 数据库都支持地理位置分片算法,也就是根据地理位置(如城市、地域)来分配数据。
- **融合算法** :灵活组合多种分片算法,比如将哈希分片和范围分片组合。
- ......
@ -210,4 +210,3 @@ ShardingSphere 绝对可以说是当前分库分表的首选ShardingSphere
- **分库** 就是将数据库中的数据分散到不同的数据库上。**分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
- 引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
- ShardingSphere 绝对可以说是当前分库分表的首选ShardingSphere 的功能完善除了支持读写分离和分库分表还提供分布式事务、数据库治理等功能。另外ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。

View File

@ -8,7 +8,7 @@ head:
content: 分页优化,索引,Show Profile,慢 SQL
- - meta
- name: description
content: SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 优化,因为它的改造成本相对于代码来说也要小得多。
content: SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 优化,因为它的改造成本相对于代码来说也要小得多。
---
**常见 SQL 优化手段总结** 相关的内容为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
@ -57,4 +57,4 @@ head:
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
</div>

View File

@ -1,4 +1,3 @@
# 程序人生
::: tip 这是一则或许对你有用的小广告
@ -24,7 +23,7 @@
## 程序员
- [程序员怎样出版一本技术书](./programmer/how-do-programmers-publish-a-technical-book.md)
- [程序员怎样出版一本技术书](./programmer/how-do-programmers-publish-a-technical-book.md)
- [程序员高效出书避坑和实践指南](./programmer/efficient-book-publishing-and-practice-guide.md)
## 面试
@ -32,9 +31,9 @@
- [斩获 20+ 大厂 offer 的面试经验分享](./interview/the-experience-of-get-offer-from-over-20-big-companies.md)
- [一位大龄程序员所经历的面试的历炼和思考](./interview/the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer.md)
- [从面试官和候选者的角度谈如何准备技术初试](./interview/technical-preliminary-preparation.md)
- [包装严重的IT行业作为面试官我是如何甄别应聘者的包装程度](./interview/screen-candidates-for-packaging.md)
- [普通人的春招总结(阿里、腾讯offer](./interview/summary-of-spring-recruitment.md)
- [2021校招我的个人经历和经验](./interview/my-personal-experience-in-2021.md)
- [包装严重的 IT 行业,作为面试官,我是如何甄别应聘者的包装程度](./interview/screen-candidates-for-packaging.md)
- [普通人的春招总结(阿里、腾讯 offer](./interview/summary-of-spring-recruitment.md)
- [2021 校招我的个人经历和经验](./interview/my-personal-experience-in-2021.md)
- [如何在技术初试中考察程序员的技术能力](./interview/how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology.md)
- [阿里技术面试的一些秘密](./interview/some-secrets-about-alibaba-interview.md)

View File

@ -54,4 +54,3 @@ category: 知识星球
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>

View File

@ -34,4 +34,4 @@ category: 面试准备
另外,记录博客或者用自己的理解把对应的知识点讲给别人听也是一个不错的选择。
最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。
最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。

View File

@ -71,7 +71,7 @@ Github 或者码云上面有很多实战类别项目,你可以选择一个来
## 有没有还不错的项目推荐?
**[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的「面试准备篇」中有一篇文章专门整理了一些比较高质量的实战项目,非常适合用来学习或者作为项目经验。
**[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的「面试准备篇」中有一篇文章专门整理了一些比较高质量的实战项目,非常适合用来学习或者作为项目经验。
![](https://oss.javaguide.cn/javamianshizhibei/project-experience-guide.png)
@ -111,4 +111,3 @@ Github 或者码云上面有很多实战类别项目,你可以选择一个来
并且,你还可以自定义检查规则。
![](https://oscimg.oschina.net/oscnet/up-6b618ad3bad0bc3f76e6066d90c8cd2f255.png)

View File

@ -67,9 +67,9 @@ category: 知识星球
- **宣讲会** :宣讲会也是一个不错的途径,不过,好的企业通常只会去比较好的学校,可以留意一下意向公司的宣讲会安排或者直接去到一所比较好的学校参加宣讲会。像我当时校招就去参加了几场宣讲会。不过,我是在荆州上学,那边没什么比较好的学校,一般没有公司去开宣讲会。所以,我当时是直接跑到武汉来了,参加了武汉理工大学以及华中科技大学的几场宣讲会。总体感觉还是很不错的!
- **其他** :校园就业信息网、学校论坛、班级 or 年级 QQ 群。
校招的话,建议以官网为准,有宣讲会、靠谱一点的内推的话更好。社招的话,可以多留意一下各大招聘网站比如 BOSS直聘、拉勾上的职位信息也可以找被熟人内推获得面试机会的概率更大一些进度一般也更快一些。
校招的话,建议以官网为准,有宣讲会、靠谱一点的内推的话更好。社招的话,可以多留意一下各大招聘网站比如 BOSS 直聘、拉勾上的职位信息,也可以找被熟人内推,获得面试机会的概率更大一些,进度一般也更快一些。
一般是只能投递一个岗位不过也有极少数投递不同部门两个岗位的情况这个应该不会有影响但你的前一次面试情况可能会被记录也就是说就算你投递成功两个岗位第一个岗位面试失败的话对第二个岗位也会有影响很可能直接就被pass。
一般是只能投递一个岗位,不过,也有极少数投递不同部门两个岗位的情况,这个应该不会有影响,但你的前一次面试情况可能会被记录,也就是说就算你投递成功两个岗位,第一个岗位面试失败的话,对第二个岗位也会有影响,很可能直接就被 pass。
## 多花点时间完善简历

View File

@ -1,5 +1,5 @@
---
title: 贡献指南
title: 贡献指南
category: 走近项目
---
@ -23,4 +23,4 @@ category: 走近项目
- [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way)
- [《如何向开源社区提问题》](https://github.com/seajs/seajs/issues/545)
- [《如何有效地报告 Bug》](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)
- [《如何向开源项目提交无法解答的问题》](https://zhuanlan.zhihu.com/p/25795393)。
- [《如何向开源项目提交无法解答的问题》](https://zhuanlan.zhihu.com/p/25795393)。

View File

@ -40,4 +40,3 @@ JavaGuide 这个项目诞生一年左右就有出版社的老师联系我了,
- ......
这几年一直在默默完善,真心希望 JavaGuide 越来越好,帮助到更多朋友!也欢迎大家参与进来!

View File

@ -17,5 +17,3 @@ category: 走近项目
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/827996e7722fd51718863d4bee156a8c6c759ff5) : 移除了开发工具的部分内容。
- [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/5a5f8ccb3bfb8d6ba8ac41295f1a1e4555395260) vuepress-theme-hope 主题更新升级(比较重要的一次主题更新,从 1.x 版本升级到 2.x 版本,网站性能提升)。
- [2021-11-09](https://github.com/Snailclimb/JavaGuide/commit/dc45389934b7763f4f9789168f71c72ef303d3c4) : 基于 vuepress 重构整个项目,提升阅读体验。

View File

@ -1,5 +1,5 @@
---
title: 项目介绍
title: 项目介绍
category: 走近项目
---
@ -24,4 +24,4 @@ category: 走近项目
[你可以点此链接查看 JavaGuide 的所有贡献者。](https://github.com/Snailclimb/JavaGuide/graphs/contributors) 感谢你们让 JavaGuide 变得更好!如果你们来到武汉一定要找我,我请你们吃饭玩耍。
欢迎参与 [JavaGuide 的维护工作](https://zhuanlan.zhihu.com/p/464832264),这是一件非常有意义的事情。
欢迎参与 [JavaGuide 的维护工作](https://zhuanlan.zhihu.com/p/464832264),这是一件非常有意义的事情。

View File

@ -1,5 +1,5 @@
---
title: 项目待办
title: 项目待办
category: 走近项目
---
@ -11,4 +11,3 @@ category: 走近项目
- [ ] 分布式常见理论和算法总结完善
欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](./contribution-guideline.md) 。

View File

@ -9,4 +9,3 @@ icon: big-data
- **[HBase](https://hbase.apache.org/)** HBase Hadoop Database是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
- **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
- **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。

View File

@ -8,4 +8,3 @@ icon: a-MachineLearning
- **[Smile](https://github.com/haifengl/smile)** :基于 Java 和 Scala 的机器学习库。
相关阅读:[Java 能用于机器学习和数据科学吗?-InfoQ](https://www.infoq.cn/article/GA9UeYlv8ohBzBso9eph)

View File

@ -8,9 +8,9 @@ icon: project
- [Snowy](https://gitee.com/xiaonuobase/snowy):国内首个国密前后端分离快速开发平台,定位不是深度封装的框架,也不是无代码平台,更不是某个领域的产品。详细介绍:[5.1k!这是我见过最强的前后端分离快速开发脚手架!!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247534316&idx=1&sn=69938397674fc33ecda43c8c9d0a4039&chksm=cea10927f9d68031bc862485c6be984ade5af233d4d871d498c38f22164a84314678c0c67cd7&token=1464380539&lang=zh_CN#rd)。
- [RuoYi](https://gitee.com/y_project/RuoYi) RuoYi 一款基于基于 SpringBoot 的权限管理系统 易读易懂、界面简洁美观,直接运行即可用 。
- [AgileBoot-Back-End](https://github.com/valarchie/AgileBoot-Back-End) 基于Ruoyi做了大量重构优化的基础快速开发框架。
- [AgileBoot-Back-End](https://github.com/valarchie/AgileBoot-Back-End) :基于 Ruoyi 做了大量重构优化的基础快速开发框架。
- [RuoYi-Vue-Pro](https://github.com/YunaiV/ruoyi-vue-pro) RuoYi-Vue 全新 Pro 版本,优化重构所有功能。
- [Guns](https://gitee.com/stylefeng/guns) 现代化的Java应用开发基础框架。
- [Guns](https://gitee.com/stylefeng/guns) 现代化的 Java 应用开发基础框架。
- [JeecgBoot](https://github.com/zhangdaiscott/jeecg-boot):一款基于代码生成器的 J2EE 低代码快速开发平台,支持生成前后端分离架构的项目。
- [Erupt](https://gitee.com/erupt/erupt) : 低代码全栈类框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。
- [SmartAdmin](https://gitee.com/lab1024/smart-admin) : 一套简洁、易用的低代码中后台解决方案。
@ -66,4 +66,4 @@ icon: project
- [mini-spring-cloud](https://github.com/DerekYRC/mini-spring-cloud) :一个手写的简化版的 Spring Cloud旨在帮助你快速熟悉 Spring Cloud 源码及掌握其核心原理。相关阅读:[手写一个简化版的 Spring Cloud](https://mp.weixin.qq.com/s/v3FUp-keswE2EhcTaLpSMQ) 。
- [itstack-demo-jvm](https://github.com/fuzhengwei/itstack-demo-jvm) :通过 Java 代码来实现 JVM 的基础功能(搜索解析 class 文件、字节码命令、运行时数据区等。相关阅读:[《zachaxy 的手写 JVM 系列》](https://zachaxy.github.io/tags/JVM/)。
- [Freedom](https://github.com/alchemystar/Freedom) :自己 DIY 一个具有 ACID 的数据库。相关项目:[MYDB](https://github.com/CN-GuoZiyang/MYDB)(一个简单的数据库实现)、[toyDB](https://github.com/erikgrinaker/toydb)Rust 实现的分布式 SQL 数据库)。
- [lu-raft-kv](https://github.com/stateIs0/lu-raft-kv) :一个 Java 版本的 Raft(CP) KV 分布式存储实现,非常适合想要深入学习 Raft 协议的小伙伴研究。lu-raft-kv 已经实现了 Raft 协议其中的两个核心功能leader 选举和日志复制。如果你想要学习这个项目的话建议你提前看一下作者写的项目介绍比较详细地址http://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/ 。
- [lu-raft-kv](https://github.com/stateIs0/lu-raft-kv) :一个 Java 版本的 Raft(CP) KV 分布式存储实现,非常适合想要深入学习 Raft 协议的小伙伴研究。lu-raft-kv 已经实现了 Raft 协议其中的两个核心功能leader 选举和日志复制。如果你想要学习这个项目的话建议你提前看一下作者写的项目介绍比较详细地址http://thinkinjava.cn/2019/01/12/2019/2019-01-12-lu-raft-kv/ 。

View File

@ -21,8 +21,8 @@ icon: codelibrary-fill
### Excel
- [easyexcel](https://github.com/alibaba/easyexcel) :快速、简单避免 OOM 的 Java 处理 Excel 工具。
- [excel-streaming-reader](https://github.com/monitorjbl/excel-streaming-reader)Excel 流式代码风格读取工具(只支持读取 XLSX 文件),基于 Apache POI 封装,同时保留标准 POI API 的语法。
- [myexcel](https://github.com/liaochong/myexcel)一个集导入、导出、加密Excel等多项功能的工具包。
- [excel-streaming-reader](https://github.com/monitorjbl/excel-streaming-reader)Excel 流式代码风格读取工具(只支持读取 XLSX 文件),基于 Apache POI 封装,同时保留标准 POI API 的语法。
- [myexcel](https://github.com/liaochong/myexcel):一个集导入、导出、加密 Excel 等多项功能的工具包。
### JSON
@ -56,4 +56,4 @@ icon: codelibrary-fill
- [oshi](https://github.com/oshi/oshi "oshi") :一款为 Java 语言提供的基于 JNA 的(本机)操作系统和硬件信息库。
- [ip2region](https://github.com/lionsoul2014/ip2region) :最自由的 ip 地址查询库ip 到地区的映射库,提供 Binary,B 树和纯内存三种查询算法,妈妈再也不用担心我的 ip 地址定位。
- [agrona](https://github.com/real-logic/agrona) Java 高性能数据结构(`Buffers``Lists``Maps``Scalable Timer Wheel`......)和实用方法。
- [agrona](https://github.com/real-logic/agrona) Java 高性能数据结构(`Buffers``Lists``Maps``Scalable Timer Wheel`......)和实用方法。

View File

@ -45,7 +45,7 @@ icon: "book"
### Nginx
- **[nginx-tutorial](https://github.com/dunwu/nginx-tutorial)** :一系列 Nginx 极简教程包含HTTP 反向代理、HTTPS 反向代理、负载均衡、静态站点、文件服务器搭建等实战内容。
- **[nginx-tutorial](https://github.com/dunwu/nginx-tutorial)** :一系列 Nginx 极简教程,包含 HTTP 反向代理、HTTPS 反向代理、负载均衡、静态站点、文件服务器搭建等实战内容。
## 大数据
@ -58,4 +58,4 @@ icon: "book"
- **[《Effective Java第 3 版)》中英对照版](https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual)** 《Effective Java第 3 版)各章节的中英文学习参考。
- **[《DDIA设计数据密集型应用》中文版](https://github.com/Vonng/ddia)** 《Designing Data-Intensive Application》DDIA 中文翻译。
- **[《凤凰架构》](https://github.com/fenixsoft/awesome-fenix)** :讨论如何构建一套可靠的大型分布式系统。
- **[《分布式系统模式》中文版](https://github.com/dreamhead/patterns-of-distributed-systems)** 《Patterns of Distributed Systems》中文翻译。
- **[《分布式系统模式》中文版](https://github.com/dreamhead/patterns-of-distributed-systems)** 《Patterns of Distributed Systems》中文翻译。

View File

@ -1,61 +1,34 @@
点击关注[公众号](#公众号)及时获取笔主最新更新文章并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
## Servlet 总结
<!-- MarkdownTOC -->
在 Java Web 程序中,**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数,供 Servlet 内部使用。一个 Servlet 类只会有一个实例,在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet 需要在 web.xml 中配置MyEclipse 中创建 Servlet 会自动配置),**一个 Servlet 可以设置多个 URL 访问**。**Servlet 不是线程安全**,因此要谨慎使用类变量。
- [Servlet总结](#servlet总结)
- [阐述Servlet和CGI的区别?](#阐述servlet和cgi的区别)
- [CGI的不足之处:](#cgi的不足之处)
- [Servlet的优点](#servlet的优点)
- [Servlet接口中有哪些方法及Servlet生命周期探秘](#servlet接口中有哪些方法及servlet生命周期探秘)
- [get和post请求的区别](#get和post请求的区别)
- [什么情况下调用doGet\(\)和doPost\(\)](#什么情况下调用doget和dopost)
- [转发Forward和重定向Redirect的区别](#转发forward和重定向redirect的区别)
- [自动刷新\(Refresh\)](#自动刷新refresh)
- [Servlet与线程安全](#servlet与线程安全)
- [JSP和Servlet是什么关系](#jsp和servlet是什么关系)
- [JSP工作原理](#jsp工作原理)
- [JSP有哪些内置对象、作用分别是什么](#jsp有哪些内置对象、作用分别是什么)
- [Request对象的主要方法有哪些](#request对象的主要方法有哪些)
- [request.getAttribute\(\)和 request.getParameter\(\)有何区别](#requestgetattribute和-requestgetparameter有何区别)
- [include指令include的行为的区别](#include指令include的行为的区别)
- [JSP九大内置对象七大动作三大指令](#jsp九大内置对象七大动作三大指令)
- [讲解JSP中的四种作用域](#讲解jsp中的四种作用域)
- [如何实现JSP或Servlet的单线程模式](#如何实现jsp或servlet的单线程模式)
- [实现会话跟踪的技术有哪些](#实现会话跟踪的技术有哪些)
- [Cookie和Session的的区别](#cookie和session的的区别)
## 阐述 Servlet 和 CGI 的区别?
<!-- /MarkdownTOC -->
### CGI 的不足之处:
## Servlet总结
1需要为每个请求启动一个操作 CGI 程序的系统进程。如果请求频繁,这将会带来很大的开销。
在Java Web程序中**Servlet**主要负责接收用户请求 `HttpServletRequest`,在`doGet()`,`doPost()`中做相应的处理,并将回应`HttpServletResponse`反馈给用户。**Servlet** 可以设置初始化参数供Servlet内部使用。一个Servlet类只会有一个实例在它初始化时调用`init()`方法,销毁时调用`destroy()`方法**。**Servlet需要在web.xml中配置MyEclipse中创建Servlet会自动配置**一个Servlet可以设置多个URL访问**。**Servlet不是线程安全**,因此要谨慎使用类变量。
## 阐述Servlet和CGI的区别?
### CGI的不足之处:
1需要为每个请求启动一个操作CGI程序的系统进程。如果请求频繁这将会带来很大的开销。
2需要为每个请求加载和运行一个CGI程序这将带来很大的开销
2需要为每个请求加载和运行一个 CGI 程序,这将带来很大的开销
3需要重复编写处理网络协议的代码以及编码这些工作都是非常耗时的。
### Servlet的优点:
### Servlet 的优点:
1只需要启动一个操作系统进程以及加载一个JVM大大降低了系统的开销
1只需要启动一个操作系统进程以及加载一个 JVM大大降低了系统的开销
2如果多个请求需要做同样处理的时候这时候只需要加载一个类这也大大降低了开销
3所有动态加载的类可以实现对网络协议以及请求解码的共享大大降低了工作量。
4Servlet能直接和Web服务器交互而普通的CGI程序不能。Servlet还能在各个程序之间共享数据使数据库连接池之类的功能很容易实现。
4Servlet 能直接和 Web 服务器交互,而普通的 CGI 程序不能。Servlet 还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。
补充Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争Servlet是一个特殊的Java程序一个基于Java的Web应用通常包含一个或多个Servlet类。Servlet不能够自行创建并执行它是在Servlet容器中运行的容器将用户的请求传递给Servlet程序并将Servlet的响应回传给用户。通常一个Servlet会关联一个或多个JSP页面。以前CGI经常因为性能开销上的问题被诟病然而Fast CGI早就已经解决了CGI效率上的问题所以面试的时候大可不必信口开河的诟病CGI事实上有很多你熟悉的网站都使用了CGI技术。
补充Sun Microsystems 公司在 1996 年发布 Servlet 技术就是为了和 CGI 进行竞争Servlet 是一个特殊的 Java 程序,一个基于 Java 的 Web 应用通常包含一个或多个 Servlet 类。Servlet 不能够自行创建并执行,它是在 Servlet 容器中运行的,容器将用户的请求传递给 Servlet 程序,并将 Servlet 的响应回传给用户。通常一个 Servlet 会关联一个或多个 JSP 页面。以前 CGI 经常因为性能开销上的问题被诟病,然而 Fast CGI 早就已经解决了 CGI 效率上的问题,所以面试的时候大可不必信口开河的诟病 CGI事实上有很多你熟悉的网站都使用了 CGI 技术。
参考《javaweb整合开发王者归来》P7
参考《javaweb 整合开发王者归来》P7
## Servlet接口中有哪些方法及Servlet生命周期探秘
Servlet接口定义了5个方法其中**前三个方法与Servlet生命周期相关**
## Servlet 接口中有哪些方法及 Servlet 生命周期探秘
Servlet 接口定义了 5 个方法,其中**前三个方法与 Servlet 生命周期相关**
- `void init(ServletConfig config) throws ServletException`
- `void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException`
@ -63,43 +36,46 @@ Servlet接口定义了5个方法其中**前三个方法与Servlet生命周期
- `java.lang.String getServletInfo()`
- `ServletConfig getServletConfig()`
**生命周期:** **Web容器加载Servlet并将其实例化后Servlet生命周期开始**,容器运行其**init()方法**进行Servlet的初始化请求到达时调用Servlet的**service()方法**service()方法会根据需要调用与请求对应的**doGet或doPost**等方法当服务器关闭或项目被卸载时服务器会将Servlet实例销毁此时会调用Servlet的**destroy()方法**。**init方法和destroy方法只会执行一次service方法客户端每次请求Servlet都会执行**。Servlet中有时会用到一些需要初始化与销毁的资源因此可以把初始化资源的代码放入init方法中销毁资源的代码放入destroy方法中这样就不需要每次处理客户端的请求都要初始化与销毁资源。
**生命周期:** **Web 容器加载 Servlet 并将其实例化后Servlet 生命周期开始**,容器运行其**init()方法**进行 Servlet 的初始化;请求到达时调用 Servlet 的**service()方法**service()方法会根据需要调用与请求对应的**doGet doPost**等方法;当服务器关闭或项目被卸载时服务器会将 Servlet 实例销毁,此时会调用 Servlet 的**destroy()方法**。**init 方法和 destroy 方法只会执行一次service 方法客户端每次请求 Servlet 都会执行**。Servlet 中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入 init 方法中,销毁资源的代码放入 destroy 方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。
参考《javaweb整合开发王者归来》P81
参考《javaweb 整合开发王者归来》P81
## get和post请求的区别
## get post 请求的区别
get和post请求实际上是没有区别大家可以自行查询相关文章参考文章[https://www.cnblogs.com/logsharing/p/8448446.html](https://www.cnblogs.com/logsharing/p/8448446.html),知乎对应的问题链接:[get和post区别](https://www.zhihu.com/question/28586791)
get post 请求实际上是没有区别,大家可以自行查询相关文章(参考文章:[https://www.cnblogs.com/logsharing/p/8448446.html](https://www.cnblogs.com/logsharing/p/8448446.html),知乎对应的问题链接:[get post 区别?](https://www.zhihu.com/question/28586791)
可以把 get 和 post 当作两个不同的行为,两者并没有什么本质区别,底层都是 TCP 连接。 get请求用来从服务器上获得资源而post是用来向服务器提交数据。比如你要获取人员列表可以用 get 请求,你需要创建一个人员可以用 post 。这也是 Restful API 最基本的一个要求。
可以把 get 和 post 当作两个不同的行为,两者并没有什么本质区别,底层都是 TCP 连接。 get 请求用来从服务器上获得资源,而 post 是用来向服务器提交数据。比如你要获取人员列表可以用 get 请求,你需要创建一个人员可以用 post 。这也是 Restful API 最基本的一个要求。
推荐阅读:
- https://www.zhihu.com/question/28586791
- https://mp.weixin.qq.com/s?__biz=MzI3NzIzMzg3Mw==&mid=100000054&idx=1&sn=71f6c214f3833d9ca20b9f7dcd9d33e4#rd
## 什么情况下调用doGet()和doPost()
Form标签里的method的属性为get时调用doGet()为post时调用doPost()。
## 什么情况下调用 doGet()和 doPost()
Form 标签里的 method 的属性为 get 时调用 doGet(),为 post 时调用 doPost()。
## 转发(Forward)和重定向(Redirect)的区别
**转发是服务器行为,重定向是客户端行为。**
**转发Forward**
通过RequestDispatcher对象的forwardHttpServletRequest request,HttpServletResponse response方法实现的。RequestDispatcher可以通过HttpServletRequest 的getRequestDispatcher()方法获得。例如下面的代码就是跳转到login_success.jsp页面。
通过 RequestDispatcher 对象的 forwardHttpServletRequest request,HttpServletResponse response方法实现的。RequestDispatcher 可以通过 HttpServletRequest 的 getRequestDispatcher()方法获得。例如下面的代码就是跳转到 login_success.jsp 页面。
```java
request.getRequestDispatcher("login_success.jsp").forward(request, response);
```
**重定向Redirect** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse``setStatus(int status)` 方法设置状态码。如果服务器返回301或者302则浏览器会到新的网址重新请求该资源。
**重定向Redirect** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过 `HttpServletResponse``setStatus(int status)` 方法设置状态码。如果服务器返回 301 或者 302则浏览器会到新的网址重新请求该资源。
1. **从地址栏显示来说**
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
forward 是服务器请求资源,服务器直接访问目标地址的 URL,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的 URL.
2. **从数据共享来说**
forward:转发页面和转发到的页面可以共享request里面的数据.
forward:转发页面和转发到的页面可以共享 request 里面的数据.
redirect:不能共享数据.
3. **从运用地方来说**
@ -113,78 +89,84 @@ forward:高.
redirect:低.
## 自动刷新(Refresh)
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新例如
自动刷新不仅可以实现一段时间之后自动跳转到另一个页面还可以实现一段时间之后自动刷新本页面。Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新例如:
```java
Response.setHeader("Refresh","5;URL=http://localhost:8080/servlet/example.htm");
```
其中5为时间单位为秒。URL指定就是要跳转的页面如果设置自己的路径就会实现每过5秒自动刷新本页面一次
其中 5 为时间单位为秒。URL 指定就是要跳转的页面(如果设置自己的路径,就会实现每过 5 秒自动刷新本页面一次)
## Servlet与线程安全
**Servlet不是线程安全的多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义name属性而是要把name变量分别定义在doGet()和doPost()方法内。虽然使用synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入则不存在数据不同步的问题。因此Servlet里的只读属性最好定义为final类型的。
## Servlet 与线程安全
参考《javaweb整合开发王者归来》P92
**Servlet 不是线程安全的,多线程并发的读写会导致数据不同步的问题。** 解决的办法是尽量不要定义 name 属性,而是要把 name 变量分别定义在 doGet()和 doPost()方法内。虽然使用 synchronized(name){}语句块可以解决问题,但是会造成线程的等待,不是很科学的办法。
注意:多线程的并发的读写 Servlet 类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步的问题。因此 Servlet 里的只读属性最好定义为 final 类型的。
参考《javaweb 整合开发王者归来》P92
## JSP 和 Servlet 是什么关系
## JSP和Servlet是什么关系
其实这个问题在上面已经阐述过了Servlet是一个特殊的Java程序它运行于服务器的JVM中能够依靠服务器的支持向浏览器提供显示内容。JSP本质上是Servlet的一种简易形式JSP会被服务器处理成一个类似于Servlet的Java程序可以简化页面内容的生成。Servlet和JSP最主要的不同点在于Servlet的应用逻辑是在Java文件中并且完全从表示层中的HTML分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。有人说Servlet就是在Java中写HTML而JSP就是在HTML中写Java代码当然这个说法是很片面且不够准确的。JSP侧重于视图Servlet更侧重于控制逻辑在MVC架构模式中JSP适合充当视图view而Servlet适合充当控制器controller
其实这个问题在上面已经阐述过了Servlet 是一个特殊的 Java 程序,它运行于服务器的 JVM 中能够依靠服务器的支持向浏览器提供显示内容。JSP 本质上是 Servlet 的一种简易形式JSP 会被服务器处理成一个类似于 Servlet 的 Java 程序可以简化页面内容的生成。Servlet 和 JSP 最主要的不同点在于Servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 HTML 分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。有人说Servlet 就是在 Java 中写 HTML而 JSP 就是在 HTML 中写 Java 代码当然这个说法是很片面且不够准确的。JSP 侧重于视图Servlet 更侧重于控制逻辑,在 MVC 架构模式中JSP 适合充当视图view而 Servlet 适合充当控制器controller
## JSP工作原理
JSP是一种Servlet但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类接口Servlet的一个子类。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
工程JspLoginDemo下有一个名为login.jsp的Jsp文件把工程第一次部署到服务器上后访问这个Jsp文件我们发现这个目录下多了下图这两个东东。
.class文件便是JSP对应的Servlet。编译完毕后再运行class文件来响应客户端请求。以后客户端访问login.jsp的时候Tomcat将不再重新编译JSP文件而是直接调用class文件来响应客户端请求。
## JSP 工作原理
JSP 是一种 Servlet但是与 HttpServlet 的工作方式不太一样。HttpServlet 是先由源代码编译为 class 文件后部署到服务器下,为先编译后部署。而 JSP 则是先部署后编译。JSP 会在客户端第一次请求 JSP 文件时被编译为 HttpJspPage 类(接口 Servlet 的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。
工程 JspLoginDemo 下有一个名为 login.jsp 的 Jsp 文件,把工程第一次部署到服务器上后访问这个 Jsp 文件,我们发现这个目录下多了下图这两个东东。
.class 文件便是 JSP 对应的 Servlet。编译完毕后再运行 class 文件来响应客户端请求。以后客户端访问 login.jsp 的时候Tomcat 将不再重新编译 JSP 文件,而是直接调用 class 文件来响应客户端请求。
![JSP工作原理](https://oss.javaguide.cn/github/javaguide/1.jpeg)
由于JSP只会在客户端第一次请求的时候被编译 因此第一次请求JSP时会感觉比较慢之后就会感觉快很多。如果把服务器保存的class文件删除服务器也会重新编译JSP。
由于 JSP 只会在客户端第一次请求的时候被编译 ,因此第一次请求 JSP 时会感觉比较慢,之后就会感觉快很多。如果把服务器保存的 class 文件删除,服务器也会重新编译 JSP。
开发Web程序时经常需要修改JSP。Tomcat能够自动检测到JSP程序的改动。如果检测到JSP源代码发生了改动。Tomcat会在下次客户端请求JSP时重新编译JSP而不需要重启Tomcat。这种自动检测功能是默认开启的检测改动会消耗少量的时间在部署Web应用的时候可以在web.xml中将它关掉。
开发 Web 程序时经常需要修改 JSP。Tomcat 能够自动检测到 JSP 程序的改动。如果检测到 JSP 源代码发生了改动。Tomcat 会在下次客户端请求 JSP 时重新编译 JSP而不需要重启 Tomcat。这种自动检测功能是默认开启的检测改动会消耗少量的时间在部署 Web 应用的时候可以在 web.xml 中将它关掉。
参考《javaweb整合开发王者归来》P97
参考《javaweb 整合开发王者归来》P97
## JSP有哪些内置对象、作用分别是什么
[JSP内置对象 - CSDN博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849 )
## JSP 有哪些内置对象、作用分别是什么
JSP有9个内置对象
- request封装客户端的请求其中包含来自GET或POST请求的参数
[JSP 内置对象 - CSDN 博客 ](http://blog.csdn.net/qq_34337272/article/details/64310849)
JSP 有 9 个内置对象:
- request封装客户端的请求其中包含来自 GET 或 POST 请求的参数;
- response封装服务器对客户端的响应
- pageContext通过该对象可以获取其他对象
- session封装用户会话的对象
- application封装服务器运行环境的对象
- out输出服务器响应的输出流对象
- configWeb应用的配置对象
- pageJSP页面本身相当于Java程序中的this
- configWeb 应用的配置对象;
- pageJSP 页面本身(相当于 Java 程序中的 this
- exception封装页面抛出异常的对象。
## Request 对象的主要方法有哪些
## Request对象的主要方法有哪些
- setAttribute(String name,Object)设置名字为name的request 的参数值
- getAttribute(String name)返回由name指定的属性值
- getAttributeNames()返回request 对象所有属性的名字集合,结果是一个枚举的实例
- getCookies():返回客户端的所有 Cookie 对象结果是一个Cookie 数组
- getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body的长度
- getHeader(String name) 获得HTTP协议定义的文件头信息
- getHeaders(String name) 返回指定名字的request Header 的所有值,结果是一个枚举的实例
- getHeaderNames() 返回所以request Header 的名字,结果是一个枚举的实例
- getInputStream() :返回请求的输入流,用于获得请求中的数据
- getMethod() :获得客户端向服务器端传送数据的方法
- getParameter(String name) :获得客户端传送给服务器端的有 name指定的参数值
- getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
- getParameterValues(String name)获得有name指定的参数的所有值
- getProtocol():获取客户端向服务器端传送数据所依据的协议名称
- getQueryString() :获得查询字符串
- getRequestURI() :获取发出请求字符串的客户端地址
- getRemoteAddr():获取客户端的 IP 地址
- getRemoteHost() :获取客户端的名字
- getSession([Boolean create]) :返回和请求相关 Session
- getServerName() :获取服务器的名字
- getServletPath():获取客户端所请求的脚本文件的路径
- getServerPort():获取服务器的端口号
- removeAttribute(String name):删除请求中的一个属性
- setAttribute(String name,Object):设置名字为 name 的 request 的参数值
- getAttribute(String name):返回由 name 指定的属性值
- getAttributeNames():返回 request 对象所有属性的名字集合,结果是一个枚举的实例
- getCookies():返回客户端的所有 Cookie 对象,结果是一个 Cookie 数组
- getCharacterEncoding() :返回请求中的字符编码方式 = getContentLength() :返回请求的 Body 的长度
- getHeader(String name) :获得 HTTP 协议定义的文件头信息
- getHeaders(String name) :返回指定名字的 request Header 的所有值,结果是一个枚举的实例
- getHeaderNames() :返回所以 request Header 的名字,结果是一个枚举的实例
- getInputStream() :返回请求的输入流,用于获得请求中的数据
- getMethod() :获得客户端向服务器端传送数据的方法
- getParameter(String name) :获得客户端传送给服务器端的有 name 指定的参数值
- getParameterNames() :获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例
- getParameterValues(String name):获得有 name 指定的参数的所有值
- getProtocol():获取客户端向服务器端传送数据所依据的协议名称
- getQueryString() :获得查询字符串
- getRequestURI() :获取发出请求字符串的客户端地址
- getRemoteAddr():获取客户端的 IP 地址
- getRemoteHost() :获取客户端的名字
- getSession([Boolean create]) :返回和请求相关 Session
- getServerName() :获取服务器的名字
- getServletPath():获取客户端所请求的脚本文件的路径
- getServerPort():获取服务器的端口号
- removeAttribute(String name):删除请求中的一个属性
## request.getAttribute()和 request.getParameter()有何区别
**从获取方向来看:**
`getParameter()`是获取 POST/GET 传递的参数值;
@ -193,101 +175,112 @@ JSP有9个内置对象
**从用途来看:**
`getParameter()`用于客户端重定向时即点击了链接或提交按扭时传值用即用于在用表单或url重定向传值时接收数据用。
`getParameter()`用于客户端重定向时,即点击了链接或提交按扭时传值用,即用于在用表单或 url 重定向传值时接收数据用。
`getAttribute()` 用于服务器端重定向时,即在 sevlet 中使用了 forward 函数,或 struts 中使用了
mapping.findForward。 getAttribute 只能收到程序用 setAttribute 传过来的值。
另外,可以用 `setAttribute()`,`getAttribute()` 发送接收对象.而 `getParameter()` 显然只能传字符串。
`setAttribute()` 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样`getAttribute()`就能取得你所设下的值当然这种方法可以传对象。session也一样只是对象在内存中的生命周期不一样而已。`getParameter()`只是应用服务器在分析你送上来的 request页面的文本时取得你设在表单或 url 重定向时的值。
`setAttribute()` 是应用服务器把这个对象放在该页面所对应的一块内存中去,当你的页面服务器重定向到另一个页面时,应用服务器会把这块内存拷贝另一个页面所对应的内存中。这样`getAttribute()`就能取得你所设下的值当然这种方法可以传对象。session 也一样,只是对象在内存中的生命周期不一样而已。`getParameter()`只是应用服务器在分析你送上来的 request 页面的文本时,取得你设在表单或 url 重定向时的值。
**总结:**
`getParameter()`返回的是String,用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)
`getParameter()`返回的是 String,用于读取提交的表单中的值;(获取之后会根据实际需要转换为自己需要的相应类型,比如整型,日期类型啊等等)
`getAttribute()`返回的是Object需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
`getAttribute()`返回的是 Object需进行转换,可用`setAttribute()`设置成任意对象,使用很灵活,可随时用
## include指令include的行为的区别
**include指令** JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分会被同时编译执行。 语法格式如下:
## include 指令 include 的行为的区别
**include 指令:** JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。 语法格式如下:
<%@ include file="文件相对 url 地址" %>
i**nclude动作** `<jsp:include>`动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式如下:
i**nclude 动作:** `<jsp:include>`动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式如下:
<jsp:include page="相对 URL 地址" flush="true" />
## JSP九大内置对象七大动作三大指令
[JSP九大内置对象七大动作三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
## JSP 九大内置对象,七大动作,三大指令
[JSP 九大内置对象,七大动作,三大指令总结](http://blog.csdn.net/qq_34337272/article/details/64310849)
## 讲解 JSP 中的四种作用域
JSP 中的四种作用域包括 page、request、session 和 application具体来说
## 讲解JSP中的四种作用域
JSP中的四种作用域包括page、request、session和application具体来说
- **page**代表与一个页面相关的对象和属性。
- **request**代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面涉及多个Web组件需要在页面显示的临时数据可以置于此作用域。
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
- **application**代表与整个Web应用程序相关的对象和属性它实质上是跨越整个Web应用程序包括多个页面、请求和会话的一个全局作用域。
- **request**代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件;需要在页面显示的临时数据可以置于此作用域。
- **session**代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的 session 中。
- **application**代表与整个 Web 应用程序相关的对象和属性,它实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。
## 如何实现JSP或Servlet的单线程模式
对于JSP页面可以通过page指令进行设置。
## 如何实现 JSP 或 Servlet 的单线程模式
对于 JSP 页面,可以通过 page 指令进行设置。
`<%@page isThreadSafe="false"%>`
对于Servlet可以让自定义的Servlet实现SingleThreadModel标识接口。
对于 Servlet可以让自定义的 Servlet 实现 SingleThreadModel 标识接口。
说明如果将JSP或Servlet设置成单线程工作模式会导致每个请求创建一个Servlet实例这种实践将导致严重的性能问题服务器的内存压力很大还会导致频繁的垃圾回收所以通常情况下并不会这么做。
说明:如果将 JSP Servlet 设置成单线程工作模式,会导致每个请求创建一个 Servlet 实例,这种实践将导致严重的性能问题(服务器的内存压力很大,还会导致频繁的垃圾回收),所以通常情况下并不会这么做。
## 实现会话跟踪的技术有哪些
1. **使用Cookie**
向客户端发送Cookie
1. **使用 Cookie**
向客户端发送 Cookie
```java
Cookie c =new Cookie("name","value"); //创建Cookie
Cookie c =new Cookie("name","value"); //创建Cookie
c.setMaxAge(60*60*24); //设置最大时效,此处设置的最大时效为一天
response.addCookie(c); //把Cookie放入到HTTP响应中
```
从客户端读取Cookie
从客户端读取 Cookie
```java
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
String name ="name";
Cookie[]cookies =request.getCookies();
if(cookies !=null){
for(int i= 0;i<cookies.length;i++){
Cookie cookie =cookies[i];
if(name.equals(cookis.getName()))
//something is here.
//you can get the value
cookie.getValue();
}
}
```
**优点:** 数据可以持久保存不需要服务器资源简单基于文本的Key-Value
**缺点:** 大小受到限制用户可以禁用Cookie功能由于保存在本地有一定的安全风险。
**优点:** 数据可以持久保存,不需要服务器资源,简单,基于文本的 Key-Value
**缺点:** 大小受到限制,用户可以禁用 Cookie 功能,由于保存在本地,有一定的安全风险。
2. URL 重写
在URL中添加用户会话的信息作为请求的参数或者将唯一的会话ID添加到URL结尾以标识一个会话。
URL 中添加用户会话的信息作为请求的参数,或者将唯一的会话 ID 添加到 URL 结尾以标识一个会话。
**优点:** 在Cookie被禁用的时候依然可以使用
**优点:** 在 Cookie 被禁用的时候依然可以使用
**缺点:** 必须对网站的URL进行编码所有页面必须动态生成不能用预先记录下来的URL进行访问。
**缺点:** 必须对网站的 URL 进行编码,所有页面必须动态生成,不能用预先记录下来的 URL 进行访问。
3.隐藏的表单域
```html
<input type="hidden" name ="session" value="..."/>
<input type="hidden" name="session" value="..." />
```
**优点:** Cookie被禁时可以使用
**优点:** Cookie 被禁时可以使用
**缺点:** 所有页面必须是表单提交之后的结果。
4. HttpSession
在所有会话跟踪技术中HttpSession 对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession每个用户可以访问他自己的 HttpSession。可以通过 HttpServletRequest 对象的 getSession 方 法获得 HttpSession通过 HttpSession 的 setAttribute 方法可以将一个值放在 HttpSession 中,通过调用 HttpSession 对象的 getAttribute 方法,同时传入属性名就可以获取保存在 HttpSession 中的对象。与上面三种方式不同的 是HttpSession 放在服务器的内存中,因此不要将过大的对象放在里面,即使目前的 Servlet 容器可以在内存将满时将 HttpSession 中的对象移到其他存储设备中,但是这样势必影响性能。添加到 HttpSession 中的值可以是任意 Java 对象,这个对象最好实现了 Serializable 接口,这样 Servlet 容器在必要的时候可以将其序列化到文件中,否则在序列化时就会出现异常。
在所有会话跟踪技术中HttpSession对象是最强大也是功能最多的。当一个用户第一次访问某个网站时会自动创建 HttpSession每个用户可以访问他自己的HttpSession。可以通过HttpServletRequest对象的getSession方 法获得HttpSession通过HttpSession的setAttribute方法可以将一个值放在HttpSession中通过调用 HttpSession对象的getAttribute方法同时传入属性名就可以获取保存在HttpSession中的对象。与上面三种方式不同的 是HttpSession放在服务器的内存中因此不要将过大的对象放在里面即使目前的Servlet容器可以在内存将满时将HttpSession 中的对象移到其他存储设备中但是这样势必影响性能。添加到HttpSession中的值可以是任意Java对象这个对象最好实现了 Serializable接口这样Servlet容器在必要的时候可以将其序列化到文件中否则在序列化时就会出现异常。
## Cookie和Session的区别
## Cookie 和 Session 的区别
Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式但是两者的应用场景不太一样。
Cookie 和 Session 都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。
**Cookie 一般用来保存用户信息** 比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
**Cookie 一般用来保存用户信息** 比如 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;② 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③ 登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。
Cookie 数据保存在客户端(浏览器端)Session 数据保存在服务器端。
Cookie 存储在客户端中而Session存储在服务器上相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。
Cookie 存储在客户端中,而 Session 存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。

View File

@ -1,5 +1,5 @@
---
title: 代码命名指南
title: 代码命名指南
category: 代码质量
---
@ -17,7 +17,7 @@ category: 代码质量
据说之前在 Quora 网站,由接近 5000 名程序员票选出来的最难的事情就是“命名”。
大名鼎鼎的《重构》的作者老马Martin Fowler曾经在[TwoHardThings](https://martinfowler.com/bliki/TwoHardThings.html)这篇文章中提到过CS 领域有两大最难的事情:一是 **缓存失效** ,一是 **程序命名**
大名鼎鼎的《重构》的作者老马Martin Fowler曾经在[TwoHardThings](https://martinfowler.com/bliki/TwoHardThings.html)这篇文章中提到过 CS 领域有两大最难的事情:一是 **缓存失效** ,一是 **程序命名**
![](https://oss.javaguide.cn/java-guide-blog/marting-naming.png)
@ -233,8 +233,8 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
1. 《阿里巴巴 Java 开发手册》
2. 《Clean Code》
3. Google Java 代码指南https://google.github.io/styleguide/javaguide.html
4. 告别编码5分钟命名2小时史上最全的Java命名规范参考https://www.cnblogs.com/liqiangchn/p/12000361.html
3. Google Java 代码指南:<https://google.github.io/styleguide/javaguide.html>
4. 告别编码 5 分钟,命名 2 小时!史上最全的 Java 命名规范参考:<https://www.cnblogs.com/liqiangchn/p/12000361.html>
## 总结
@ -247,4 +247,3 @@ Codelf 提供了在线网站版本,网址:[https://unbug.github.io/codelf/](
另外,国人开发的一个叫做 Codelf 的网站被很多人称为“变量命名神器”,当你为命名而头疼的时候,你可以去参考一下上面提供的一些命名示例。
最后,祝愿大家都不用再为命名而困扰!

View File

@ -1,5 +1,5 @@
---
title: 代码重构指南
title: 代码重构指南
category: 代码质量
---

View File

@ -15,7 +15,7 @@ category: 系统设计
简单来说,软件危机描述了当时软件开发的一个痛点:我们很难高效地开发出质量高的软件。
DijkstraDijkstra算法的作者 在 1972年图灵奖获奖感言中也提高过软件危机他是这样说的“导致软件危机的主要原因是机器变得功能强大了几个数量级坦率地说只要没有机器编程就完全没有问题。当我们有一些弱小的计算机时编程成为一个温和的问题而现在我们有了庞大的计算机编程也同样成为一个巨大的问题”。
DijkstraDijkstra 算法的作者) 在 1972 年图灵奖获奖感言中也提高过软件危机,他是这样说的:“导致软件危机的主要原因是机器变得功能强大了几个数量级!坦率地说:只要没有机器,编程就完全没有问题。当我们有一些弱小的计算机时,编程成为一个温和的问题,而现在我们有了庞大的计算机,编程也同样成为一个巨大的问题”。
**说了这么多,到底什么是软件工程呢?**
@ -34,7 +34,7 @@ DijkstraDijkstra算法的作者 在 1972年图灵奖获奖感言中也提
- 需求分析 :分析用户的需求,建立逻辑模型。
- 软件设计 根据需求分析的结果对软件架构进行设计。
- 编码 :编写程序运行的源代码。
- 测试 : 确定测试用例,编写测试报告。
- 测试 : 确定测试用例,编写测试报告。
- 交付 :将做好的软件交付给客户。
- 维护 :对软件进行维护比如解决 bug完善功能。
@ -44,15 +44,13 @@ DijkstraDijkstra算法的作者 在 1972年图灵奖获奖感言中也提
## 软件开发模型
软件开发模型有很多种比如瀑布模型Waterfall Model、快速原型模型Rapid Prototype Model、V模型V-model、W模型W-model、敏捷开发模型。其中最具有代表性的还是 **瀑布模型** **敏捷开发**
软件开发模型有很多种比如瀑布模型Waterfall Model、快速原型模型Rapid Prototype Model、V 模型V-model、W 模型W-model、敏捷开发模型。其中最具有代表性的还是 **瀑布模型****敏捷开发**
**瀑布模型** 定义了一套完成的软件开发周期,完整地展示了一个软件的的生命周期。
![](https://oscimg.oschina.net/oscnet/up-264f2750a3d30366e36c375ec3a30ec2775.png)
**敏捷开发模型** 是目前使用的最多的一种软件开发模型。[MBA智库百科对敏捷开发的描述](https://wiki.mbalib.com/wiki/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91)是这样的:
**敏捷开发模型** 是目前使用的最多的一种软件开发模型。[MBA 智库百科对敏捷开发的描述](https://wiki.mbalib.com/wiki/%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91)是这样的:
> **敏捷开发** 是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
@ -96,5 +94,5 @@ DijkstraDijkstra算法的作者 在 1972年图灵奖获奖感言中也提
## 参考
- 软件工程的基本概念-清华大学软件学院 刘强https://www.xuetangx.com/course/THU08091000367
- 软件开发过程-维基百科 [https://zh.wikipedia.org/wiki/软件开发过程](https://zh.wikipedia.org/wiki/软件开发过程)
- 软件工程的基本概念-清华大学软件学院 刘强:<https://www.xuetangx.com/course/THU08091000367>
- 软件开发过程-维基百科 [https://zh.wikipedia.org/wiki/软件开发过程](https://zh.wikipedia.org/wiki/软件开发过程)

View File

@ -1,5 +1,5 @@
---
title: 单元测试到底是什么?应该怎么做?
title: 单元测试到底是什么?应该怎么做?
category: 代码质量
---
@ -113,7 +113,7 @@ JUnit 几乎是默认选择,但是其不支持 Mock因此我们还需要选
究竟是选择 Mockito 还是 Spock 呢?我这里做了一些简单的对比分析:
- Spock 没办法 Mock 静态方法和私有方法 Mockito 3.4.0 以后,支持静态方法的 Mock具体可以看这个 issuehttps://github.com/mockito/mockito/issues/1013具体教程可以看这篇文章https://www.baeldung.com/mockito-mock-static-methods。
- Spock 没办法 Mock 静态方法和私有方法 Mockito 3.4.0 以后,支持静态方法的 Mock具体可以看这个 issue<https://github.com/mockito/mockito/issues/1013具体教程可以看这篇文章https://www.baeldung.com/mockito-mock-static-methods>
- Spock 基于 Groovy写出来的测试代码更清晰易读比较规范(自带 given-when-then 的常用测试结构规范)。Mockito 没有具体的结构规范需要项目组自己约定一个或者遵守比较好的测试代码实践。通常来说同样的测试用例Spock 的代码要更简洁。
- Mockito 使用的人群更广泛稳定可靠。并且Mockito 是 SpringBoot Test 默认集成的 Mock 工具。

View File

@ -8,7 +8,7 @@ head:
content: 设计模式,单例模式,责任链模式,适配器模式,工厂模式,代理模式
- - meta
- name: description
content: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象 的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临 的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当⻓的 一段时间的试验和错误总结出来的。
content: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象 的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临 的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当⻓的 一段时间的试验和错误总结出来的。
---
**设计模式** 相关的面试题已经整理到了 PDF 手册中,你可以在我的公众号“**JavaGuide**”后台回复“**PDF**” 获取。
@ -17,4 +17,4 @@ head:
**《设计模式》PDF 电子书内容概览**
![《设计模式》PDF文档概览](https://oss.javaguide.cn/github/javaguide/system-design/design-pattern-pdf.png)
![《设计模式》PDF文档概览](https://oss.javaguide.cn/github/javaguide/system-design/design-pattern-pdf.png)

View File

@ -1,5 +1,5 @@
---
title: MyBatis常见面试题总结
title: MyBatis常见面试题总结
category: 框架
icon: "database"
tag:

View File

@ -8,7 +8,7 @@ head:
content: 定时任务,Quartz,Elastic-Job,XXL-JOB,PowerJob
- - meta
- name: description
content: XXL-JOB 2015 年推出已经经过了很多年的考验。XXL-JOB 轻量级并且使用起来非常简单。虽然存在性能瓶颈但是在绝大多数情况下对于企业的基本需求来说是没有影响的。PowerJob 属于分布式任务调度领域里的新星其稳定性还有待继续考察。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库性能方面的话ElasticJob 略胜一筹。
content: XXL-JOB 2015 年推出已经经过了很多年的考验。XXL-JOB 轻量级并且使用起来非常简单。虽然存在性能瓶颈但是在绝大多数情况下对于企业的基本需求来说是没有影响的。PowerJob 属于分布式任务调度领域里的新星其稳定性还有待继续考察。ElasticJob 由于在架构设计上是基于 Zookeeper ,而 XXL-JOB 是基于数据库性能方面的话ElasticJob 略胜一筹。
---
## 为什么需要定时任务?
@ -317,4 +317,4 @@ public ReturnT<String> myAnnotationJobHandler(String param) throws Exception {
这篇文章并没有介绍到实际使用,但是,并不代表实际使用不重要。我在写这篇文章之前,已经动手写过相应的 Demo。像 Quartz我在大学那会就用过。不过当时用的是 Spring 。为了能够更好地体验,我自己又在 Spring Boot 上实际体验了一下。如果你并没有实际使用某个框架,就直接说它并不好用的话,是站不住脚的。
最后,这篇文章要感谢艿艿的帮助,写这篇文章的时候向艿艿询问过一些问题。推荐一篇艿艿写的偏实战类型的硬核文章:[《Spring JobQuartzXXL-Job年轻人才做选择艿艿全莽~》](https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247490679&idx=1&sn=25374dbdcca95311d41be5d7b7db454d&chksm=fa4963c6cd3eead055bb9cd10cca13224bb35d0f7373a27aa22a55495f71e24b8273a7603314&scene=27#wechat_redirect) 。
最后,这篇文章要感谢艿艿的帮助,写这篇文章的时候向艿艿询问过一些问题。推荐一篇艿艿写的偏实战类型的硬核文章:[《Spring JobQuartzXXL-Job年轻人才做选择艿艿全莽~》](https://mp.weixin.qq.com/s?__biz=MzUzMTA2NTU2Ng==&mid=2247490679&idx=1&sn=25374dbdcca95311d41be5d7b7db454d&chksm=fa4963c6cd3eead055bb9cd10cca13224bb35d0f7373a27aa22a55495f71e24b8273a7603314&scene=27#wechat_redirect) 。

View File

@ -50,4 +50,4 @@ icon: "design"
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
</div>

View File

@ -57,10 +57,10 @@ Web 端消息推送示例:
setInterval(() => {
// 方法请求
messageCount().then((res) => {
if (res.code === 200) {
this.messageCount = res.data
}
})
if (res.code === 200) {
this.messageCount = res.data;
}
});
}, 1000);
```
@ -151,7 +151,7 @@ public class AsyncRequestTimeoutHandler {
iframe 流就是在页面中插入一个隐藏的`<iframe>`标签,通过在`src`中请求消息数量 API 接口,由此在服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。
传输的数据通常是 HTML、或是内嵌的JavaScript 脚本,来达到实时更新页面的效果。
传输的数据通常是 HTML、或是内嵌的 JavaScript 脚本,来达到实时更新页面的效果。
![iframe 流示意图](https://oss.javaguide.cn/github/javaguide/system-design/web-real-time-message-push/1460000042192388.png)
@ -183,7 +183,7 @@ public class IframeController {
}
```
iframe 流的服务器开销很大而且IE、Chrome等浏览器一直会处于 loading 状态,图标会不停旋转,简直是强迫症杀手。
iframe 流的服务器开销很大,而且 IE、Chrome 等浏览器一直会处于 loading 状态,图标会不停旋转,简直是强迫症杀手。
![iframe 流效果](https://oss.javaguide.cn/github/javaguide/system-design/web-real-time-message-push/1460000042192389.png)
@ -437,14 +437,11 @@ MQTT 协议为什么在物联网IOT中如此受偏爱而不是其它协
> 以下内容为 JavaGuide 补充
| | 介绍 | 优点 | 缺点 |
| --------- | ------------------------------------------------------------ | ---------------------- | ---------------------------------------------------- |
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
| | 介绍 | 优点 | 缺点 |
| --------- | ------------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------- |
| 短轮询 | 客户端定时向服务端发送请求,服务端直接返回响应数据(即使没有数据更新) | 简单、易理解、易实现 | 实时性太差,无效请求太多,频繁建立连接太耗费资源 |
| 长轮询 | 与短轮询不同是,长轮询接收到客户端请求之后等到有数据更新才返回请求 | 减少了无效请求 | 挂起请求会导致资源浪费 |
| iframe 流 | 服务端和客户端之间创建一条长连接,服务端持续向`iframe`传输数据。 | 简单、易理解、易实现 | 维护一个长连接会增加开销,效果太差(图标会不停旋转) |
| SSE | 一种服务器端到客户端(浏览器)的单向消息推送。 | 简单、易实现,功能丰富 | 不支持双向通信 |
| WebSocket | 除了最初建立连接时用 HTTP 协议,其他时候都是直接基于 TCP 协议进行通信的,可以实现客户端和服务端的全双工通信。 | 性能高、开销小 | 对开发人员要求更高,实现相对复杂一些 |
| MQTT | 基于发布/订阅publish/subscribe模式的轻量级通讯协议通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |
| MQTT | 基于发布/订阅publish/subscribe模式的轻量级通讯协议通过订阅相应的主题来获取消息。 | 成熟稳定,轻量级 | 对开发人员要求更高,实现相对复杂一些 |

View File

@ -18,7 +18,7 @@ tag:
- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
- Docker 可以**对进程进行封装隔离,属于操作系统层面的虚拟化技术。** 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
官网地址https://www.docker.com/ 。
官网地址:<https://www.docker.com/>
![认识容器](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/container.png)