diff --git a/docs/DDD.md b/docs/DDD.md new file mode 100644 index 0000000000000000000000000000000000000000..b0d27f9c575a086842243c09e9519a97d4d51ed7 --- /dev/null +++ b/docs/DDD.md @@ -0,0 +1 @@ +领域驱动设计 \ No newline at end of file diff --git a/docs/about-the-author/dog-that-copies-other-people-essay.md b/docs/about-the-author/dog-that-copies-other-people-essay.md deleted file mode 100644 index 653b616eaab7b9931ef5be0c61c03ed48cccbcbd..0000000000000000000000000000000000000000 --- a/docs/about-the-author/dog-that-copies-other-people-essay.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: 抄袭狗,你冬天睡觉脚必冷!!! -category: 走近作者 -tag: - - 杂谈 ---- - -抄袭狗真的太烦了。。。 - -听朋友说我的文章在知乎又被盗了,原封不动地被别人用来引流。 - -![](https://oss.javaguide.cn/p3-juejin/39f223bd8d8240b8b7328f7ab6edbc57~tplv-k3u1fbpfcp-zoom-1.png) - -而且!!!这还不是最气的。 - -这人还在文末注明的原出处还不是我的。。。 - -![](https://oss.javaguide.cn/p3-juejin/fa47e0752f4b4b57af424114bc6bc558~tplv-k3u1fbpfcp-zoom-1.png) - -也就是说 CSDN 有另外一位抄袭狗盗了我的这篇文章并声明了原创,知乎抄袭狗又原封不动地搬运了这位 CSDN 抄袭狗的文章。 - -真可谓离谱他妈给离谱开门,离谱到家了。 - -![](https://oss.javaguide.cn/p3-juejin/6f8d281579224b13ad235c28e1d7790e~tplv-k3u1fbpfcp-zoom-1.png) - -我打开知乎抄袭狗注明的原出处链接,好家伙,一模一样的内容,还表明了原创。 - -![](https://oss.javaguide.cn/p3-juejin/6a6d7b206b6a43ec9b0055a8f47a30be~tplv-k3u1fbpfcp-zoom-1.png) - -看了一下 CSDN 这位抄袭狗的文章,好家伙,把我高赞回答搬运了一个遍。。。真是很勤奋了。。。 - -CSDN 我就不想多说了,就一大型文章垃圾场,都是各种不规范转载,各种收费下载的垃圾资源。这号称国内流量最大的技术网站贼恶心,吃香太难看,能不用就不要用吧! - -像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。 - -![](https://oss.javaguide.cn/p3-juejin/be151d93cd024c6e911d1a694212d91c~tplv-k3u1fbpfcp-zoom-1.png) - -我的文章基本被盗完了,关键是我自己发没有什么流量,反而是盗我文章的那些人比我这个原作者流量还大。 - -这是什么世道,是人性的扭曲还是道德的沦丧? - -不过,也没啥,CSDN 这垃圾网站不去发文也无妨。 - -看看 CSDN 热榜上的文章都是一些什么垃圾,不是各种广告就是一些毫无质量的拼凑文。 - -![](https://oss.javaguide.cn/p3-juejin/cd07efe86af74ea0a07d29236718ddc8~tplv-k3u1fbpfcp-zoom-1-20230717155426403.png) - -当然了,也有极少部分的高质量文章,比如涛哥、二哥、冰河、微观技术等博主的文章。 - -还有很多视频平台(比如抖音、哔哩哔哩)上面有很多博主直接把别人的原创拿来做个视频,用来引流或者吸粉。 - -今天提到的这篇被盗的文章曾经就被一个培训机构拿去做成了视频用来引流。 - -![](https://oss.javaguide.cn/p3-juejin/9dda1e36ceff4cbb9b0bf9501b279be5~tplv-k3u1fbpfcp-zoom-1.png) - -作为个体,咱也没啥办法,只能遇到一个举报一个。。。 diff --git a/docs/about-the-author/feelings-after-one-month-of-induction-training.md b/docs/about-the-author/feelings-after-one-month-of-induction-training.md deleted file mode 100644 index ed57578a90735970fad64e9960b9f930e3061ea9..0000000000000000000000000000000000000000 --- a/docs/about-the-author/feelings-after-one-month-of-induction-training.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: 入职培训一个月后的感受 -category: 走近作者 -tag: - - 个人经历 ---- - -不知不觉已经入职一个多月了,在入职之前我没有在某个公司实习过或者工作过,所以很多东西刚入职工作的我来说还是比较新颖的。学校到职场的转变,带来了角色的转变,其中的差别因人而异。对我而言,在学校的时候课堂上老师课堂上教的东西,自己会根据自己的兴趣选择性接受,甚至很多课程你不想去上的话,还可以逃掉。到了公司就不一样了,公司要求你会的技能你不得不学,除非你不想干了。在学校的时候大部分人编程的目的都是为了通过考试或者找到一份好工作,真正靠自己兴趣支撑起来的很少,到了工作岗位之后我们编程更多的是因为工作的要求,相比于学校的来说会一般会更有挑战而且压力更大。在学校的时候,我们最重要的就是对自己负责,我们不断学习知识去武装自己,但是到了公司之后我们不光要对自己负责,更要对公司负责,毕竟公司出钱请你过来,不是让你一直 on beach 的。 - -刚来公司的时候,因为公司要求,我换上了 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 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责,Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责 5 - 6 个人。Trainer 不定期都会给我们最近表现的 Feedback (反馈) ,我个人觉得这个并不是这是走走形式,Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。 - -另外,ThoughtWorks 也是一家非常提倡 Feedback (反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。 - -![](https://oss.javaguide.cn/github/about-the-author/feedback.png) - -工作之后,平时更新公众号、专栏还有维护 Github 的时间变少了。实际上,很多时候下班回来后,都有自己的时间来干自己的事情,但是自己也总是找工作太累或者时间比较零散的接口来推掉了。到了今天,翻看 Github 突然发现 14 天前别人在 Github 上给我提的 PR 我还没有处理。这一点确实是自己没有做好的地方,没有合理安排好自己的时间。实际上自己有很多想写的东西,后面会慢慢将他们提上日程。工作之后,更加发现下班后的几个小时如何度过确实很重要 ,如果你觉得自己没有完成好自己白天该做的工作的话,下班后你可以继续忙白天没有忙完的工作,如果白天的工作对于你游刃有余的话,下班回来之后,你大可去干自己感兴趣的事情,学习自己感兴趣的技术。做任何事情都要基于自身的基础,切不可好高骛远。 - -工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController`、`@Autowried`、`@Pathvairable`、`@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。 - -这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。 diff --git a/docs/about-the-author/feelings-of-half-a-year-from-graduation-to-entry.md b/docs/about-the-author/feelings-of-half-a-year-from-graduation-to-entry.md deleted file mode 100644 index cc9fe136749a031314a172ce080217255ef60d75..0000000000000000000000000000000000000000 --- a/docs/about-the-author/feelings-of-half-a-year-from-graduation-to-entry.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: 从毕业到入职半年的感受 -category: 走近作者 -tag: - - 个人经历 ---- - -如果大家看过我之前的介绍的话,就会知道我是 19 年毕业的几百万应届毕业生中的一员。这篇文章主要讲了一下我入职大半年的感受,文中有很多自己的主观感受,如果你们有任何不认同的地方都可以直接在评论区说出来,会很尊重其他人的想法。 - -简单说一下自己的情况吧!我目前是在一家外企,每天的工作和大部分人一样就是做开发。毕业到现在,差不多也算是工作半年多了,也已经过了公司 6 个月的试用期。目前在公司做过两个偏向于业务方向的项目,其中一个正在做。你很难想象我在公司做的两个业务项目的后端都没有涉及到分布式/微服务,没有接触到 Redis、Kafka 等等比较“高大上”的技术在项目中的实际运用。 - -第一个项目做的是公司的内部项目——员工成长系统。抛去员工成长系统这个名字,实际上这个系统做的就是绩效考核比如你在某个项目组的表现。这个项目的技术是 Spring Boot+ JPA + Spring Security + K8S + Docker + React。第二个目前正在做的是一个集成游戏 (cocos)、Web 管理端 (Spring Boot + Vue) 和小程序 (Taro) 项目。 - -是的,我在工作中的大部分时间都和 CRUD 有关,每天也会写前端页面。之前我认识的一个朋友 ,他听说我做的项目中大部分内容都是写业务代码之后就非常纳闷,他觉得单纯写业务代码得不到提升?what?你一个应届生,连业务代码都写不好你给我说这个!所以,**我就很纳闷不知道为什么现在很多连业务代码都写不好的人为什么人听到 CRUD 就会反感?至少我觉得在我工作这段时间我的代码质量得到了提升、定位问题的能力有了很大的改进、对于业务有了更深的认识,自己也可以独立完成一些前端的开发了。** - -其实,我个人觉得能把业务代码写好也没那么容易,抱怨自己天天做 CRUD 工作之前,看看自己 CRUD 的代码写好没。再换句话说,单纯写 CRUD 的过程中你搞懂了哪些你常用的注解或者类吗?这就像一个只会 `@Service`、`@Autowired`、`@RestController`等等最简单的注解的人说我已经掌握了 Spring Boot 一样。 - -不知道什么时候开始大家都会觉得有实际使用 Redis、MQ 的经验就很牛逼了,这可能和当前的面试环境有关系。你需要和别人有差异,你想进大厂的话,好像就必须要这些技术比较在行,好吧,没有好像,自信点来说对于大部分求职者这些技术都是默认你必备的了。 - -**实话实说,我在大学的时候就陷入过这个“伪命题”中**。在大学的时候,我大二因为加入了一个学校的偏技术方向的校媒才接触到 Java ,当时我们学习 Java 的目的就是开发一个校园通。 大二的时候,编程相当于才入门水平的我才接触 Java,花了一段时间才掌握 Java 基础。然后,就开始学习安卓开发。 - -到了大三上学期,我才真正确定要走 Java 后台的方向,找 Java 后台的开发工作。学习了 3 个月左右的 WEB 开发基础之后,我就开始学习分布式方面内容比如 Redis、Dubbo 这些。我当时是通过看书 + 视频 + 博客的方式学习的,自学过程中通过看视频自己做过两个完整的项目,一个普通的业务系统,一个是分布式的系统。**我当时以为自己做完之后就很牛逼了,我觉得普通的 CRUD 工作已经不符合我当前的水平了。哈哈!现在看来,当时的我过于哈皮!** - -这不!到了大三暑假跟着老师一起做项目的时候就出问题了。大三的时候,我们跟着老师做的是一个绩效考核系统,业务复杂程度中等。这个项目的技术用的是:SSM + Shiro + JSP。当时,做这个项目的时候我遇到各种问题,各种我以为我会写的代码都不会写了,甚至我写一个简单的 CRUD 都要花费好几天的时间。所以,那时候我都是边复习边学习边写代码。虽然很累,但是,那时候学到了很多,也让我在技术面前变得更加踏实。我觉得这“**这个项目已经没有维护的可能性**”这句话是我对我过的这个项目最大的否定了。 - -技术千变万化,掌握最核心的才是王道。我们前几年可能还在用 Spring 基于传统的 XML 开发,现在几乎大家都会用 Spring Boot 这个开发利器来提升开发速度,再比如几年前我们使用消息队列可能还在用 ActiveMQ,到今天几乎都没有人用它了,现在比较常用的就是 Rocket MQ、Kafka 。技术更新换代这么快的今天,你是无法把每一个框架/工具都学习一遍的。 - -**很多初学者上来就想通过做项目学习,特别是在公司,我觉得这个是不太可取的。** 如果的 Java 基础或者 Spring Boot 基础不好的话,建议自己先提前学习一下之后再开始看视频或者通过其他方式做项目。 **还有一点就是,我不知道为什么大家都会说边跟着项目边学习做的话效果最好,我觉得这个要加一个前提是你对这门技术有基本的了解或者说你对编程有了一定的了解。** - -**划重点!!!在自己基础没打牢的情况下,单纯跟着视频做一点用没有。你会发现你看完视频之后,让你自己写代码的时候又不会写了。** - -不知道其他公司的程序员是怎么样的?我感觉技术积累很大程度在乎平时,单纯依靠工作绝大部分情况只会加快自己做需求的熟练度,当然,写多了之后或多或少也会提升你对代码质量的认识(前提是你有这个意识)。 - -工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security + JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,GitHub 地址: 。以次为契机,我还分享了 - -- [《一问带你区分清楚 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) - -另外一个最近的例子是因为肺炎疫情在家的这段时间,自学了 Kafka,并且正在准备写一系列的入门文章,目前已经完成了: - -1. 大白话 Kafka 入门; -2. Kafka 安装和基本功能体验; -3. Spring Boot 整合 Kafka 发送和接受消息; -4. Spring Boot 整合 Kafka 发送和接受消息的一些事务、错误消息处理等等。 - -还没完成的: - -1. Kafka 高级特性比如工作流程、Kafka 为什么快等等的分析; -2. 源码阅读分析; -3. …… - -**所以,我觉得技术的积累和沉淀很大程度在乎工作之外的时间(大佬和一些本身就特别厉害的除外)。** - -**未来还有很长的路要走,即使再有精力也学不完你想学的所有技术,适当取舍、适当妥协,适当娱乐。** diff --git a/docs/about-the-author/internet-addiction-teenager.md b/docs/about-the-author/internet-addiction-teenager.md deleted file mode 100644 index d4a34b8fc271316cfde407a3fe735a57655ed71c..0000000000000000000000000000000000000000 --- a/docs/about-the-author/internet-addiction-teenager.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: 我曾经也是网瘾少年 -category: 走近作者 -tag: - - 个人经历 ---- - -> 这篇文章写入 2021 年高考前夕。 - -聊到高考,无数人都似乎有很多话说。今天就假借高考的名义,简单来聊聊我的高中求学经历吧! - -说实话,我自己的高中求学经历真的还不算平淡,甚至有点魔幻,所以还是有很多话想要说的。 - -这篇文章大概会从我的初中一直介绍到高中,每一部分我都不会花太多篇幅,就简单聊聊吧! - -**以下所有内容皆是事实,没有任何夸大的地方,稍微有一点点魔幻。** - -## 刚开始接触电脑 - -最开始接触电脑是在我刚上五年级的时候,那时候家里没电脑,刚开始上网都是在黑网吧玩的。 - -在黑网吧上网的经历也是一波三折,经常会遇到警察来检查或者碰到大孩子骚扰。在黑网吧上网的一年多中,我一共两次碰到警察来检查,主要是看有没有未成年人(当时黑网吧里几乎全是未成年人),实际感觉像是要问黑网吧老板要点好处。碰到大孩子骚扰的次数就比较多,大孩子经常抢我电脑,还威胁我把身上所有的钱给他们。我当时一个人也比较怂,被打了几次之后,就尽量避开大孩子来玩的时间去黑网吧,身上也只带很少的钱。小时候的性格就比较独立,在外遇到事情我一般也不会给家里人说。 - -我现在已经记不太清当时是被我哥还是我姐带进网吧的,好像是我姐。 - -起初的时候,自己就是玩玩流行蝴蝶剑、单机摩托之类的单机游戏。但是,也没有到沉迷的地步,只是觉得这东西确实挺好玩的,一玩就可以玩一下午,恋恋不舍。 - -![](https://oss.javaguide.cn/github/javaguide/books2a6021b9-e7a0-41c4-b69e-a652f7bc3e12-20200802173601289.png) - -## 小学毕业后开始有网瘾 - -开始有网瘾是在小学毕业的时候,在我玩了一款叫做 **QQ 飞车** 的游戏之后(好像是六年级末就开始玩了)。我艹,当时真的被这游戏吸引了。**每天上课都幻想自己坐在车里面飘逸,没错,当时就觉得秋名山车神就是我啦!** - -我当时技术还是挺不错的,整个网吧玩这个游戏的貌似还没有可以打败我的(我们当时经常会开放切磋)。 - -QQ 飞车这款戏当时还挺火的,很多 90 后的小伙伴应该比较熟悉。 - -我记得,那时候上网还不要身份证,10 元办一张网卡就行了,网费也是一元一小时。我就经常不吃早饭,攒钱用来上网。只要口袋里有钱,我都会和我的小伙伴奔跑到网吧一起玩 QQ 飞车。青回啊! - -> 说到这,我情不自禁地打开自己的 Windows 电脑,下载了 Wegame ,然后下载了 QQ 飞车。 - -到了初二的时候,就没玩 QQ 飞车了。我的等级也永久定格在了 **120** 级,这个等级在当时那个升级难的一匹的年代,算的上非常高的等级了。 - -![](https://oss.javaguide.cn/javaguide/b488618c-3c25-4bc9-afd4-7324e27553bd-20200802175534614.png) - -## 初二网瘾爆发 - -网瘾爆发是在上了初中之后。初二的时候,最为猖狂,自己当时真的是太痴迷于 **穿越火线** 这款游戏了,比 QQ 飞车还要更痴迷一些。每天上课都在想像自己拿起枪横扫地方阵营的场景,心完全不在学习上。 - -我经常每天早上起早去玩别人包夜留下的机子,毕竟那时候上学也没什么钱嘛!我几乎每个周五晚上都会趁家人睡着之后,偷偷跑出去通宵。整个初二我通宵了无数次,我的眼睛就是这样近视的。 - -有网瘾真的很可怕,为了上网什么都敢做。当时我家住在顶楼的隔热层,我每次晚上偷偷出去上网,为了不被家里人发现,要从我的房间的窗户爬出去,穿过几栋楼,经过几间无人居住的顶楼隔热层之后再下楼。现在想想,还是比较危险的。而且,我天生比较怕黑。当时为了上网,每次穿过这么多没人居住的顶层隔热层都没怕过。你让我现在再去,我都不敢,实在是佩服当年的自己的啊! - -![我家楼顶拍的雪景](https://oss.javaguide.cn/about-the-author/image-20230429114622340.png) - -周五晚上通宵完之后,我会睡到中午,然后下午继续去网吧玩。到了周日,基本都是直接从早上 8 点玩到晚上 9 点 10 点。那时候精力是真旺盛,真的完全不会感觉比较累,反而乐在其中。 - -我的最终军衔停留在了两个钻石,玩过的小伙伴应该清楚这在当时要玩多少把(现在升级比较简单)。 - -那时候成绩挺差的。这样说吧!我当时在很普通的一个县级市的高中,全年级有 500 来人,我基本都是在 280 名左右。而且,整个初二我都没有学物理,上物理课就睡觉,考试就交白卷。 - -为什么对物理这么抵触呢?这是因为开学不久的一次物理课,物理老师误会我在上课吃东西还狡辩,扇了我一巴掌。那时候心里一直记仇到大学,想着以后自己早晚有时间把这个物理老师暴打一顿。 - -## 初三开启学习模式 - -初三上学期的时候突然觉悟,像是开窍了一样,当时就突然意识到自己马上就要升高中了,要开始好好搞搞学习了。 - -诶,其实也不算是开窍,主要还是为了让自己能在家附近上学,这样上网容易一些。因为当时我家就在我们当地的二中附近,附近有特别特别多的网吧,上网特别特别容易,加上我又能走读。 - -像我初中在的那个学校,年级前 80 的话基本才有可能考得上二中。经过努力,初三上学期的第一次月考,我直接从 280 多名进步到了年级 50 多名,有机会考入二中。当时还因为进步太大,被当作 **进步之星** 在讲台上给整个年级做演讲,分享经验。这也是我第一次在这么多人面前讲话,挺紧张的,但是挺爽的,在暗恋对象面前赚足了面子。 - -其实在初三的时候,我的网瘾还是很大。不过,我去玩游戏的前提都是自己把所有任务做完,并且上课听讲也相对比较认真的听。 - -初三那会,我通宵的次数变少了一些,但会经常晚上趁着家人睡觉了,偷偷跑出去玩到凌晨 2 点多回来。 - -当时,我们当地的高中有一个政策是每个学校的成绩比较优秀的学生可以参加 **高中提前招生考试** ,只要考上了就不用参加中考了。我当时也有幸参加了这次考试并成功进入了我们当地的二中。 - -在我参加高中提前考试前的一个晚上,我半夜 12 点趁着妈妈睡着,跑去了网吧玩 CF 到凌晨 3 点多回来。就那一次我被抓了现行,到家之后发现妈妈就坐在客厅等我,训斥一顿后,我就保证以后不再晚上偷偷跑出去了。 - -> 这里要说明一点:我的智商我自己有自知之明的,属于比较普通的水平吧!前进很大的主要原因是自己基础还行,特别是英语和物理。英语是因为自己喜欢,加上小学就学了很多初中的英语课程。物理的话就很奇怪,虽然初二也不怎么听物理课,也不会物理,但是到了初三之后自己就突然开窍了。真的!我现在都感觉很奇怪。然后,到了高中之后,我的英语和物理依然是我最好的两门课。大学的兼职,我出去做家教都是教的高中物理。 - -## 高中从小班掉到平行班 - -由于参加了高中提前招生考试,我提前 4 个月就来到了高中,进入了小班,开始学习高中的课程。 - -上了高中的之后,我上课就偷偷看小说,神印王座、斗罗大陆、斗破苍穹很多小说都是当时看的。中午和晚上回家之后,就在家里玩几把 DNF。当时家里也买了电脑,姥爷给买的,是对自己顺利进入二中的奖励。到我卸载 DNF 的时候,已经练了 4 个满级的号,两个接近满级的号。 - -当时我的空间专门有一个相册里面放的全是 DNF 的一些照片和截图,无比痴迷于练级和刷图。 - -在高中待了不到一个月,我上体育课的时候不小心把腿摔断了,这也是我第一次感受到骨头断裂的头疼,实在是太难受了! - -于是,我就开始休学养病。直到高中正式开学一个月之后,我才去上学,也没有参加军训。 - -由于我耽误了几个月的课程,因此没办法再进入小班,只能转到奥赛班。到了奥赛班之后,我继续把时间和经历都投入在游戏和小说上,于是我的成绩在奥赛班快接近倒数了。等到高二分班的时候,我成功被踢出奥赛班来到了最普通的平行班。 - -**我成功把自己从学校最好的小班玩到奥赛班,然后再到平行班。有点魔幻吧!** - -## 高二开始奋起直追 - -高中觉悟是在高二下学期的时候,当时是真的觉悟了,就突然觉得游戏不香了,觉得 DNF 也不好玩了,什么杀怪打装备不过是虚无,练了再多满级的 DNF 账号也屁用没有,没钱都是浮云。 - -我妈妈当时还很诧异,还奇怪地问我:“怎么不玩游戏了?”(我妈属于不怎么管我玩游戏的,她觉得这东西还是要靠自觉)。 - -于是,我便开始牟足劲学习,每天都沉迷学习无法自拔(豪不夸张),乐在其中。虽然晚自习上完回到家已经差不多 11 点了,但也并不感觉累,反而感觉很快乐,很充实。 - -**我的付出也很快得到了回报,我顺利返回了奥赛班。** 当时,理科平行班大概有 7 个,每次考试都是平行班之间会单独排一个名次,小班和奥赛班不和我们一起排名次。后面的话,自己基本每次都能在平行班得第一,并且很多时候都是领先第二名 30 来分。由于成绩还算亮眼,高三上学期快结束的时候,我就向年级主任申请去了奥赛班。 - -## 高考前的失眠 - -> **失败之后,不要抱怨外界因素,自始至终实际都是自己的问题,自己不够强大!** 然后,高考前的失眠也是我自己问题,要怪只能怪自己,别的没有任何接口。 - -我的高考经历其实还蛮坎坷的,毫不夸张的说,高考那今天可能是我到现在为止,经历的最难熬的时候,特别是在晚上。 - -我在高考那几天晚上都经历了失眠,想睡都睡不着那种痛苦想必很多人或许都体验过。 - -其实我在之前是从来没有过失眠的经历的。高考前夕,因为害怕自己睡不着,所以,我提前让妈妈去买了几瓶老师推荐的安神补脑液。我到现在还记得这个安神补脑液是敖东牌的。 - -![](https://oss.javaguide.cn/about-the-author/internet-addiction-teenager/image-20220625194714247.png) - -高考那几天的失眠,我觉得可能和我喝了老师推荐的安神补脑液有关系,又或者是我自己太过于紧张了。因为那几天睡觉总会感觉有很多蚂蚁在身上爬一样,身上还起了一些小痘痘。 - -然后,这里要格外说明一点,避免引起误导:**睡不着本身就是自身的问题,上述言论并没有责怪这个补脑液的意思。** 另外, 这款安神补脑液我去各个平台都查了一下,发现大家对他的评价都挺好,和我们老师当时推荐的理由差不多。如果大家需要改善睡眠的话,可以咨询相关医生之后尝试一下。 - -## 大学生活 - -大学生活过的还是挺丰富的,我会偶尔通宵敲代码,也会偶尔半夜发疯跑出去和同学一起走走古城墙、去网吧锤一夜的 LOL。 - -大学生活专门写过一篇文章介绍:[害,毕业三年了!](./my-college-life.md) 。 - -## 总结 - -整个初中我都属于有点网瘾少年的状态,不过初三的时候稍微克制一些。到了高二下学期的时候,自己才对游戏真的没有那么沉迷了。 - -对游戏不那么沉迷,也是因为自己意识到游戏终究只是消遣,学习才是当时最重要的事情。而且,我的游戏技术又不厉害,又不能靠游戏吃饭,什么打怪升级到最后不过是电脑中的二进制数据罢了! - -**这玩意必须你自己意识到,不然,单纯靠父母监督真的很难改变!如果心不在学习上面的话,那同时是不可能学好的!** - -我真的很反对父母过于干涉孩子的生活,强烈谴责很多父母把自己孩子的网瘾归咎于网络游戏,把自己孩子的暴力归咎于影视媒体。 - -**时刻把自己的孩子保护起来不是一件靠谱的事情,他终究要独自面对越来越多的诱惑。到了大学,很多被父母保护太好的孩子就直接废了。他们没有独立意识,没有抗拒诱惑的定力!** diff --git a/docs/about-the-author/javaguide-100k-star.md b/docs/about-the-author/javaguide-100k-star.md deleted file mode 100644 index e89060dbe272dc0f9090fe49cdb64824345a365b..0000000000000000000000000000000000000000 --- a/docs/about-the-author/javaguide-100k-star.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: JavaGuide 开源项目 100K Star 了! -category: 走近作者 -tag: - - 个人经历 ---- - -2021-03-21,晚上 12 点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 GitHub 主页](https://github.com/Snailclimb)。 - -好家伙!几天没注意,[JavaGuide](https://github.com/Snailclimb/JavaGuide) 这个项目直接上了 100K star。 - -![JavaGuide 100k 里程碑](https://oss.javaguide.cn/github/javaguide/1&e=1643644799&token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD:zANqh9HQEvvLPm6smyrjvjAt-Ik=.png) - -其实,这个真没啥好嘚瑟的。因为,教程类的含金量其实是比较低的,Star 数量比较多主要也是因为受众面比较广,大家觉得不错,点个 star 就相当于收藏了。很多特别优秀的框架,star 数量可能只有几 K。所以,单纯看 star 数量没啥意思,就当看个笑话吧! - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/20210323132635635.png) - -维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。 - -对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎! - -开源非常重要的一点就是协作。如果你开源了一个项目之后,就不再维护,别人给你提交 issue/pr,你都不处理,那开源也没啥意义了! - -我的公号的小伙伴都是通过这个项目关注我的,趁着午休,简单复盘一下,也算是对关注这个项目的小伙伴负责。 - -我在大三开始准备秋招面试的时候,创建了 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 我还未抽出时间处理。 - -![](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 了。 - -**未来几年,我还是会持续完善 JavaGuide。** - -**希望自己以后能开源一些有价值的轮子吧!继续加油!** diff --git a/docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md b/docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md deleted file mode 100644 index 2fa306d2fe90ed4e20344e6c8f16737d0044482b..0000000000000000000000000000000000000000 --- a/docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: 某培训机构盗我文章做成视频还上了B站热门 -category: 走近作者 -tag: - - 杂谈 ---- - -时间回到 2021-02-25,我在刷哔哩哔哩的时候发现,哔哩哔哩某 UP 主(某培训机构),擅自将我在知乎的一个回答做成了视频。 - -原滋原味啊!我艹。甚至,连我开头的自我调侃还加上了!真的牛皮! - -你盗我原创,视频你用心做好点也行啊!至少也可以让这么优质的内容得到传播嘛! - -结果,好家伙,视频做的像坨屎一样,配音也贼违和! - -麻烦这个培训机构看到这篇文章之后可以考虑换一个人做类似恶心的事情哈!这人完全没脑子啊! - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-db6b9cf323930786fa2bec8b1e1bfaad732.png) - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-6395603ab441b74511c6eda28efee8937d7.png) - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-921f60a5c7cee2c5c2eb30f4f7048f648e1.png) - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-acc82a797bd01e27f5b7d5d327b32a21d4e.png) - -我随便找了一个视频看,发现也还是盗用别人的原创。 - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-48d0c5ab086265ae19b7396bc59de2c2daf.png) - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/up-366abf0656007ff96551064104e60740a41.png) - -其他的视频就不用多看了,是否还是剽窃别人的原创,原封不动地做成视频,大家心里应该有数。 - -他们这样做的目的就是一个:**引流到自己的 QQ 群,然后忽悠你买课程。** - -我并不认为是这完全都是培训机构的问题。培训机构的员工为了流量而做这种恶心的事情,也导致了现在这种事情被越来越频繁地发生。 - -所以,你会发现,哔哩哔哩和知乎上有越来越多培训机构的小号,到处剽窃原创,盗发。 - -我身边很多原创号主的文章都经常被某些培训机构盗发。 - -有时候真的会比较生气,毕竟你自己辛辛苦苦的原创,别人复制粘贴一下就白嫖了! - -但是,我相信,这种靠剽窃别人原创来吸引流量的行为,终究只是跳梁小丑的行为罢了! - -只有那些用心输出内容的创作者,才能走的更远,更安稳! - -后来,我在我的公众号上发了一篇名为[《好家伙!某培训机构盗我文章做成视频还上了热门》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247500005&idx=1&sn=7351e22619654492d3cf567bff9d87f0&chksm=cea18f2ef9d606384e0265b9318e004646c03b8a69f2801698d2f9e0e6bdfec0a1185ac3ab17&token=2146952532&lang=zh_CN&scene=21#wechat_redirect) 的文章,吐槽自己的原创被某机构白嫖。 - -谁能想到,培训机构的人竟然找人来让我删文章了!讲真,这俩人是真的奇葩啊! - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/8f8ccafcf5b764a2289a9c276c30728d.png) - -![](https://oss.javaguide.cn/javaguide/a0a4a45d7ec7b1a2622b2a38629e9b09.png) - -还让我格局大点?我去你丫的!明明就是我的原创,你自己不删,反而找人联系我删除!有脑子不? - -其实,我这人是比较好说话的,现实生活中脾气也是出了名的好(前提是没有触犯到我的原则的情况)。 - -搞笑的是!他们在让我删文的同时,他们 B 站盗发的视频还都在,还在继续为他们引流。 - -![](https://oss.javaguide.cn/javaguide/86f659a93ce5b639526c8d2bd20b2fbe.png) - -![](https://oss.javaguide.cn/github/javaguide/about-the-author/be6e0fd23146de3f6224b4d853c59ce7.png) - -如果他们把账号注销了,我或许还能考虑放一手。但是,文章是肯定不会删的。 - -现在,看后续情况吧!我随时可以动用法律来维护自己的权益,只是看我想不想,毕竟也挺麻烦对吧! - -大家不用担心,这都是小事,我女朋友就是学法律的,国内的某法学双一流学校。 - -咱不怕事!凎!!! diff --git a/docs/about-the-author/my-college-life.md b/docs/about-the-author/my-college-life.md deleted file mode 100644 index 43d96bd4186f67f111cfb5224b88265cb95366fb..0000000000000000000000000000000000000000 --- a/docs/about-the-author/my-college-life.md +++ /dev/null @@ -1,387 +0,0 @@ ---- -title: 害,毕业三年了! -category: 走近作者 -star: 1 -tag: - - 个人经历 ---- - -> 关于初高中的生活,可以看 2020 年我写的 [我曾经也是网瘾少年](./internet-addiction-teenager.md) 这篇文章。 - -2019 年 6 月份毕业,距今已经过去了 3 年。趁着高考以及应届生毕业之际,简单聊聊自己的大学生活。 - -下面是正文。 - -我本科毕业于荆州校区的长江大学,一所不起眼的双非一本。 - -在这里度过的四年大学生活还是过的挺开心的,直到现在,我依然非常怀念! - -在学校的这几年的生活,总体来说,还算是比较丰富多彩的。我会偶尔通宵敲代码,也会偶尔半夜发疯跑出去和同学一起走走古城墙、去网吧锤一夜的 LOL。 - -写下这篇杂文,记录自己逝去的大学生活!希望未来继续砥砺前行,不忘初心! - -## 大一 - -大一那会,我没有把精力放在学习编程上,大部分时间都在参加课外活动。 - -或许是因为来到了一座新鲜的城市,对周围的一切都充满了兴趣。又或许是因为当时的我还比较懵懂,也没有任何学习方向。 - -这一年,我和班里的一群新同学去逛了荆州的很多地方比如荆州博物馆、长江大桥、张居正故居、关帝庙。 - -![大一的一次班级出行](https://oss.javaguide.cn/about-the-author/college-life/41239dd7d18642f7af201292ead94f1a~tplv-k3u1fbpfcp-zoom-1.image.png) - -即使如此,我当时还是对未来充满了希望,憧憬着工作之后的生活。 - -我还记得当时我们 6 个室友那会一起聊天的时候,其他 5 个室友都觉得说未来找工作能找一个 6k 的就很不错了。我当时就说:“怎么得至少也要 8k 吧!”。他们无言,觉得我的想法太天真。 - -其实,我当时内心想的是至少是月薪 1w 起步,只是不太好意思直接说出来。 - -我不爱出风头,性格有点内向。刚上大学那会,内心还是有一点不自信,干什么事情都畏畏缩缩,还是迫切希望改变自己的! - -于是,凭借着一腔热血,我尝试了很多我之前从未尝试过的事情:**露营**、**户外烧烤**、**公交车演讲**、**环跑古城墙**、**徒步旅行**、**异地求生**、**圣诞节卖苹果**、**元旦晚会演出**...。 - -下面这些都是我和社团的小伙伴利用课外时间自己做的,在圣诞节那周基本都卖完了。我记得,为了能够多卖一些,我们还挨个去每一个寝室推销了一遍。 - -![](https://oss.javaguide.cn/about-the-author/college-life/7cf1a2da505249a58e1f29834dbac435~tplv-k3u1fbpfcp-zoom-1.image.png) - -我还参加了大一元旦晚会,不过,那次演出我还是没放开,说实话,感觉没有表现出应该有的那味。 - -![](https://oss.javaguide.cn/about-the-author/college-life/850cae1f8c644c5d920140f66ae9303d~tplv-k3u1fbpfcp-zoom-1.image.png) - -经过这次演出之后,我发现我是真的没有表演的天赋,很僵硬。并且,这种僵硬呆板是自己付出努力之后也没办法改变的。 - -下图是某一次社团聚餐,我喝的有点小醉之后,被朋友拍下的。 - -![](https://oss.javaguide.cn/about-the-author/college-life/82a503e365354bd1bf190540fbf1039a~tplv-k3u1fbpfcp-zoom-1.image.png) - -那时候,还经常和和社团的几位小伙伴一起去夜走荆州古城墙。 - -![某一次要去夜走古城墙的路上我拍的](https://oss.javaguide.cn/about-the-author/college-life/007a83e6d26c43b9aa6e0b0266c3314b~tplv-k3u1fbpfcp-zoom-1.image.png) - -不知道社团的大家现在过得怎么样呢? - -虽然这些经历对于我未来的工作和发展其实没有任何帮助,但却让我的大学生活更加完整,经历了更多有趣的事情,有了更多可以回忆的经历。 - -我的室友们都窝在寝室玩游戏、玩手机的时候,我很庆幸自己做了这些事情。 - -个人感觉,大一的时候参加一些不错的社团活动,认识一些志同道合的朋友还是很不错的! - -**参加课外活动之余,CS 专业的小伙伴,尽量早一点养成一个好的编程习惯,学好一门编程语言,然后平时没事就刷刷算法题。** - -### 办补习班 - -大一暑假的时候,我作为负责人,在孝感的小乡镇上办过 5 个补习班(本来是 7 个,后来砍掉了 2 个) 。 - -从租房子、租借桌椅再到招生基本都是从零开始做的。 - -每个周末我都会从荆州坐车跑到孝感,在各个县城之间来回跑。绝大部分时候,只有我一个人,偶尔也会有几个社团的小伙伴陪我一起。 - -![](https://oss.javaguide.cn/about-the-author/college-life/6ee6358c236144d8a8a205cc6bc99b9b~tplv-k3u1fbpfcp-zoom-1.image.png) - -记忆犹新,那一年孝感也是闹洪水,还挺严重的。 - -![](https://oss.javaguide.cn/javaguide/image-20210820201908759.png) - -有一次我差点回不去学校参加期末考试。虽然没有备考,但是也没有挂过任何一门课,甚至很多科目考的还不错。不过,这还是对我绩点产生了比较大的影响,导致我后面没有机会拿到奖学金。 - -![](https://oss.javaguide.cn/about-the-author/college-life/3c5fe7af43ba4e348244df1692500fce~tplv-k3u1fbpfcp-zoom-1.image.png) - -这次比较赶时间,所以就坐的是火车回学校。在火车上竟然还和别人撞箱子了! - -![](https://oss.javaguide.cn/about-the-author/college-life/570f5791aeb54fa1a76892b69e46fec2~tplv-k3u1fbpfcp-zoom-1.image.png) - -当时去小乡镇上的时候,自己最差的时候住过 15 元的旅馆。真的是 15 元,你没看错。就那种老旧民房的小破屋,没有独卫,床上用品也很不卫生,还不能洗澡。 - -下面这个还是我住过最豪华的一个,因为当时坐客车去了孝感之后,突然下大雨,我就在车站附近找了一个相对便宜点的。 - -![](https://oss.javaguide.cn/about-the-author/college-life/687c3ede3f094c65a72d812ca0f06bb4~tplv-k3u1fbpfcp-zoom-1.image.png) - -为了以更低的价钱租到房子,我经常和房东砍价砍的面红耳赤。 - -说句心里话,这些都是我不太愿意去做的事情,我本身属于比较爱面子而且不那么自信的人。 - -当时,我需要在各个乡镇来回跑,每天就直接顶着太阳晒 。每次吃饭都特别香,随便炒个蔬菜都能吃几碗米饭。 - -我本身是比较挑食的,这次经历让我真正体会到人饿了之后吃嘛嘛香! - -我一个人给 6 个老师加上 10 来个学生和房东们一家做了一个多月的饭,我的厨艺也因此得到了很大的锻炼。 - -![](https://oss.javaguide.cn/about-the-author/college-life/2e3b6101abcd46a8a213c08782aeac33~tplv-k3u1fbpfcp-zoom-1.image.png) - -这些学生有小学的,也有初中的,都比较听话。有很多还是留守儿童,爸爸妈妈在外打工,跟着爷爷奶奶一起生活。 - -加上我的话,我们一共有 4 位老师,我主要讲的是初中和高中的物理课。 - -学生们都挺听话,没有出现和我们几个老师闹过矛盾。只有两个调皮的小学生被我训斥之后,怀恨在心,写下了一些让我忍俊不禁的话!哈哈哈哈!太可爱了! - -![](https://oss.javaguide.cn/about-the-author/college-life/3680cead2c0f4165bb4865f038326b61~tplv-k3u1fbpfcp-zoom-1.image.png) - -离开之前的前一天的晚上,我和老师们商量请一些近点的同学们来吃饭。我们一大早就出去买菜了,下图是做成后的成品。虽然是比较简单的一顿饭,但我们吃的特别香。 - -![补习班的最后一顿晚餐](https://oss.javaguide.cn/about-the-author/college-life/f36bfd719b9b4463b2f1d3edc51faa97~tplv-k3u1fbpfcp-zoom-1.image.png) - -那天晚上还有几个家长专门跑过来看我做饭,家长们说他们的孩子非常喜欢我做的饭,哈哈哈!我表面淡然说自己做的不好,实则内心暗暗自喜,就很“闷骚”的一个人,哈哈哈! - -不知道这些学生们,现在怎么样呢?怀念啊! - -培训班结束,我回家之后,我爸妈都以为我是逃荒回来的。 - -### 自己赚钱去孤儿院 - -大一尾声的时候,还做了一件非常有意义的事情。我和我的朋友们去了一次孤儿院(荆州私立孤儿教养院)。这个孤儿院曾经还被多家电视台报道过,目前也被百度百科收录。 - -![](https://oss.javaguide.cn/about-the-author/college-life/db8f5c276f4d4a7c9d7bd1e6100de301~tplv-k3u1fbpfcp-zoom-1.image.png) - -孤儿院的孩子们,大多是一些无父无母或者本身有一些疾病被父母遗弃的孩子。 - -去之前,我们买了很多小孩子的玩具、文具、零食这些东西。这些钱的来源也比较有意义,都是我和社团的一些小伙伴自己去外面兼职赚的一些钱。 - -![离开之前和创建孤儿院的老爷爷的一张合照](https://oss.javaguide.cn/about-the-author/college-life/cf43853c49bd489a9fc0ee437a2af432~tplv-k3u1fbpfcp-zoom-1.image.png) - -勿以善小而不为!引用《爱的风险》这首歌的一句歌词:“只要人人都献出一点爱,世界将变成美好的人间” 。 - -我想看看这个孤儿院的现状,于是在网上有搜了一下,看到了去年 1 月份荆州新闻网的一份报道。 - -![](https://oss.javaguide.cn/about-the-author/college-life/0ac27206389c498882dd7f6f440c6abb~tplv-k3u1fbpfcp-zoom-1.image.png) - -孤儿教养院创办 33 年来,累计收养孤儿 85 人,其中有 5 人参军入伍报效祖国,20 人上大学,有的早已参加工作并成家立业。 - -叔叔也慢慢老了,白发越来越多。有点心酸,想哭,希望有机会再回去看看您!一定会的! - -![](https://oss.javaguide.cn/about-the-author/college-life/ea803a99c08149f892ca29e784653503~tplv-k3u1fbpfcp-zoom-1.image.png) - -### 徒步旅行 - -大一那会还有一件让我印象非常深刻的事情——徒步旅行。 - -我和一群社团的小伙伴,徒步走了接近 45 公里。我们从学校的西校区,徒步走到了枝江那边的一个沙滩。 - -![](https://oss.javaguide.cn/about-the-author/college-life/94ca5b6c5ea84dfb9e12b7a718587ea3~tplv-k3u1fbpfcp-zoom-1.image.png) - -是真的全程步行,这还是我第一次走这么远。 - -走到目的地的时候,我的双腿已经不听使唤,脚底被磨了很多水泡。 - -我们在沙滩上露营,烧烤,唱歌跳舞,一直到第二天早上才踏上回学校的路程。 - -![](https://oss.javaguide.cn/about-the-author/college-life/8120d45d30254c908f9db20b3c00f514~tplv-k3u1fbpfcp-zoom-1.image.png) - -## 大二 - -到了大二,我开始把自己的重点转移到编程知识的学习上。 - -不过,我遇到一个让我比较纠结的问题:社团里玩的最好的几个朋友为了能让社团能继续延续下去,希望我和他们一起来继续带这个团队。 - -但是,我当时已经规划好了自己大二要做的事情,真的想把精力都放在编程学习上,想要好好沉淀一下自己的技术。 - -迫于无奈,我最终还是妥协,选择了和朋友一起带社团。毕竟,遇到几个真心的朋友属实不易! - -### 带社团 - -带社团确实需要花费很多业余时间,除了每周要从东校区打车到西校区带着他们跑步之外,我们还需要经常带着他们组织一些活动。 - -比如我们一起去了长江边上烧烤露营。 - -![](https://oss.javaguide.cn/about-the-author/college-life/8a6945ccc087017c1f96ee93f3af8178-20220608154206500.png) - -再比如我们一起去环跑了古城墙。 - -![](https://oss.javaguide.cn/about-the-author/college-life/2cfba22049e8b99e11955bcb7662d790.png) - -大学那会,我还是非常热爱运动的! - -![](https://oss.javaguide.cn/about-the-author/college-life/2dd503a60f814a7a953816bc3b5194cd~tplv-k3u1fbpfcp-zoom-1.image.png) - -大二那会,我就已经环跑了 3 次古城墙。 - -![](https://oss.javaguide.cn/about-the-author/college-life/949543b550e847d5a7314b7e1842489b~tplv-k3u1fbpfcp-zoom-1.image.png) - -### 加入长大在线 - -在大二的时候,我还加入了学校党委宣传部下的组织——长大在线。这是一个比较偏技术性质的组织,主要负责帮学校做做网站、APP 啥的。 - -在百度上,还能搜索到长大在线的词条。 - -![](https://oss.javaguide.cn/about-the-author/college-life/34ecf650120a4289a68b7549eb7d00cc~tplv-k3u1fbpfcp-zoom-1.image.png) - -莫名其妙还被发了一个记者证,哈哈哈! - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20220606121111042.png) - -我选的是安卓组,然后我就开始了学习安卓开发的旅程。 - -刚加入这个组织的时候,我连 HTML、CSS、JS、Java、Linux 这些名词都不知道啥意思。 - -再到后面,我留下来当了副站长,继续为组织服务了大半年多。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20220608121413761.png) - -### 第一次参加比赛 - -那会也比较喜欢去参加一些学校的比赛,也获得过一些不错的名次,让我印象最深的是一次 PPT 大赛,这也是我第一次参加学校的比赛。 - -参加比赛之前,自己也是一个 PPT 小白,苦心学了一周多之后,我的一个作品竟然顺利获得了第一名。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20220608121446529.png) - -也正是因为这次比赛,我免费拥有了自己的第一个机械键盘,这个键盘陪我度过了后面的大学生活。 - -### 确定技术方向 - -在大二上学期末,我最终确定了自己以后要走的技术方向是走 Java 后端。于是,我就开始制定学习计划,开始了自己的 Java 后端领域的打怪升级之路。 - -每次忙到很晚,一个人走在校园的时候还是很爽的!非常喜欢这种安静的感觉。 - -![](https://oss.javaguide.cn/about-the-author/college-life/336fd489ce314d259d6090194f237e1b~tplv-k3u1fbpfcp-zoom-1.image.png) - -当时身体素质真好,熬夜之后第二天照常起来上课学习。现在熬个夜,后面两天直接就废了! - -到了大三,我基本把 Java 后端领域一些必备的技术都给过了一遍,还用自己学的东西做了两个实战项目。 - -由于缺少正确的人指导,我当时学的时候也走了很多弯路,浪费了不少时间(我很羡慕大家能有我,就很厚脸皮!)。 - -那个时候还贼自恋,没事就喜欢自拍一张。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20210820202341008.png) - -国庆节的时候也不回家,继续在学校刷 Java 视频和书籍。 - -我记得那次国庆节的时候效率还是非常高的,学习起来也特别有动力。 - -![](https://oss.javaguide.cn/about-the-author/college-life/WX20210820-203458.png) - -## 大三 - -整个大三,我依然没有周末,基本没有什么娱乐时间。绝大部分时间都是一个人在寝室默默学习,平时偶尔也会去图书馆和办公室。 - -虽然室友经常会玩游戏和看剧什么的,但是我对我并没有什么影响。一个人戴上耳机之后,世界仿佛都是自己的。 - -和很多大佬可能不太一样,比起图书馆和办公室,我在寝室的学习效率更高一些。 - -### JavaGuide 诞生 - -我的开源项目 JavaGuide 和公众号都是这一年启动的。 - -![](https://oss.javaguide.cn/about-the-author/college-life/the-birth-of-javaguide.jpeg) - -目前的话,JavaGuide 也已经 100k star ,我的公众号也已经有 15w+ 的关注。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20210820211926742.png) - -### 接私活赚钱 - -一些机遇也让我这一年也接了一些私活赚钱。为了能够顺利交付,偶尔也会熬夜。当时的心态是即使熬夜也还是很开心、充实。每次想到自己通过技术赚到了钱,就会非常有动力。 - -我也曾写过文章分享过接私活的经历:[唠唠嗑!大学那会接私活赚了 3w+](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247499539&idx=1&sn=ff153f9bd98bb3109b1f14e58ed9a785&chksm=cea1b0d8f9d639cee4744f845042df6b1fc319f4383b87eba76a944c2648c81a51c28d25e3b6&token=2114015135&lang=zh_CN#rd) 。 - -不过,我接的几个私活也是比较杂的,并不太适合作为简历上的项目经历。 - -于是,为了能让简历上的项目经历看着更好看一些,我自己也找了两个项目做。一个是我跟着视频一起做的,是一个商城类型的项目。另外一个是自己根据自己的想法做的,是一个视频网站类型的项目。 - -商城类型的项目大概的架构图如下(没有找到当时自己画的原图): - -![](https://oss.javaguide.cn/about-the-author/college-life/206fab84bf5b4c048f8a88bc68c942f6~tplv-k3u1fbpfcp-zoom-1.image.png) - -那会商城项目貌似也已经烂大街了,用的人比较多。为了让自己的商城项目更有竞争力,对照着视频教程做完之后,我加入了很多自己的元素比如更换消息队列 ActiveMQ 为 Kafka、增加二级缓存。 - -在暑假的时候,还和同学老师一起做了一个员工绩效管理的企业真实项目。这个项目和我刚进公司做的项目,非常非常相似,不过公司做得可能更高级点 ,代码质量也要更高一些。实在是太巧了! - -我记得当时自己独立做项目的时候,遇到了很多问题。**就很多时候,你看书很容易就明白的东西,等到你实践的时候,总是会遇到一些小问题。我一般都是通过 Google 搜索解决的,用好搜索引擎真的能解决自己 99% 的问题。** - -### 参加软件设计大赛 - -大三这一年也有遗憾吧!我和几位志同道合的朋友一起参加过一个软件设计大赛,我们花了接近两个月做的系统顺利进入了复赛。 - -不过,我后面因为自己个人觉得再花时间做这个系统学不到什么东西还浪费时间就直接退出了。然后,整个团队就散了。 - -其实,先来回头看也是可以学到东西的,自己当时的心态有点飘了吧,心态有一些好高骛远。 - -现在想来,还是挺对不起那些一起奋斗到深夜的小伙伴。 - -人生就是这样,一生很长,任何时候你回头看过去的自己,肯定都会有让自己后悔的事情。 - -### 放弃读研 - -当时,我也有纠结过是否读研,毕竟学校确实一般,读个研确实能够镀点金,提升一下学历。 - -不过,我最终还是放弃了读研。当时比较自信,心里就觉得自己不需要读研也能够找到好工作。 - -### 实习 - -大三还找了一家离学校不远的公司实习,一位老学长创办的。不过,说实话哈,总体实习体验很差,没有学到什么东西不说,还耽误了自己很多已经计划好的事情。 - -我记得当时这个公司很多项目还是在用 JSP,用的技术很老。如果是老项目还好,我看几个月前启动的项目也还是用的 JSP,就很离谱。。。 - -当时真的很难受,而且一来就想着让你上手干活,活还贼多,干不完还想让你免费加班。。。 - -当时也没办法,因为荆州实在是找不到其他公司可以让你实习,你又没办法跑到其他城市去实习。这也是放弃选择一二线城市的学校带来的问题吧! - -## 大四 - -### 开始找工作 - -找实习找工作时候,才知道大学所在的城市的重要性。 - -由于,我的学校在荆州,而且本身学校就很一般,因此,基本没有什么比较好的企业来招人。 - -当时,唯一一个还算可以的就是苏宁,不过,我遇到的那个苏宁的 HR 还挺恶心的,第一轮面试的时候就开始压薪资了,问我能不能加班。然后,我也就对苏宁没有了想法。 - -秋招我犯了一个比较严重的问题,那就是投递简历开始的太晚。我是把学校的项目差不多做完之后,才开始在网上投递简历。这个时候,暑假差不多已经结束了,秋招基本已经尾声了。 - -可能也和学校环境有一些关系,当时,身边的同学没有参加秋招的。大三暑假的时候,都跑去搞学院组织的实习。我是留在学校做项目,没有去参加那次实习。 - -我觉得学校还是非常有必要提醒学生们把握住秋招这次不错的机会的! - -在网上投递了一些简历之后,很多笔试我觉得做的还可以的都没有回应。 - -我有点慌了!于是,我就从荆州来到武汉,想在武大华科这些不错的学校参加一些宣讲会。 - -到了武汉之后,我花了一天时间找了一个蛋壳公寓住下。第二天,我就跑去武汉理工大学参加宣讲会。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20210820204919942.png) - -当天,我就面试了自己求职过程中的第一家公司—**玄武科技**。 - -就是这样一家中小型的公司,当时来求职面试的很多都是武大华科的学生。不过,他们之中一定有很多人和我一样,就是单纯来刷一波经验,找找信心。 - -整个过程也就持续了 3 天左右,我就顺利的拿下了玄武科技的 offer。不过,最终没有签约。 - -### 拿到 Offer - -来武汉之前,我实际上已经在网上投递了 **ThoughtWorks**,并且,作业也已经通过了。 - -当时,我对 ThoughtWorks 是最有好感的,内心的想法就是:“拿下了 ThoughtWorks,就不再面试其他公司了”。 - -奈何 ThoughtWorks 的进度太慢,担心之余,才来武汉面试其他公司留个保底。 - -不过,我最终如愿以偿获得了 ThoughtWorks 的 offer。 - -![](https://oss.javaguide.cn/about-the-author/college-life/9ad97dcc5038499b96239dd826c471b7~tplv-k3u1fbpfcp-zoom-1.image.png) - -面试 ThoughtWorks 的过程就不多说了,我在[《结束了我短暂的秋招,说点自己的感受》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484842&idx=1&sn=4489dfab0ef2479122b71407855afc71&chksm=cea24a61f9d5c3774a8ed67c5fcc3234cb0741fbe831152986e5d1c8fb4f36a003f4fb2f247e&scene=178&cur_album_id=1323354342556057602#rd)这篇文章中有提到。 - -## 几点建议 - -说几点自己的建议,虽然我不优秀,但毕竟你可以更优秀: - -1. 确定好自己的方向,搞清你是要考研还是要找工作。如果你要考研的话,好好上每一门可能是考研的科目,平时有时间也要敲代码,最好也能做一个项目,对你复试还有能力提升都有帮助。找工作的话,尽早确定好自己的方向,心里有一个规划,搞清自己的优势和劣势。 -2. 尽可能早一点以求职为导向来学习,这样更有针对性,并且可以大概率减己处在迷茫的时间,很大程度上还可以让自己少走很多弯路。 -3. 自学很重要,养成自学的习惯,学会学习。 -4. 不要觉得逃课就是坏学生。我大学逃了很多课,逃课的大部分时间都是在学自己觉得更重要的东西,逃的大部分也是不那么重要并且不会影响我毕业的课。 -5. 大学恋爱还是相对来说很纯粹的,遇到合适的可以尝试去了解一下, 别人不喜欢你的话不要死缠烂打,这种东西强求不来。你不得不承认,你了解一个人欲望还是始于他的长相而并不是有趣的灵魂。 -6. 管理自己的身材,没事去跑跑步,别当油腻男。 -7. 别太看重绩点。我觉得绩点对于找工作还有考研实际的作用都可以忽略不计,不过不挂科还是比较重要的。但是,绩点确实在奖学金评选和保研名额选取上占有最大的分量。 -8. 别太功利性。做事情以及学习知识都不要奢求它能立马带给你什么,坚持和功利往往是成反比的。 -9. …… - -## 后记 - -我们在找工作的过程中难免会遇到卡学历的情况,特别是我们这种学校本身就比较一般的。我觉得这真的不可厚非,没有什么不公平,要怪就只能怪自己没有考上好的学校。 - -**考虑到招聘成本和时间,公司一定更愿意在学校本身比较好的人中选拔人才。** - -我也曾抱怨过自己为什么不在 211 或者 985 的学校。但,其实静下心来想一想,本来考不上 211 或者 985 就是自己的问题,而且在我们计算机这个领域,学历本身就相对于其他专业稍微要更加公平一点。 - -我身边专科、三本毕业就进大厂的人也比比皆是。我这句话真不是鸡汤,为了鼓励一些学校出身不太好的朋友。 - -**多行动,少抱怨。** diff --git a/docs/about-the-author/readme.md b/docs/about-the-author/readme.md deleted file mode 100644 index 032f1ed56f4b72ae9e46835c3cd423a651816436..0000000000000000000000000000000000000000 --- a/docs/about-the-author/readme.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: 个人介绍 Q&A -category: 走近作者 ---- - - - -这篇文章我会通过 Q&A 的形式简单介绍一下我自己。 - -## 我是什么时候毕业的? - -很多老读者应该比较清楚,我是 19 年本科毕业的,刚毕业就去了某家外企“养老”。 - -我的学校背景是比较差的,高考失利,勉强过了一本线 20 来分,去了荆州的一所很普通的双非一本。不过,还好我没有因为学校而放弃自己,反倒是比身边的同学都要更努力,整个大学还算过的比较充实。 - -下面这张是当时拍的毕业照(后排最中间的就是我): - -![](https://oss.javaguide.cn/javaguide/%E4%B8%AA%E4%BA%BA%E4%BB%8B%E7%BB%8D.png) - -## 我坚持写了多久博客? - -时间真快啊!我自己是从大二开始写博客的。那时候就是随意地在博客平台上发发自己的学习笔记和自己写的程序。就比如 [谢希仁老师的《计算机网络》内容总结](../cs-basics/network/computer-network-xiexiren-summary.md) 这篇文章就是我在大二学习计算机网络这门课的时候对照着教材总结的。 - -身边也有很多小伙伴经常问我:“我现在写博客还晚么?” - -我觉得哈!如果你想做什么事情,尽量少问迟不迟,多问自己值不值得,只要你觉得有意义,就尽快开始做吧!人生很奇妙,我们每一步的重大决定,都会对自己未来的人生轨迹产生影响。是好还是坏,也只有我们自己知道了! - -对我自己来说,坚持写博客这一项决定对我人生轨迹产生的影响是非常正面的!所以,我也推荐大家养成坚持写博客的习惯。 - -## 我在大学期间赚了多少钱? - -在校期间,我还通过办培训班、接私活、技术培训、编程竞赛等方式变现 20w+,成功实现“经济独立”。我用自己赚的钱去了重庆、三亚、恩施、青岛等地旅游,还给家里补贴了很多,减轻了父母的负担。 - -下面这张是我大一下学期办补习班的时候拍的(离开前的最后一顿饭): - -![补习班的最后一顿晚餐](https://oss.javaguide.cn/p3-juejin/f36bfd719b9b4463b2f1d3edc51faa97~tplv-k3u1fbpfcp-zoom-1.jpeg) - -下面这张是我大三去三亚的时候拍的: - -![](https://oss.javaguide.cn/javaguide/psc.jpeg) - -其实,我在大学就这么努力地开始赚钱,也主要是因为家庭条件太一般,父母赚钱都太辛苦了!也正是因为我自己迫切地想要减轻父母的负担,所以才会去尝试这么多赚钱的方法。 - -我发现做咱们程序员这行的,很多人的家庭条件都挺一般的,选择这个行业的很大原因不是因为自己喜欢,而是为了多赚点钱。 - -如果你也想通过接私活变现的话,可以在我的公众号后台回复“**接私活**”来了解一些我的个人经验分享。 - -
- -
- -## 为什么自称 Guide? - -可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide 哥**。 - -后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide**。 - -我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思,给大家拆解一下就清楚了。SnailClimb=Snail(蜗牛)+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁 - -![](https://oss.javaguide.cn/p3-juejin/37599546f3b34b92a32db579a225aa45~tplv-k3u1fbpfcp-watermark.png) - -## 后记 - -凡心所向,素履所往,生如逆旅,一苇以航。 - -生活本就是有苦有甜。共勉! - -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/about-the-author/writing-technology-blog-six-years.md b/docs/about-the-author/writing-technology-blog-six-years.md deleted file mode 100644 index 9e18a67d8c4767eb0b671c6a7b89a1db1c093211..0000000000000000000000000000000000000000 --- a/docs/about-the-author/writing-technology-blog-six-years.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: 坚持写技术博客六年了! -category: 走近作者 -tag: - - 杂谈 ---- - -坚持写技术博客已经有六年了,也算是一个小小的里程碑了。 - -一开始,我写技术博客就是简单地总结自己课堂上学习的课程比如网络、操作系统。渐渐地,我开始撰写一些更为系统化的知识点详解和面试常见问题总结。 - -![JavaGuide 首页](https://oss.javaguide.cn/about-the-author/college-life/image-20230408131717766.png) - -许多人都想写技术博客,但却不清楚这对他们有何好处。有些人开始写技术博客,却不知道如何坚持下去,也不知道该写些什么。这篇文章我会认真聊聊我对记录技术博客的一些看法和心得,或许可以帮助你解决这些问题。 - -## 写技术博客有哪些好处? - -### 学习效果更好,加深知识点的认识 - -**费曼学习法** 大家应该已经比较清楚了,这是一个经过实践证明非常有效的学习方式。费曼学习法的命名源自 Richard Feynman,这位物理学家曾获得过诺贝尔物理学奖,也曾参与过曼哈顿计划。 - -所谓费曼学习法,就是当你学习了一个新知识之后,想象自己是一个老师:用最简单、最浅显直白的话复述、表达复杂深奥的知识,最好不要使用行业术语,让非行业内的人也能听懂。为了达到这种效果,最好想象你是在给一个 80 多岁或 8 岁的小孩子上课,甚至他们都能听懂。 - -![教授别人学习效果最好](https://oss.javaguide.cn/about-the-author/college-life/v2-19373c2e61873c5083ee4b1d1523f8f5_720w.png) - -看书、看视频这类都属于是被动学习,学习效果比较差。费曼学习方法属于主动学习,学习效果非常好。 - -**写技术博客实际就是教别人的一种方式。** 不过,记录技术博客的时候是可以有专业术语(除非你的文章群体是非技术人员),只是你需要用自己的话表述出来,尽量让别人一看就懂。**切忌照搬书籍或者直接复制粘贴其他人的总结!** - -如果我们被动的学习某个知识点,可能大部分时候都是仅仅满足自己能够会用的层面,你并不会深究其原理,甚至很多关键概念都没搞懂。 - -如果你是要将你所学到的知识总结成一篇博客的话,一定会加深你对这个知识点的思考。很多时候,你为了将一个知识点讲清楚,你回去查阅很多资料,甚至需要查看很多源码,这些细小的积累在潜移默化中加深了你对这个知识点的认识。 - -甚至,我还经常会遇到这种情况:**写博客的过程中,自己突然意识到自己对于某个知识点的理解存在错误。** - -**写博客本身就是一个对自己学习到的知识进行总结、回顾、思考的过程。记录博客也是对于自己学习历程的一种记录。随着时间的流逝、年龄的增长,这又何尝不是一笔宝贵的精神财富呢?** - -知识星球的一位球友还提到写技术博客有助于完善自己的知识体系: - -![写技术博客有助于完善自己的知识体系](https://oss.javaguide.cn/about-the-author/college-life/image-20230408121336432.png) - -### 帮助别人的同时获得成就感 - -就像我们程序员希望自己的产品能够得到大家的认可和喜欢一样。我们写技术博客在某一方面当然也是为了能够得到别人的认可。 - -**当你写的东西对别人产生帮助的时候,你会产生成就感和幸福感。** - -![读者的认可](https://oss.javaguide.cn/about-the-author/college-life/image-20230404181906257.png) - -这种成就感和幸福感会作为 **正向反馈** ,继续激励你写博客。 - -但是,即使受到很多读者的赞赏,也要保持谦虚学习的太多。人外有人,比你技术更厉害的读者多了去,一定要虚心学习! - -当然,你可以可能会受到很多非议。可能会有很多人说你写的文章没有深度,还可能会有很多人说你闲的蛋疼,你写的东西网上/书上都有。 - -**坦然对待这些非议,做好自己,走好自己的路就好!用行动自证!** - -### 可能会有额外的收入 - -写博客可能还会为你带来经济收入。输出价值的同时,还能够有合理的经济收入,这是最好的状态! - -为什么说是可能呢? **因为就目前来看,大部分人还是很难短期通过写博客有收入。我也不建议大家一开始写博客就奔着赚钱的目的,这样功利性太强了,效果可能反而不好。就比如说你坚持了写了半年发现赚不到钱,那你可能就会坚持不下去了。** - -我自己从大二开始写博客,大三下学期开始将自己的文章发布到公众号上,一直到大四下学期,才通过写博客赚到属于自己的第一笔钱。 - -第一笔钱是通过微信公众号接某培训机构的推广获得的。没记错的话,当时通过这个推广为自己带来了大约 **500** 元的收入。虽然这不是很多,但对于还在上大学的我来说,这笔钱非常宝贵。那时我才知道,原来写作真的可以赚钱,这也让我更有动力去分享自己的写作。可惜的是,在接了两次这家培训机构的广告之后,它就倒闭了。 - -之后,很长一段时间我都没有接到过广告。直到网易的课程合作找上门,一篇文章 1000 元,每个月接近一篇,发了接近两年,这也算是我在大学期间比较稳定的一份收入来源了。 - -![网易的课程合作](https://oss.javaguide.cn/about-the-author/college-life/image-20230408115720135.png) - -老粉应该大部分都是通过 JavaGuide 这个项目认识我的,这是我在大三开始准备秋招面试时创建的一个项目。没想到这个项目竟然火了一把,一度霸占了 GitHub 榜单。可能当时国内这类开源文档教程类项目太少了,所以这个项目受欢迎程度非常高。 - -![JavaGuide Star 趋势](https://oss.javaguide.cn/about-the-author/college-life/image-20230408131849198.png) - -项目火了之后,有一个国内比较大的云服务公司找到我,说是要赞助 JavaGuide 这个项目。我既惊又喜,担心别人是骗子,反复确认合同之后,最终确定以每月 1000 元的费用在我的项目首页加上对方公司的 banner。 - -随着时间的推移,以及自己后来写了一些比较受欢迎、比较受众的文章,我的博客知名度也有所提升,通过写博客的收入也增加了不少。 - -### 增加个人影响力 - -写技术博客是一种展示自己技术水平和经验的方式,能够让更多的人了解你的专业领域知识和技能。持续分享优质的技术文章,一定能够在技术领域增加个人影响力,这一点是毋庸置疑的。 - -有了个人影响力之后,不论是对你后面找工作,还是搞付费知识分享或者出书,都非常有帮助。 - -拿我自己来说,已经很多知名出版社的编辑找过我,协商出一本的书的事情。这种机会应该也是很多人梦寐以求的。不过,我都一一拒绝了,因为觉得自己远远没有达到能够写书的水平。 - -![电子工业出版社编辑邀约出书](https://oss.javaguide.cn/about-the-author/college-life/image-20230408121132211.png) - -其实不出书最主要的原因还是自己嫌麻烦,整个流程的事情太多了。我自己又是比较佛系随性的人,平时也不想把时间都留给工作。 - -## 怎样才能坚持写技术博客? - -**不可否认,人都是有懒性的,这是人的本性。我们需要一个目标/动力来 Push 一下自己。** - -就技术写作而言,你的目标可以以技术文章的数量为标准,比如: - -- 一年写多少篇技术文章。我个人觉得一年的范围还是太长了,不太容易定一个比较合适的目标。 -- 每月输出一篇高质量的技术文章。这个相对容易实现一些,每月一篇,一年也有十二篇了,也很不错了。 - -不过,以技术文章的数量为目标有点功利化,文章的质量同样很重要。一篇高质量的技术文可能需要花费一周甚至半个月的业余时间才能写完。一定要避免自己刻意追求数量,而忽略质量,迷失技术写作的本心。 - -我个人给自己定的目标是:**每个月至少写一篇原创技术文章或者认真修改完善过去写的三篇技术文章** (像开源项目推荐、开源项目学习、个人经验分享、面经分享等等类型的文章不会被记入)。 - -我的目标对我来说比较容易完成,因此不会出现为了完成目标而应付任务的情况。在我状态比较好,工作也不是很忙的时候,还会经常超额完成任务。下图是我今年 3 月份完成的任务(任务管理工具:Microsoft To-Do)。除了 gossip 协议是去年写的之外,其他都是 3 月份完成的。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20230404181033089.png) - -如果觉得以文章数量为标准过于功利的话,也可以比较随性地按照自己的节奏来写作。不过,一般这种情况下,你很可能过段时间就忘了还有这件事,开始慢慢抵触写博客。 - -写完一篇技术文章之后,我们不光要同步到自己的博客,还要分发到国内一些常见的技术社区比如博客园、掘金。**分发到其他平台的原因是获得关注进而收获正向反馈(动力来源之一)与建议,这是技术写作能坚持下去的非常重要的一步,一定要重视!!!** - -说实话,当你写完一篇自认为还不错的文章的幸福感和成就感还是有的。**但是,让自己去做这件事情还是比较痛苦的。** 就好比你让自己出去玩很简单,为了达到这个目的,你可以有各种借口。但是,想要自己老老实实学习,还是需要某个外力来督促自己的。 - -## 写哪些方向的博客比较好? - -通常来说,写下面这些方向的博客会比较好: - -1. **详细讲解某个知识点**:一定要有自己的思考而不是东拼西凑。不仅要介绍知识点的基本概念和原理,还需要适当结合实际案例和应用场景进行举例说明。 -2. **问题排查/性能优化经历**:需要详细描述清楚具体的场景以及解决办法。一定要有足够的细节描述,包括出现问题的具体场景、问题的根本原因、解决问题的思路和具体步骤等等。同时,要注重实践性和可操作性,帮助读者更好地学习理解。 -3. **源码阅读记录**:从一个功能点出发描述其底层源码实现,谈谈你从源码中学到了什么。 - -最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。 - -详见 [Markdown 规范](../javaguide/contribution-guideline.md) (很重要,尽量按照规范来,对你工作中写文档会非常有帮助) - -## 有没有什么写作技巧分享? - -### 句子不要过长 - -句子不要过长,尽量使用短句(但也不要太短),这样读者更容易阅读和理解。 - -### 尽量让文章更加生动有趣 - -尽量让文章更加生动有趣,比如你可以适当举一些形象的例子、用一些有趣的段子、歇后语或者网络热词。 - -不过,这个也主要看你的文章风格。 - -### 使用简单明了的语言 - -避免使用阅读者可能无法理解的行话或复杂语言。 - -注重清晰度和说服力,保持简单。简单的写作是有说服力的,一个五句话的好论点会比一百句话的精彩论点更能打动人。为什么格言、箴言这类文字容易让人接受,与简洁、直白也有些关系。 - -### 使用视觉效果 - -图表、图像等视觉效果可以让朴素的文本内容更容易理解。记得在适当的地方使用视觉效果来增强你的文章的表现力。 - -![](https://oss.javaguide.cn/about-the-author/college-life/image-20230404192458759.png) - -### 技术文章配图色彩要鲜明 - -下面是同样内容的两张图,都是通过 drawio 画的,小伙伴们更喜欢哪一张呢? - -我相信大部分小伙伴都会选择后面一个色彩更鲜明的! - -色彩的调整不过花费了我不到 30s 的时间,带来的阅读体验的上升却是非常之大! - -![](https://oss.javaguide.cn/2021-1/image-20210104182517226.png) - -### 确定你的读者 - -写作之前,思考一下你的文章的主要受众全体是谁。受众群体确定之后,你可以根据受众的需求和理解水平调整你的写作风格和内容难易程度。 - -### 审查和修改 - -在发表之前一定要审查和修改你的文章。这将帮助你发现错误、澄清任何令人困惑的信息并提高文档的整体质量。 - -**好文是改出来的,切记!!!** - -## 总结 - -总的来说,写技术博客是一件利己利彼的事情。你可能会从中收获到很多东西,你写的东西也可能对别人也有很大的帮助。但是,写技术博客还是比较耗费自己时间的,你需要和工作以及生活做好权衡。 diff --git a/docs/about-the-author/zhishixingqiu-two-years.md b/docs/about-the-author/zhishixingqiu-two-years.md deleted file mode 100644 index c3bdc72609bf21af6253d716f2cb966b6366ec81..0000000000000000000000000000000000000000 --- a/docs/about-the-author/zhishixingqiu-two-years.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: 我的知识星球快 3 岁了! -category: 知识星球 -star: 2 ---- - - - -截止到今天,我认真维护了接近四年的星球已经有 **2.3w+** 的同学加入了,也算是达成了自己当初的目标。虽然比不上很多大佬,但这于我来说也算是小有成就了,真的很满足了!我确信自己是一个普通人,能做成这些,也不过是在兴趣和运气的加持下赶上了时代而已。 - -![](https://oss.javaguide.cn/xingqiu/640.png) - -在 **2019 年 12 月 29 号**,经过了大概一年左右的犹豫期,我正式确定要开始做一个自己的星球,帮助学习 Java 和准备 Java 面试的同学。一转眼,马上快要四年了。感谢大家一路陪伴,我会信守承诺,继续认真维护这个纯粹的 Java 知识星球,不让信任我的读者失望。 - -![](https://oss.javaguide.cn/xingqiu/640-20230727145252757.png) - -我应该是最早一批做星球的技术号主,最开始的一两年,纯粹靠爱发电。当初定价非常低(一顿饭钱),加上刚工作的时候比较忙,提供的服务也没有现在这么多。 - -**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到他人!** - -## 什么是知识星球? - -简单来说,知识星球就是一个私密交流圈子,主要用途是知识创作者连接铁杆读者/粉丝。相比于微信群,知识星球内容沉淀、信息管理更高效。 - -![](https://oss.javaguide.cn/xingqiu/image-20220211223754566.png) - -## 我的知识星球能为你提供什么? - -努力做一个最优质的 Java 面试交流星球!加入到我的星球之后,你将获得: - -1. 6 个高质量的专栏永久阅读,内容涵盖面试,源码解析,项目实战等内容! -2. 多本原创 PDF 版本面试手册免费领取。 -3. 免费的简历修改服务(已经累计帮助 5000+ 位球友修改简历)。 -4. 一对一免费提问交流(专属建议,走心回答)。 -5. 专属求职指南和建议,让你少走弯路,效率翻倍! -6. 海量 Java 优质面试资源分享。 -7. 打卡活动,读书交流,学习交流,让学习不再孤单,报团取暖。 -8. 不定期福利:节日抽奖、送书送课、球友线下聚会等等。 -9. …… - -其中的任何一项服务单独拎出来价值都远超星球门票了。 - -这里再送一个 **30** 元的星球专属优惠券吧,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)! - -![知识星球30元优惠卷](https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuan-30.jpg) - -### 专属专栏 - -星球更新了 **《Java 面试指北》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完)、**《Kafka 常见面试题/知识点总结》** 等多个优质专栏。 - -![](https://oss.javaguide.cn/xingqiu/image-20220211231206733.png) - -《Java 面试指北》内容概览: - -![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png) - -进入星球之后,这些专栏即可免费永久阅读,永久同步更新! - -### PDF 面试手册 - -免费赠送多本优质 PDF 面试手册。 - -![星球 PDF 面试手册](https://oss.javaguide.cn/xingqiu/image-20220723120918434.png) - -### 优质精华主题沉淀 - -星球沉淀了几年的优质精华主题,内容涵盖面经、面试题、工具网站、技术资源、程序员进阶攻略等内容,干货非常多。 - -![](https://oss.javaguide.cn/xingqiu/image-20230421154518800.png) - -并且,每个月都会整理出当月优质的主题,方便大家阅读学习,避免错过优质的内容。毫不夸张,单纯这些优质主题就足够门票价值了。 - -![星球每月优质主题整理概览](https://oss.javaguide.cn/xingqiu/image-20230902091117181.png) - -加入星球之后,一定要记得抽时间把星球精华主题看看,相信你一定会有所收货! - -JavaGuide 知识星球优质主题汇总传送门:(为了避免这里成为知识杂货铺,我会对严格筛选入选的优质主题)。 - -![星球优质主题汇总](https://oss.javaguide.cn/xingqiu/Xnip2023-04-21_15-48-13.png) - -### 简历修改 - -一到面试季,我平均一天晚上至少要看 15 ~30 份简历。过了面试季的话,找我看简历的话会稍微少一些。要不然的话,是真心顶不住! - -![](https://oss.javaguide.cn/xingqiu/image-20220304123156348.png) - -简单统计了一下,到目前为止,我至少帮助 **6000+** 位球友提供了免费的简历修改服务。 - -![](https://oss.javaguide.cn/xingqiu/%E7%AE%80%E5%8E%86%E4%BF%AE%E6%94%B92.jpg) - -我会针对每一份简历给出详细的修改完善建议,用心修改,深受好评! - -![](https://oss.javaguide.cn/xingqiu/image-20220725093504807.png) - -### 一对一提问 - -你可以和我进行一对一免费提问交流,我会很走心地回答你的问题。到目前为止,已经累计回答了 **2000+** 个读者的提问。 - -![](https://oss.javaguide.cn/xingqiu/wecom-temp-151578-45e66ccd48b3b5d3baa8673d33c7b664.jpg) - -![](https://oss.javaguide.cn/xingqiu/image-20220211223559179.png) - -### 学习打卡 - -星球的学习打卡活动可以督促自己和其他球友们一起学习交流。 - -![](https://oss.javaguide.cn/xingqiu/image-20220308143815840.png) - -看球友们的打卡也能有收货,最重要的是这个学习氛围对于自己自律非常有帮助! - -![](https://oss.javaguide.cn/xingqiu/%E7%90%83%E5%8F%8B%E6%AF%8F%E6%97%A5%E6%89%93%E5%8D%A1%E4%B9%9F%E8%83%BD%E5%AD%A6%E5%88%B0%E5%BE%88%E5%A4%9A%E4%B8%9C%E8%A5%BF.jpg) - -![](https://oss.javaguide.cn/xingqiu/%E7%A1%AE%E5%AE%9E%E6%98%AF%E5%AD%A6%E4%B9%A0%E4%BA%A4%E6%B5%81%E7%9A%84%E5%A5%BD%E5%9C%B0%E6%96%B9.jpg) - -### 读书活动 - -定期会举办读书活动(奖励丰厚),我会带着大家一起读一些优秀的技术书籍! - -![](https://oss.javaguide.cn/xingqiu/image-20220211233642079.png) - -每一期读书活动的获奖率都非常非常非常高!直接超过门票价!!! - -### 不定时福利 - -不定时地在星球送书、送专栏、发红包,福利多多, - -![](https://oss.javaguide.cn/xingqiu/1682063464099.png) - -## 是否收费? - -星球是需要付费才能进入的。 **为什么要收费呢?** - -1. 维护好星球是一件费时费力的事情,每到面试季,我经常凌晨还在看简历和回答球友问题。市面上单单一次简历修改服务也至少需要 200+,而简历修改也只是我的星球提供的服务的冰山一角。除此之外,我还要抽时间写星球专属的一些专栏,单单是这些专栏的价值就远超星球门票了。 -2. 星球提供的服务比较多,如果我是免费提供这些服务的话,是肯定忙不过来的。付费这个门槛可以帮我筛选出真正需要帮助的那批人。 -3. 免费的东西才是最贵的,加入星球之后无任何其他需要付费的项目,统统免费! -4. 合理的收费是对我付出劳动的一种正向激励,促进我继续输出!同时,这份收入还可以让我们家人过上更好的生活。虽然累点,但也是值得的! - -另外,这个是一年的,到明年这个时候结束,差不过够用了。如果服务结束的时候你还需要星球服务的话,可以添加我的微信(**javaguide1024**)领取一个续费优惠卷,半价基础再减 10,记得备注 **“续费”** 。 - -## 如何加入? - -这里赠送一个 **30** 元的星球专属优惠券吧,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)! - -![知识星球30元优惠卷](https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuan-30.jpg) - -进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。另外,建议你添加一下我的个人微信( **javaguide1024** ,备注 **“星球”** ,生活号,球友专属),方便后续交流沟通。 - -![个人微信](https://oss.javaguide.cn/xingqiu/weixin-guidege666.jpeg) - -**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!** - -不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。 diff --git a/docs/books/cs-basics.md b/docs/books/cs-basics.md deleted file mode 100644 index e67ac115964d23b7621fba0f48a5127aa70e145e..0000000000000000000000000000000000000000 --- a/docs/books/cs-basics.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -title: 计算机基础必读经典书籍 -category: 计算机书籍 -icon: "computer" -head: - - - meta - - name: keywords - content: 计算机基础书籍精选 ---- - -考虑到很多同学比较喜欢看视频,因此,这部分内容我不光会推荐书籍,还会顺便推荐一些我觉得不错的视频教程和各大高校的 Project。 - -## 操作系统 - -**为什么要学习操作系统?** - -**从对个人能力方面提升来说**,操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。比如说我们开发的系统使用的缓存(比如 Redis)和操作系统的高速缓存就很像。CPU 中的高速缓存有很多种,不过大部分都是为了解决 CPU 处理速度和内存处理速度不对等的问题。我们还可以把内存可以看作外存的高速缓存,程序运行的时候我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。同样地,我们使用的 Redis 缓存就是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题。高速缓存一般会按照局部性原理(2-8 原则)根据相应的淘汰算法保证缓存中的数据是经常会被访问的。我们平常使用的 Redis 缓存很多时候也会按照 2-8 原则去做,很多淘汰算法都和操作系统中的类似。既说了 2-8 原则,那就不得不提命中率了,这是所有缓存概念都通用的。简单来说也就是你要访问的数据有多少能直接在缓存中直接找到。命中率高的话,一般表明你的缓存设计比较合理,系统处理速度也相对较快。 - -**从面试角度来说**,尤其是校招,对于操作系统方面知识的考察是非常非常多的。 - -**简单来说,学习操作系统能够提高自己思考的深度以及对技术的理解力,并且,操作系统方面的知识也是面试必备。** - -如果你要系统地学习操作系统的话,最硬核最权威的书籍是 **[《操作系统导论》](https://book.douban.com/subject/33463930/)** 。你可以再配套一个 **[《深入理解计算机系统》](https://book.douban.com/subject/1230413/)** 加深你对计算机系统本质的认识,美滋滋! - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20201012191645919.png) - -另外,去年新出的一本国产的操作系统书籍也很不错:**[《现代操作系统:原理与实现》](https://book.douban.com/subject/35208251/)** (夏老师和陈老师团队的力作,值得推荐)。 - -![](https://oss.javaguide.cn/github/javaguide/books/20210406132050845.png) - -如果你比较喜欢动手,对于理论知识比较抵触的话,我推荐你看看 **[《30 天自制操作系统》](https://book.douban.com/subject/11530329/)** ,这本书会手把手教你编写一个操作系统。 - -纸上学来终觉浅 绝知此事要躬行!强烈推荐 CS 专业的小伙伴一定要多多实践!!! - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409123802972.png) - -其他相关书籍推荐: - -- **[《自己动手写操作系统》](https://book.douban.com/subject/1422377/)**:不光会带着你详细分析操作系统原理的基础,还会用丰富的实例代码,一步一步地指导你用 C 语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。 -- **[《现代操作系统》](https://book.douban.com/subject/3852290/)**:内容很不错,不过,翻译的一般。如果你是精读本书的话,建议把课后习题都做了。 -- **[《操作系统真象还原》](https://book.douban.com/subject/26745156/)**:这本书的作者毕业于北京大学,前百度运维高级工程师。因为在大学期间曾重修操作系统这一科,后对操作系统进行深入研究,著下此书。 -- **[《深度探索 Linux 操作系统》](https://book.douban.com/subject/25743846/)**:跟着这本书的内容走,可以让你对如何制作一套完善的 GNU/Linux 系统有了清晰的认识。 -- **[《操作系统设计与实现》](https://book.douban.com/subject/2044818/)**:操作系统的权威教学教材。 -- **[《Orange'S:一个操作系统的实现》](https://book.douban.com/subject/3735649/)**:从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。配合《操作系统设计与实现》一起食用更佳! - -如果你比较喜欢看视频的话,推荐哈工大李治军老师主讲的慕课 [《操作系统》](https://www.icourse163.org/course/HIT-1002531008),内容质量吊打一众国家精品课程。 - -课程的大纲如下: - -![课程大纲](https://oss.javaguide.cn/github/javaguide/books/image-20220414144527747.png) - -主要讲了一个基本操作系统中的六个基本模块:CPU 管理、内存管理、外设管理、磁盘管理与文件系统、用户接口和启动模块 。 - -课程难度还是比较大的,尤其是课后的 lab。如果大家想要真正搞懂操作系统底层原理的话,对应的 lab 能做尽量做一下。正如李治军老师说的那样:“纸上得来终觉浅,绝知此事要躬行”。 - -![](https://oss.javaguide.cn/github/javaguide/books/image-20220414145210679.png) - -如果你能独立完成几个 lab 的话,我相信你对操作系统的理解绝对要上升几个台阶。当然了,如果你仅仅是为了突击面试的话,那就不需要做 lab 了。 - -说点心里话,我本人非常喜欢李治军老师讲的课,我觉得他是国内不可多得的好老师。他知道我们国内的教程和国外的差距在哪里,也知道国内的学生和国外学生的差距在哪里,他自己在努力着通过自己的方式来缩小这个差距。真心感谢,期待李治军老师的下一个课程。 - -![](https://oss.javaguide.cn/github/javaguide/books/image-20220414145249714.png) - -还有下面这个国外的课程 [《深入理解计算机系统 》](https://www.bilibili.com/video/av31289365?from=search&seid=16298868573410423104) 也很不错。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20201204140653318.png) - -## 计算机网络 - -计算机网络是一门系统性比较强的计算机专业课,各大名校的计算机网络课程打磨的应该都比较成熟。 - -要想学好计算机网络,首先要了解的就是 OSI 七层模型或 TCP/IP 五层模型,即应用层(应用层、表示层、会话层)、传输层、网络层、数据链路层、物理层。 - -![osi七层模型](https://oss.javaguide.cn/github/javaguide/booksosi%E4%B8%83%E5%B1%82%E6%A8%A1%E5%9E%8B2.png) - -关于这门课,首先强烈推荐参考书是**机械工业出版社的《计算机网络——自顶向下方法》**。该书目录清晰,按照 TCP/IP 五层模型逐层讲解,对每层涉及的技术都展开了详细讨论,基本上高校里开设的课程的教学大纲就是这本书的目录了。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409123250570.png) - -如果你觉得上面这本书看着比较枯燥的话,我强烈推荐+安利你看看下面这两本非常有趣的网络相关的书籍: - -- [《图解 HTTP》](https://book.douban.com/subject/25863515/ "《图解 HTTP》"):讲漫画一样的讲 HTTP,很有意思,不会觉得枯燥,大概也涵盖也 HTTP 常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究 HTTP 相关知识的话,读这本书的话应该来说就差不多了。 -- [《网络是怎样连接的》](https://book.douban.com/subject/26941639/ "《网络是怎样连接的》"):从在浏览器中输入网址开始,一路追踪了到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20201011215144139.png) - -除了理论知识之外,学习计算机网络非常重要的一点就是:“**动手实践**”。这点和我们编程差不多。 - -GitHub 上就有一些名校的计算机网络试验/Project: - -- [哈工大计算机网络实验](https://github.com/rccoder/HIT-Computer-Network) -- [《计算机网络-自顶向下方法(原书第 6 版)》编程作业,Wireshark 实验文档的翻译和解答。](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES) -- [计算机网络的期末 Project,用 Python 编写的聊天室](https://github.com/KevinWang15/network-pj-chatroom) -- [CMU 的计算机网络课程](https://computer-networks.github.io/sp19/lectures.html) - -我知道,还有很多小伙伴可能比较喜欢边看视频边学习。所以,我这里再推荐几个顶好的计算机网络视频讲解。 - -**1、[哈工大的计算机网络课程](http://www.icourse163.org/course/HIT-154005)**:国家精品课程,截止目前已经开了 10 次课了。大家对这门课的评价都非常高!所以,非常推荐大家看一下! - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20201218141241911.png) - -**2、[王道考研的计算机网络](https://www.bilibili.com/video/BV19E411D78Q?from=search&seid=17198507506906312317)**:非常适合 CS 专业考研的小朋友!这个视频目前在哔哩哔哩上已经有 1.6w+ 的点赞。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20201218141652837.png) - -## 算法 - -先来看三本入门书籍。 这三本入门书籍中的任何一本拿来作为入门学习都非常好。 - -1. [《我的第一本算法书》](https://book.douban.com/subject/30357170/) -2. [《算法图解》](https://book.douban.com/subject/26979890/) -3. [《啊哈!算法》](https://book.douban.com/subject/25894685/) - -![](https://oss.javaguide.cn/java-guide-blog/image-20210327104418851.png) - -我个人比较倾向于 **[《我的第一本算法书》](https://book.douban.com/subject/30357170/)** 这本书籍,虽然它相比于其他两本书集它的豆瓣评分略低一点。我觉得它的配图以及讲解是这三本书中最优秀,唯一比较明显的问题就是没有代码示例。但是,我觉得这不影响它是一本好的算法书籍。因为本身下面这三本入门书籍的目的就不是通过代码来让你的算法有多厉害,只是作为一本很好的入门书籍让你进入算法学习的大门。 - -再推荐几本比较经典的算法书籍。 - -**[《算法》](https://book.douban.com/subject/19952400/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409123422140.png) - -这本书内容非常清晰易懂,适合数据结构和算法小白阅读。书中把一些常用的数据结构和算法都介绍到了! - -我在大二的时候被我们的一个老师强烈安利过!自己也在当时购买了一本放在宿舍,到离开大学的时候自己大概看了一半多一点。因为内容实在太多了!另外,这本书还提供了详细的 Java 代码,非常适合学习 Java 的朋友来看,可以说是 Java 程序员的必备书籍之一了。 - -> **下面这些书籍都是经典中的经典,但是阅读起来难度也比较大,不做太多阐述,神书就完事了!** -> -> **如果你仅仅是准备算法面试的话,不建议你阅读下面这些书籍。** - -**[《编程珠玑》](https://book.douban.com/subject/3227098/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145334093.png) - -经典名著,ACM 冠军、亚军这种算法巨佬都强烈推荐的一本书籍。这本书的作者也非常厉害,Java 之父 James Gosling 就是他的学生。 - -很多人都说这本书不是教你具体的算法,而是教你一种编程的思考方式。这种思考方式不仅仅在编程领域适用,在其他同样适用。 - -**[《算法设计手册》](https://book.douban.com/subject/4048566/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145411049.png) - -这是一本被 GitHub 上的爆火的计算机自学项目 [Teach Yourself Computer Science](https://link.zhihu.com/?target=https%3A//teachyourselfcs.com/) 强烈推荐的一本算法书籍。 - -类似的神书还有 [《算法导论》](https://book.douban.com/subject/20432061/)、[《计算机程序设计艺术(第 1 卷)》](https://book.douban.com/subject/1130500/) 。 - -**如果说你要准备面试的话,下面这几本书籍或许对你有帮助!** - -**[《剑指 Offer》](https://book.douban.com/subject/6966465/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145506482.png) - -这本面试宝典上面涵盖了很多经典的算法面试题,如果你要准备大厂面试的话一定不要错过这本书。 - -《剑指 Offer》 对应的算法编程题部分的开源项目解析:[CodingInterviews](https://link.zhihu.com/?target=https%3A//github.com/gatieme/CodingInterviews) 。 - -**[《程序员代码面试指南(第 2 版)》](https://book.douban.com/subject/30422021/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145622758.png) - -《程序员代码面试指南(第 2 版)》里的大部分题目相比于《剑指 offer》 来说要难很多,题目涵盖面相比于《剑指 offer》也更加全面。全书一共有将近 300 道真实出现过的经典代码面试题。 - -视频的话,推荐北京大学的国家精品课程—**[程序设计与算法(二)算法基础](https://www.icourse163.org/course/PKU-1001894005)**,讲的非常好! - -![](https://oss.javaguide.cn/github/javaguide/books/22ce4a17dc0c40f6a3e0d58002261b7a.png) - -这个课程把七种基本的通用算法(枚举、二分、递归、分治、动态规划、搜索、贪心)都介绍到了。各种复杂算法问题的解决,都可能用到这些基本的思想。并且,这个课程的一部分的例题和 ACM 国际大学生程序设计竞赛中的中等题相当,如果你能够解决这些问题,那你的算法能力将超过绝大部分的高校计算机专业本科毕业生。 - -## 数据结构 - -其实,上面提到的很多算法类书籍(比如 **《算法》** 和 **《算法导论》**)都详细地介绍了常用的数据结构。 - -我这里再另外补充基本和数据结构相关的书籍。 - -**[《大话数据结构》](https://book.douban.com/subject/6424904/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145803440.png) - -入门类型的书籍,读起来比较浅显易懂,适合没有数据结构基础或者说数据结构没学好的小伙伴用来入门数据结构。 - -**[《数据结构与算法分析:Java 语言描述》](https://book.douban.com/subject/3351237/)** - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409145823973.png) - -质量很高,介绍了常用的数据结构和算法。 - -类似的还有 **[《数据结构与算法分析:C 语言描述》](https://book.douban.com/subject/1139426/)**、**[《数据结构与算法分析:C++ 描述》](https://book.douban.com/subject/1971825/)** - -![](https://oss.javaguide.cn/github/javaguide/books/d9c450ccc5224a5fba77f4fa937f7b9c.png) - -视频的话推荐你看浙江大学的国家精品课程—**[《数据结构》](https://www.icourse163.org/course/ZJU-93001#/info)** 。 - -姥姥的数据结构讲的非常棒!不过,还是有一些难度的,尤其是课后练习题。 - -## 计算机专业基础课 - -数学和英语属于通用课,一般在大一和大二两学年就可以全部修完,大二大三逐渐接触专业课。通用课作为许多高中生升入大学的第一门课,算是高中阶段到本科阶段的一个过渡,从职业生涯重要性上来说,远不及专业课重要,但是在本科阶段的学习生活规划中,有着非常重要的地位。由于通用课的课程多,学分重,占据了本科阶段绩点的主要部分,影响到学生在前两年的专业排名,也影响到大三结束时的推免资格分配,也就是保研。而从升学角度来看,对于攻读研究生和博士生的小伙伴来说,数学和英语这两大基础课,还是十分有用的。 - -### 数学 - -#### 微积分(高等数学) - -微积分,即传说中的高数,成为了无数新大一心中的痛。但好在,大学的课程考核没那么严格,期末想要拿高分,也不至于像高中那样刷题刷的那么狠。微积分对于计算机专业学生的重要性,主要体现在计算机图形学中的函数变换,机器学习中的梯度算法,信号处理等领域。 - -微积分的知识体系包括微分和积分两部分,一般会先学微分,再学积分,也有的学校把高数分为两个学期。微分就是高中的导数的升级版,对于大一萌新来说还算比较友好。积分恰好是微分的逆运算,思想上对大一萌新来说比较新,一时半会可能接受不了。不过这门课所有的高校都有开设,而且大部分的名校都有配套的网课,教材也都打磨的非常出色,结合网课和教材的“啃书”学习模式,这门课一定不会落下。 - -书籍的话,推荐《普林斯顿微积分读本》。这本书详细讲解了微积分基础、极限、连续、微分、导数的应用、积分、无穷级数、泰勒级数与幂级数等内容。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409155056751.png) - -#### 线性代数(高等代数) - -线性代数的思维模式就更加复杂了一些,它定义了一个全新的数学世界,所有的符号、定理都是全新的,唯一能尝试的去理解的方式,大概就是用几何的方式去理解线性代数了。由于线性代数和几何学有着密不可分的关系,比如空间变换的理论支撑就是线性代数,因此,网上有着各种“可视化学习线性代数”的学习资源,帮助理解线性代数的意义,有助于公式的记忆。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409153940473.png) - -书籍的话,推荐中科大李尚志老师的 **[《线性代数学习指导》](https://book.douban.com/subject/26390093/)** 。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409155325251.png) - -#### 概率论与数理统计 - -对于计算机专业的小伙伴来说,这门课可能是概率论更有用一点,而非数理统计。可能某些学校只开设概率论课程,也可能数理统计也教,但仅仅是皮毛。概率论的学习路线和微积分相似,就是一个个公式辅以实例,不像线性代数那么抽象,比较贴近生活。在现在的就业形势下,概率论与数理统计专业的学生,应该是数学专业最好就业的了,他们通常到岗位上会做一些数据分析的工作,因此,**这门课程确实是数据分析的重要前置课程,概率论在机器学习中的重要性也就不言而喻了。** - -书籍的话,推荐 **[《概率论与数理统计教程》](https://book.douban.com/subject/34897672/)** 。这本书共八章,前四章为概率论部分,主要叙述各种概率分布及其性质,后四章为数理统计部分,主要叙述各种参数估计与假设检验。 - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409155738505.png) - -#### 离散数学(集合论、图论、近世代数等) - -离散数学是计算机专业的专属数学,但实际上对于本科毕业找工作的小伙伴来说,离散数学还并没有发挥它的巨大作用。离散数学的作用主要在在图研究等领域,理论性极强,需要读研深造的小伙伴尽可能地扎实掌握。 - -### 英语 - -英语算是大学里面比较灵活的一项技能了,有的人会说,“英语学的越好,对个人发展越有利”,此话说的没错,但是对于一些有着明确发展目标的小伙伴,可能英语技能并不在他们的技能清单内。接下来的这些话只针对计算机专业的小伙伴们哦。 - -英语课在大学本科一般只有前两年开设,小伙伴们可以记住,**想用英语课来提升自己的英语水平的,可以打消这个念头了。** 英语水平的提高全靠自己平时的积累和练习,以及有针对性的刷题。 - -**英语的大学四六级一定要过。** 这是必备技能,绝大部分就业岗位都要看四六级水平的,最起码要通过的。四级比高中英语稍微难一些,一般的小伙伴可能会卡在六级上,六级需要针对性的训练一下,因为大学期间能接触英语的实在太少了,每学期一门英语课是不足以保持自己的英语水平的。对于一些来自于偏远地区,高中英语基础薄弱的,考四六级会更加吃力。建议考前集中训练一下历年真题,辅以背一下高频词汇,四六级通过只需要 425 分,这个分数线还是比较容易达到的。稍微好一点的小伙伴可能冲一下 500 分,要是能考到 600 分的话,那是非常不错的水平了,算是简历上比较有亮点的一项。 - -英语的雅思托福考试只限于想要出国的小伙伴,以及应聘岗位对英语能力有特殊要求的。雅思托福考试裸考不容易通过,花钱去比较靠谱的校外补课班应该是一个比较好的选择。 - -对于计算机专业的小伙伴来说,英语能力还是比较重要的,虽然应聘的时候不会因为没有雅思托福成绩卡人,但是你起码要能够: - -- **熟练使用英文界面的软件、系统等** -- **对于外网的一些博客、bug 解决方案等,阅读无压力** -- **熟练阅读英文文献** -- **具备一定的英文论文的撰写能力** - -毕竟计算机语言就是字符语言,听说读写中最起码要满足**读写**这两项不过分吧。 - -### 编译原理 - -编译原理相比于前面介绍的专业课,地位显得不那么重要了。编译原理的重要性主要体现在: - -- 底层语言、引擎或高级语言的开发,如 MySQL,Java 等 -- 操作系统或嵌入式系统的开发 -- 词法、语法、语义的思想,以及自动机思想 - -**编译原理的重要前置课程就是形式语言与自动机,自动机的思想在词法分析当中有着重要应用,学习了这门课后,应该就会发现许多场景下,自动机算法的妙用了。** - -总的来说,这门课对于各位程序员的职业发展来说,相对不那么重要,但是从难度上来说,学习这门课可以对编程思想有一个较好的巩固。学习资源的话,除了课堂上的幻灯片课件以外,还可以把 《编译原理》 这本书作为参考书,用以辅助自己学不懂的地方(大家口中的龙书,想要啃下来还是有一定难度的)。 - -![](https://oss.javaguide.cn/github/javaguide/books/20210406152148373.png) - -其他书籍推荐: - -- **[《现代编译原理》](https://book.douban.com/subject/30191414/)**:编译原理的入门书。 -- **[《编译器设计》](https://book.douban.com/subject/20436488/)**:覆盖了编译器从前端到后端的全部主题。 - -我上面推荐的书籍的难度还是比较高的,真心很难坚持看完。这里强烈推荐[哈工大的编译原理视频课程](https://www.icourse163.org/course/HIT-1002123007),真心不错,还是国家精品课程,关键还是又漂亮有温柔的美女老师讲的! - -![](https://oss.javaguide.cn/github/javaguide/books/20210406152847824.png) diff --git a/docs/books/database.md b/docs/books/database.md deleted file mode 100644 index 87f92d24184d40d418428793be1d064aa9508ec9..0000000000000000000000000000000000000000 --- a/docs/books/database.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: 数据库必读经典书籍 -category: 计算机书籍 -icon: "database" -head: - - - meta - - name: keywords - content: 数据库书籍精选 ---- - -## 数据库基础 - -数据库基础这块,如果你觉得书籍比较枯燥,自己坚持不下来的话,我推荐你可以先看看一些不错的视频,北京师范大学的[《数据库系统原理》](https://www.icourse163.org/course/BNU-1002842007)、哈尔滨工业大学的[《数据库系统(下):管理与技术》](https://www.icourse163.org/course/HIT-1001578001)就很不错。 - -[《数据库系统原理》](https://www.icourse163.org/course/BNU-1002842007)这个课程的老师讲的非常详细,而且每一小节的作业设计的也与所讲知识很贴合,后面还有很多配套实验。 - -![](https://oss.javaguide.cn/github/javaguide/books/up-e113c726a41874ef5fb19f7ac14e38e16ce.png) - -如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。 - -![](https://oss.javaguide.cn/github/javaguide/books/up-11de8cb239aa7201cc8d78fa28928b9ec7d.png) - -GitHub 上也已经有大佬用 Java 实现过一个简易的数据库,介绍的挺详细的,感兴趣的朋友可以去看看。地址:[https://github.com/alchemystar/Freedom](https://github.com/alchemystar/Freedom) 。 - -除了这个用 Java 写的之外,**[db_tutorial](https://github.com/cstack/db_tutorial)** 这个项目是国外的一个大佬用 C 语言写的,朋友们也可以去瞅瞅。 - -**只要利用好搜索引擎,你可以找到各种语言实现的数据库玩具。** - -![](https://oss.javaguide.cn/github/javaguide/books/up-d32d853f847633ac7ed0efdecf56be1f1d2.png) - -**纸上学来终觉浅 绝知此事要躬行!强烈推荐 CS 专业的小伙伴一定要多多实践!!!** - -### 《数据库系统概念》 - -[《数据库系统概念》](https://book.douban.com/subject/10548379/)这本书涵盖了数据库系统的全套概念,知识体系清晰,是学习数据库系统非常经典的教材!不是参考书! - -![](https://oss.javaguide.cn/github/javaguide/booksimage-20220409150441742.png) - -### 《数据库系统实现》 - -如果你也想要研究 MySQL 底层原理的话,我推荐你可以先阅读一下[《数据库系统实现》](https://book.douban.com/subject/4838430/)。 - -![](https://oss.javaguide.cn/github/javaguide/books/database-system-implementation.png) - -不管是 MySQL 还是 Oracle ,它们总体的架子是差不多的,不同的是其内部的实现比如数据库索引的数据结构、存储引擎的实现方式等等。 - -这本书有些地方还是翻译的比较蹩脚,有能力看英文版的还是建议上手英文版。 - -《数据库系统实现》 这本书是斯坦福的教材,另外还有一本[《数据库系统基础教程》](https://book.douban.com/subject/3923575/)是前置课程,可以带你入门数据库。 - -## MySQL - -我们网站或者 APP 的数据都是需要使用数据库来存储数据的。 - -一般企业项目开发中,使用 MySQL 比较多。如果你要学习 MySQL 的话,可以看下面这 3 本书籍: - -- **[《MySQL 必知必会》](https://book.douban.com/subject/3354490/)**:非常薄!非常适合 MySQL 新手阅读,很棒的入门教材。 -- **[《高性能 MySQL》](https://book.douban.com/subject/23008813/)**:MySQL 领域的经典之作!学习 MySQL 必看!属于进阶内容,主要教你如何更好地使用 MySQL 。既有有理论,又有实践!如果你没时间都看一遍的话,我建议第 5 章(创建高性能的索引)、第 6 章(查询性能优化) 你一定要认真看一下。 -- **[《MySQL 技术内幕》](https://book.douban.com/subject/24708143/)**:你想深入了解 MySQL 存储引擎的话,看这本书准没错! - -![](https://oss.javaguide.cn/github/javaguide/books/up-3d31e762933f9e50cc7170b2ebd8433917b.png) - -视频的话,你可以看看动力节点的 [《MySQL 数据库教程视频》](https://www.bilibili.com/video/BV1fx411X7BD)。这个视频基本上把 MySQL 的相关一些入门知识给介绍完了。 - -另外,强推一波 **[《MySQL 是怎样运行的》](https://book.douban.com/subject/35231266/)** 这本书,内容很适合拿来准备面试。讲的很细节,但又不枯燥,内容非常良心! - -![](https://oss.javaguide.cn/github/javaguide/csdn/20210703120643370.png) - -## PostgreSQL - -和 MySQL 一样,PostgreSQL 也是开源免费且功能强大的关系型数据库。PostgreSQL 的 Slogan 是“**世界上最先进的开源关系型数据库**” 。 - -![](https://oss.javaguide.cn/github/javaguide/books/image-20220702144954370.png) - -最近几年,由于 PostgreSQL 的各种新特性过于优秀,使用 PostgreSQL 代替 MySQL 的项目越来越多了。 - -如果你还在纠结是否尝试一下 PostgreSQL 的话,建议你看看这个知乎话题:[PostgreSQL 与 MySQL 相比,优势何在? - 知乎](https://www.zhihu.com/question/20010554) 。 - -### 《PostgreSQL 指南:内幕探索》 - -[《PostgreSQL 指南:内幕探索》](https://book.douban.com/subject/33477094/)这本书主要介绍了 PostgreSQL 内部的工作原理,包括数据库对象的逻辑组织与物理实现,进程与内存的架构。 - -刚工作那会需要用到 PostgreSQL ,看了大概 1/3 的内容,感觉还不错。 - -![](https://oss.javaguide.cn/github/javaguide/books/PostgreSQL-Guide.png) - -### 《PostgreSQL 技术内幕:查询优化深度探索》 - -[《PostgreSQL 技术内幕:查询优化深度探索》](https://book.douban.com/subject/30256561/)这本书主要讲了 PostgreSQL 在查询优化上的一些技术实现细节,可以让你对 PostgreSQL 的查询优化器有深层次的了解。 - -![《PostgreSQL 技术内幕:查询优化深度探索》](https://oss.javaguide.cn/github/javaguide/books/PostgreSQL-TechnologyInsider.png) - -## Redis - -**Redis 就是一个使用 C 语言开发的数据库**,不过与传统数据库不同的是 **Redis 的数据是存在内存中的** ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。 - -如果你要学习 Redis 的话,强烈推荐下面这两本书: - -- [《Redis 设计与实现》](https://book.douban.com/subject/25900156/) :主要是 Redis 理论知识相关的内容,比较全面。我之前写过一篇文章 [《7 年前,24 岁,出版了一本 Redis 神书》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247507030&idx=1&sn=0a5fd669413991b30163ab6f5834a4ad&chksm=cea1939df9d61a8b93925fae92f4cee0838c449534e60731cfaf533369831192e296780b32a6&token=709354671&lang=zh_CN&scene=21#wechat_redirect) 来介绍这本书。 -- [《Redis 核心原理与实践》](https://book.douban.com/subject/26612779/):主要是结合源码来分析 Redis 的重要知识点比如各种数据结构和高级特性。 - -![《Redis 设计与实现》和《Redis 设计与实现》](https://oss.javaguide.cn/github/javaguide/books/redis-books.png) - -另外,[《Redis 开发与运维》](https://book.douban.com/subject/26971561/) 这本书也非常不错,既有基础介绍,又有一线开发运维经验分享。 - -![《Redis 开发与运维》](https://oss.javaguide.cn/github/javaguide/books/redis-kaifa-yu-yunwei.png) diff --git a/docs/books/distributed-system.md b/docs/books/distributed-system.md deleted file mode 100644 index d8f6e64b1cec72bdebc8f39b99a4a58031bce2ea..0000000000000000000000000000000000000000 --- a/docs/books/distributed-system.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: 分布式必读经典书籍 -category: 计算机书籍 -icon: "distributed-network" ---- - -## 《深入理解分布式系统》 - -![](https://oss.javaguide.cn/github/javaguide/books/deep-understanding-of-distributed-system.png) - -**[《深入理解分布式系统》](https://book.douban.com/subject/35794814/)** 是今年 3 月份刚出的一本分布式中文原创书籍,主要讲的是分布式领域的基本概念、常见挑战以及共识算法。 - -作者用了大量篇幅来介绍分布式领域中非常重要的共识算法,并且还会基于 Go 语言带着你从零实现了一个共识算法的鼻祖 Paxos 算法。 - -实话说,我还没有开始看这本书。但是!这本书的作者的博客上的分布式相关的文章我几乎每一篇都认真看过。 - -作者从 2019 年开始构思《深入理解分布式系统》,2020 年开始动笔,花了接近两年的时间才最终交稿。 - -![](https://oss.javaguide.cn/github/javaguide/books/image-20220706121952258.png) - -作者专门写了一篇文章来介绍这本书的背后的故事,感兴趣的小伙伴可以自行查阅: 。 - -最后,放上这本书的代码仓库和勘误地址: 。 - -## 《数据密集型应用系统设计》 - -![](https://oss.javaguide.cn/github/javaguide/books/ddia.png) - -强推一波 **[《Designing Data-Intensive Application》](https://book.douban.com/subject/30329536/)** (DDIA,数据密集型应用系统设计),值得读很多遍!豆瓣有接近 90% 的人看了这本书之后给了五星好评。 - -这本书主要讲了分布式数据库、数据分区、事务、分布式系统等内容。 - -书中介绍的大部分概念你可能之前都听过,但是在看了书中的内容之后,你可能会豁然开朗:“哇塞!原来是这样的啊!这不是某技术的原理么?”。 - -这本书我之前专门写过知乎回答介绍和推荐,没看过的朋友可以看看:[有哪些你看了以后大呼过瘾的编程书?](https://www.zhihu.com/question/50408698/answer/2278198495) 。 - -另外,如果你在阅读这本书的时候感觉难度比较大,很多地方读不懂的话,我这里推荐一下《深入理解分布式系统》作者写的[《DDIA 逐章精读》小册](https://ddia.qtmuniao.com)。 - -## 《深入理解分布式事务》 - -![](https://oss.javaguide.cn/github/javaguide/books/In-depth-understanding-of-distributed-transactions-xiaoyu.png) - -**[《深入理解分布式事务》](https://book.douban.com/subject/35626925/)** 这本书是的其中一位作者是 Apache ShenYu(incubating)网关创始人、Hmily、RainCat、Myth 等分布式事务框架的创始人。 - -学习分布式事务的时候,可以参考一下这本书。虽有一些小错误以及逻辑不通顺的地方,但对于各种分布式事务解决方案的介绍,总体来说还是不错的。 - -## 《从 Paxos 到 Zookeeper》 - -![](https://oss.javaguide.cn/github/javaguide/books/image-20211216161350118.png) - -**[《从 Paxos 到 Zookeeper》](https://book.douban.com/subject/26292004/)** 是一本带你入门分布式理论的好书。这本书主要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了 Paxos 和 ZAB 协议。 - -## 《微服务架构设计模式》 - -![](https://oss.javaguide.cn/github/javaguide/books/microservices-patterns.png) - -**[《微服务架构设计模式》](https://book.douban.com/subject/33425123/)** 的作者 Chris Richardson 被评为世界十大软件架构师之一、微服务架构先驱。这本书主要讲的是如何开发和部署生产级别的微服务架构应用,示例代码使用 Java 语言和 Spring 框架。 - -## 《凤凰架构》 - -![](https://oss.javaguide.cn/github/javaguide/books/f5bec14d3b404ac4b041d723153658b5.png) - -**[《凤凰架构》](https://book.douban.com/subject/35492898/)** 这本书是周志明老师多年架构和研发经验的总结,内容非常干货,深度与广度并存,理论结合实践! - -正如书名的副标题“构建可靠的大型分布式系统”所说的那样,这本书的主要内容就是讲:“如何构建一套可靠的分布式大型软件系统” ,涵盖了下面这些方面的内容: - -- 软件架构从单体到微服务再到无服务的演进之路。 -- 架构师应该在架构设计时应该注意哪些问题,有哪些比较好的实践。 -- 分布式的基石比如常见的分布式共识算法 Paxos、Multi Paxos。 -- 不可变基础设施比如虚拟化容器、服务网格。 -- 向微服务迈进的避坑指南。 - -这本书我推荐过很多次了。详见历史文章: - -- [周志明老师的又一神书!发现宝藏!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247505254&idx=1&sn=04faf3093d6002354f06fffbfc2954e0&chksm=cea19aadf9d613bbba7ed0e02ccc4a9ef3a30f4d83530e7ad319c2cc69cd1770e43d1d470046&scene=178&cur_album_id=1646812382221926401#rd) -- [Java 领域的又一神书!周志明老师 YYDS!](https://mp.weixin.qq.com/s/9nbzfZGAWM9_qIMp1r6uUQ) - -## 《架构解密》 - -![](https://oss.javaguide.cn/github/javaguide/books/jiagoujiemi.png) - -[《架构解密》](https://book.douban.com/subject/35093373/)这本书和我渊源颇深,在大三的时候,我曾经在图书馆借阅过这本书的第一版,大概了花了不到一周就看完了。 - -这本书的第二版在 2020 年就已经出来了,总共也才 15 个评价,算得上是一本非常小众的技术书籍了。 - -书籍质量怎么说呢,各个知识点介绍的都比较泛,匆忙结束,一共 9 章,总共 331 页。如果你只是想初步了解一些分布式相关的概念的话,可以看看这本书,快速概览一波分布式相关的技术。 - -## 其他 - -- [《分布式系统 : 概念与设计》](https://book.douban.com/subject/21624776/):偏教材类型,内容全而无趣,可作为参考书籍; -- [《分布式架构原理与实践》](https://book.douban.com/subject/35689350/):2021 年出版的,没什么热度,我也还没看过。 diff --git a/docs/books/java.md b/docs/books/java.md deleted file mode 100644 index 8278ed596e1c8e073d446786b726039ab517002e..0000000000000000000000000000000000000000 --- a/docs/books/java.md +++ /dev/null @@ -1,260 +0,0 @@ ---- -title: Java 必读经典书籍 -category: 计算机书籍 -icon: "java" ---- - -## Java 基础 - -**[《Head First Java》](https://book.douban.com/subject/2000732/)** - -![《Head First Java》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103035793.png) - -《Head First Java》这本书的内容很轻松有趣,可以说是我学习编程初期最喜欢的几本书之一了。同时,这本书也是我的 Java 启蒙书籍。我在学习 Java 的初期多亏了这本书的帮助,自己才算是跨进 Java 语言的大门。 - -我觉得我在 Java 这块能够坚持下来,这本书有很大的功劳。我身边的的很多朋友学习 Java 初期都是看的这本书。 - -有很多小伙伴就会问了:**这本书适不适合编程新手阅读呢?** - -我个人觉得这本书还是挺适合编程新手阅读的,毕竟是 “Head First” 系列。 - -**[《Java 核心技术卷 1 + 卷 2》](https://book.douban.com/subject/34898994/)** - -![《Java 核心技术卷 1》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424101217849.png) - -这两本书也非常不错。不过,这两本书的内容很多,全看的话比较费时间。我现在是把这两本书当做工具书来用,就比如我平时写文章的时候,碰到一些 Java 基础方面的问题,经常就翻看这两本来当做参考! - -我当时在大学的时候就买了两本放在寝室,没事的时候就翻翻。建议有点 Java 基础之后再读,介绍的还是比较深入和全面的,非常推荐。 - -**[《Java 编程思想》](https://book.douban.com/subject/2130190/)** - -![《Java 编程思想》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103124893.png) - -另外,这本书的作者去年新出版了[《On Java》](https://book.douban.com/subject/35751619/),我更推荐这本,内容更新,介绍了 Java 的 3 个长期支持版(Java 8、11、17)。 - -![](https://oss.javaguide.cn/github/javaguide/books/on-java/6171657600353_.pic_hd.jpg) - -毕竟,这是市面上目前唯一一本介绍了 Java 的 3 个长期支持版(Java 8、11、17)的技术书籍。 - -**[《Java 8 实战》](https://book.douban.com/subject/26772632/)** - -![《Java 8实战》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424103202625.png) - -Java 8 算是一个里程碑式的版本,现在一般企业还是用 Java 8 比较多。掌握 Java 8 的一些新特性比如 Lambda、Stream API 还是挺有必要的。这块的话,我推荐 **[《Java 8 实战》](https://book.douban.com/subject/26772632/)** 这本书。 - -**[《Java 编程的逻辑》](https://book.douban.com/subject/30133440/)** - -![《Java编程的逻辑》](https://oss.javaguide.cn/github/javaguide/books/image-20230721153650488.png) - -一本非常低调的好书,相比于入门书来说,内容更有深度。适合初学者,同时也适合大家拿来复习 Java 基础知识。 - -## Java 并发 - -**[《Java 并发编程之美》](https://book.douban.com/subject/30351286/)** - -![《Java 并发编程之美》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424112413660.png) - -这本书还是非常适合我们用来学习 Java 多线程的,讲解非常通俗易懂,作者从并发编程基础到实战都是信手拈来。 - -另外,这本书的作者加多自身也会经常在网上发布各种技术文章。这本书也是加多大佬这么多年在多线程领域的沉淀所得的结果吧!他书中的内容基本都是结合代码讲解,非常有说服力! - -**[《实战 Java 高并发程序设计》](https://book.douban.com/subject/30358019/)** - -![《实战 Java 高并发程序设计》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424112554830.png) - -这个是我第二本要推荐的书籍,比较适合作为多线程入门/进阶书籍来看。这本书内容同样是理论结合实战,对于每个知识点的讲解也比较通俗易懂,整体结构也比较清。 - -**[《深入浅出 Java 多线程》](https://github.com/RedSpider1/concurrent)** - -![《深入浅出 Java 多线程》在线阅读](https://oss.javaguide.cn/github/javaguide/books/image-20220424112927759.png) - -这本开源书籍是几位大厂的大佬开源的。这几位作者为了写好《深入浅出 Java 多线程》这本书阅读了大量的 Java 多线程方面的书籍和博客,然后再加上他们的经验总结、Demo 实例、源码解析,最终才形成了这本书。 - -这本书的质量也是非常过硬!给作者们点个赞!这本书有统一的排版规则和语言风格、清晰的表达方式和逻辑。并且每篇文章初稿写完后,作者们就会互相审校,合并到主分支时所有成员会再次审校,最后再通篇修订了三遍。 - -在线阅读:。 - -**[《Java 并发实现原理:JDK 源码剖析》](https://book.douban.com/subject/35013531/)** - -![《Java 并发实现原理:JDK 源码剖析》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/0b1b046af81f4c94a03e292e66dd6f7d.png) - -这本书主要是对 Java Concurrent 包中一些比较重要的源码进行了讲解,另外,像 JMM、happen-before、CAS 等等比较重要的并发知识这本书也都会一并介绍到。 - -不论是你想要深入研究 Java 并发,还是说要准备面试,你都可以看看这本书。 - -## JVM - -**[《深入理解 Java 虚拟机》](https://book.douban.com/subject/34907497/)** - -![《深入理解 Java 虚拟机》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/20210710104655705.png) - -这本书就一句话形容:**国产书籍中的战斗机,实实在在的优秀!** (真心希望国内能有更多这样的优质书籍出现!加油!💪) - -这本书的第 3 版 2019 年底已经出来了,新增了很多实在的内容比如 ZGC 等新一代 GC 的原理剖析。目前豆瓣上是 9.5 的高分,🐂 不 🐂 我就不多说了! - -不论是你面试还是你想要在 Java 领域学习的更深,你都离不开这本书籍。这本书不光要看,你还要多看几遍,里面都是干货。这本书里面还有一些需要自己实践的东西,我建议你也跟着实践一下。 - -类似的书籍还有 **[《实战 Java 虚拟机》](https://book.douban.com/subject/26354292/)**、**[《虚拟机设计与实现:以 JVM 为例》](https://book.douban.com/subject/34935105/)** ,这两本都是非常不错的! - -![《实战 Java 虚拟机》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113158144.png) - -![《虚拟机设计与实现:以 JVM 为例》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113210153.png) - -如果你对实战比较感兴趣,想要自己动手写一个简易的 JVM 的话,可以看看 **[《自己动手写 Java 虚拟机》](https://book.douban.com/subject/26802084/)** 这本书。 - -![《自己动手写 Java 虚拟机》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113445246.png) - -书中的代码是基于 Go 语言实现的,搞懂了原理之后,你可以使用 Java 语言模仿着写一个,也算是练练手! 如果你当前没有能力独立使用 Java 语言模仿着写一个的话,你也可以在网上找到很多基于 Java 语言版本的实现,比如[《zachaxy 的手写 JVM 系列》](https://zachaxy.github.io/tags/JVM/) 。 - -这本书目前在豆瓣有 8.2 的评分,我个人觉得张秀宏老师写的挺好的,这本书值得更高的评分。 - -另外,R 大在豆瓣发的[《从表到里学习 JVM 实现》](https://www.douban.com/doulist/2545443/)这篇文章中也推荐了很多不错的 JVM 相关的书籍,推荐小伙伴们去看看。 - -再推荐两个视频给喜欢看视频学习的小伙伴。 - -第 1 个是尚硅谷的宋红康老师讲的[《JVM 全套教程》](https://www.bilibili.com/video/BV1PJ411n7xZ)。这个课程的内容非常硬,一共有接近 400 小节。 - -课程的内容分为 3 部分: - -1. 《内存与垃圾回收篇》 -2. 《字节码与类的加载篇》 -3. 《性能监控与调优篇》 - -第 2 个是你假笨大佬的 **[《JVM 参数【Memory 篇】》](https://club.perfma.com/course/438755/list)** 教程,很厉害了! - -![](https://oss.javaguide.cn/java-guide-blog/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70.png) - -## 常用工具 - -非常重要!非常重要!特别是 Git 和 Docker。 - -- **IDEA**:熟悉基本操作以及常用快捷。相关资料: [《IntelliJ IDEA 简体中文专题教程》](https://github.com/judasn/IntelliJ-IDEA-Tutorial) 。 -- **Maven**:强烈建议学习常用框架之前可以提前花几天时间学习一下**Maven**的使用。(到处找 Jar 包,下载 Jar 包是真的麻烦费事,使用 Maven 可以为你省很多事情)。相关阅读:[Maven 核心概念总结](https://javaguide.cn/tools/maven/maven-core-concepts.html)。 -- **Git**:基本的 Git 技能也是必备的,试着在学习的过程中将自己的代码托管在 Github 上。相关阅读:[Git 核心概念总结](https://javaguide.cn/tools/git/git-intro.html)。 -- **Docker**:学着用 Docker 安装学习中需要用到的软件比如 MySQL ,这样方便很多,可以为你节省不少时间。相关资料:[《Docker - 从入门到实践》](https://yeasy.gitbook.io/docker_practice/) 。 - -除了这些工具之外,我强烈建议你一定要搞懂 GitHub 的使用。一些使用 GitHub 的小技巧,你可以看[Github 实用小技巧总结](https://javaguide.cn/tools/git/github-tips.html)这篇文章。 - -## 常用框架 - -框架部分建议找官方文档或者博客来看。 - -### Spring/SpringBoot - -**Spring 和 SpringBoot 真的很重要!** - -一定要搞懂 AOP 和 IOC 这两个概念。Spring 中 bean 的作用域与生命周期、SpringMVC 工作原理详解等等知识点都是非常重要的,一定要搞懂。 - -企业中做 Java 后端,你一定离不开 SpringBoot ,这个是必备的技能了!一定一定一定要学好! - -像 SpringBoot 和一些常见技术的整合你也要知识怎么做,比如 SpringBoot 整合 MyBatis、 ElasticSearch、SpringSecurity、Redis 等等。 - -下面是一些比较推荐的书籍/专栏。 - -**[《Spring 实战》](https://book.douban.com/subject/34949443/)** - -![《Spring 实战》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113512453.png) - -不建议当做入门书籍读,入门的话可以找点国人的书或者视频看。这本定位就相当于是关于 Spring 的一个概览,只有一些基本概念的介绍和示例,涵盖了 Spring 的各个方面,但都不够深入。就像作者在最后一页写的那样:“学习 Spring,这才刚刚开始”。 - -**[《Spring 5 高级编程》](https://book.douban.com/subject/30452637/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210328171223638.png) - -对于 Spring5 的新特性介绍的比较详细,也说不上好。另外,感觉全书翻译的有一点蹩脚的味道,还有一点枯燥。全书的内容比较多,我一般拿来当做工具书参考。 - -**[《Spring Boot 编程思想(核心篇)》](https://book.douban.com/subject/33390560/)** - -![《Spring Boot 编程思想(核心篇)》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113546513.png) - -_稍微有点啰嗦,但是原理介绍的比较清楚。_ - -SpringBoot 解析,不适合初学者。我是去年入手的,现在就看了几章,后面没看下去。书很厚,感觉很多很多知识点的讲解过于啰嗦和拖沓,不过,这本书对于 SpringBoot 内部原理讲解的还是很清楚。 - -**[《Spring Boot 实战》](https://book.douban.com/subject/26857423/)** - -![《Spring Boot 实战》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113614768.png) - -比较一般的一本书,可以简单拿来看一下。 - -### MyBatis - -MyBatis 国内用的挺多的,我的建议是不需要花太多时间在上面。当然了,MyBatis 的源码还是非常值得学习的,里面有很多不错的编码实践。这里推荐两本讲解 MyBatis 源码的书籍。 - -**[《手写 MyBatis:渐进式源码实践》](https://book.douban.com/subject/36243250/)** - -![《手写MyBatis:渐进式源码实践》](https://oss.javaguide.cn/github/javaguide/books/image-20230724123402784.png) - -我的好朋友小傅哥出版的一本书。这本书以实践为核心,摒弃 MyBatis 源码中繁杂的内容,聚焦于 MyBaits 中的核心逻辑,简化代码实现过程,以渐进式的开发方式,逐步实现 MyBaits 中的核心功能。 - -这本书的配套项目的仓库地址: 。 - -**[《通用源码阅读指导书――MyBatis 源码详解》](https://book.douban.com/subject/35138963/)** - -![《通用源码阅读指导书――MyBatis源码详解》](https://oss.javaguide.cn/github/javaguide/books/image-20230724123416741.png) - -这本书通过 MyBatis 开源代码讲解源码阅读的流程和方法!一共对 MyBatis 源码中的 300 多个类进行了详细解析,包括其背景知识、组织方式、逻辑结构、实现细节。 - -这本书的配套示例仓库地址: 。 - -### Netty - -**[《Netty 实战》](https://book.douban.com/subject/27038538/)** - -![《Netty 实战》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113715369.png) - -这本书可以用来入门 Netty ,内容从 BIO 聊到了 NIO、之后才详细介绍为什么有 Netty、Netty 为什么好用以及 Netty 重要的知识点讲解。 - -这本书基本把 Netty 一些重要的知识点都介绍到了,而且基本都是通过实战的形式讲解。 - -**[《Netty 进阶之路:跟着案例学 Netty》](https://book.douban.com/subject/30381214/)** - -![《Netty 进阶之路:跟着案例学 Netty》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113747345.png) - -内容都是关于使用 Netty 的实践案例比如内存泄露这些东西。如果你觉得你的 Netty 已经完全入门了,并且你想要对 Netty 掌握的更深的话,推荐你看一下这本书。 - -**[《跟闪电侠学 Netty:Netty 即时聊天实战与底层原理》](https://book.douban.com/subject/35752082/)** - -![](https://oss.javaguide.cn/github/javaguide/open-source-project/image-20220503085034268.png) - -2022 年 3 月出版的一本书。这本书分为上下两篇,上篇通过一个即时聊天系统的实战案例带你入门 Netty,下篇通过 Netty 源码分析带你搞清 Netty 比较重要的底层原理。 - -## 性能调优 - -**[《Java 性能权威指南》](https://book.douban.com/subject/26740520/)** - -![《Java 性能权威指南》-豆瓣](https://oss.javaguide.cn/github/javaguide/books/image-20220424113809644.png) - -_希望能有更多这 Java 性能优化方面的好书!_ - -O'Reilly 家族书,性能调优的入门书,我个人觉得性能调优是每个 Java 从业者必备知识。 - -这本书介绍的实战内容很不错,尤其是 JVM 调优,缺点也比较明显,就是内容稍微有点老。市面上这种书很少。这本书不适合初学者,建议对 Java 语言已经比价掌握了再看。另外,阅读之前,最好先看看周志明大佬的《深入理解 Java 虚拟机》。 - -## 网站架构 - -看过很多网站架构方面的书籍,比如《大型网站技术架构:核心原理与案例分析》、《亿级流量网站架构核心技术》、《架构修炼之道——亿级网关、平台开放、分布式、微服务、容错等核心技术修炼实践》等等。 - -目前我觉得能推荐的只有李运华老师的 **[《从零开始学架构》](https://book.douban.com/subject/30335935/)** 和 余春龙老师的 **[《软件架构设计:大型网站技术架构与业务架构融合之道》](https://book.douban.com/subject/30443578/ "《软件架构设计:大型网站技术架构与业务架构融合之道》")** 。 - -![](https://oss.javaguide.cn/github/javaguide/books/20210412224443177.png) - -《从零开始学架构》这本书对应的有一个极客时间的专栏—《从零开始学架构》,里面的很多内容都是这个专栏里面的,两者买其一就可以了。我看了很小一部分,内容挺全面的,是一本真正在讲如何做架构的书籍。 - -![](https://oss.javaguide.cn/github/javaguide/books/20210412232441459.png) - -事务与锁、分布式(CAP、分布式事务……)、高并发、高可用 《软件架构设计:大型网站技术架构与业务架构融合之道》 这本书都有介绍到。 - -## 面试 - -**《JavaGuide 面试突击版》** - -![](https://oss.javaguide.cn/github/javaguide-mianshituji/image-20220830103023493.png) - -![](https://oss.javaguide.cn/github/javaguide-mianshituji/image-20220830102925775.png) - -[JavaGuide](https://javaguide.cn/) 的面试版本,涵盖了 Java 后端方面的大部分知识点比如 集合、JVM、多线程还有数据库 MySQL 等内容。 - -公众号后台回复:“**面试突击**” 即可免费获取,无任何套路。 - -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/books/readme.md b/docs/books/readme.md deleted file mode 100644 index 700a7ea0e3ec2ac3b9239a4ed0e0a3210cb38336..0000000000000000000000000000000000000000 --- a/docs/books/readme.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 技术书籍精选 -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) - -如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份书单,感谢! - -## 公众号 - -最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。 - -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/books/search-engine.md b/docs/books/search-engine.md deleted file mode 100644 index 84124efa7efd5ddc7ec1b7baf8c35eb726fbe5b1..0000000000000000000000000000000000000000 --- a/docs/books/search-engine.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: 搜索引擎必读经典书籍 -category: 计算机书籍 -icon: "search" ---- - -## Lucene - -Elasticsearch 在 Apache Lucene 的基础上开发而成,学习 ES 之前,建议简单了解一下 Lucene 的相关概念。 - -**[《Lucene 实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。 - -![《Lucene实战》-实战](https://oss.javaguide.cn/github/javaguide/books/vAJkdYEyol4e6Nr.png) - -## Elasticsearch - -极客时间的[《Elasticsearch 核心技术与实战》](http://gk.link/a/10bcT "《Elasticsearch 核心技术与实战》")这门课程基于 Elasticsearch 7.1 版本讲解,还算比较新。并且,作者是 eBay 资深技术专家,有 20 年的行业经验,课程质量有保障! - -![《Elasticsearch 核心技术与实战》-极客时间](https://oss.javaguide.cn/github/javaguide/csdn/20210420231125225.png) - -如果你想看书的话,可以考虑一下 **[《Elasticsearch 实战》](https://book.douban.com/subject/30380439/)** 这本书。不过,需要说明的是,这本书中的 Elasticsearch 版本比较老,你可以将其作为一个参考书籍来看,有一些原理性的东西可以在上面找找答案。 - -![《Elasticsearch 实战》-豆瓣](https://oss.javaguide.cn/p3-juejin/d8b7fa83490e466aa212382cd323d37f~tplv-k3u1fbpfcp-zoom-1.png) - -如果你想进一步深入研究 Elasticsearch 原理的话,可以看看张超老师的 **[《Elasticsearch 源码解析与优化实战》](https://book.douban.com/subject/30386800/)** 这本书。这是市面上唯一一本写 Elasticsearch 源码的书。 - -![《Elasticsearch 源码解析与优化实战》-豆瓣](https://oss.javaguide.cn/p3-juejin/f856485931a945639d5c23aaed74fb38~tplv-k3u1fbpfcp-zoom-1.png) diff --git a/docs/books/software-quality.md b/docs/books/software-quality.md deleted file mode 100644 index 5cfce79dfaab943cde8b36f1ec3bbcc93710d09f..0000000000000000000000000000000000000000 --- a/docs/books/software-quality.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: 软件质量必读经典书籍 -category: 计算机书籍 -icon: "highavailable" -head: - - - meta - - name: keywords - content: 软件质量书籍精选 ---- - -下面推荐都是我看过并且我觉得值得推荐的书籍。 - -不过,这些书籍都比较偏理论,只能帮助你建立一个写优秀代码的意识标准。 如果你想要编写更高质量的代码、更高质量的软件,还是应该多去看优秀的源码,多去学习优秀的代码实践。 - -## 代码整洁之道 - -**[《重构》](https://book.douban.com/subject/30468597/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210328174841577.png) - -必看书籍!无需多言。编程书籍领域的瑰宝。 - -世界顶级、国宝级别的 Martin Fowler 的书籍,可以说是软件开发领域最经典的几本书之一。目前已经出了第二版。 - -这是一本值得你看很多遍的书籍。 - -**[《Clean Code》](https://book.douban.com/subject/4199741/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210328174824891.png) - -《Clean Code》是 Bob 大叔的一本经典著作,强烈建议小伙伴们一定要看看。 - -Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓是对后生的一大馈赠。 - -**[《Effective Java 》](https://book.douban.com/subject/30412517/)** - -![](https://oss.javaguide.cn/github/javaguide/books/82d510c951384383b325080428af6c0a.png) - -《Effective Java 》这本书是 Java 领域国宝级别的书,非常经典。Java 程序员必看! - -这本书主要介绍了在 Java 编程中很多极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。这篇文章能够非常实际地帮助你写出更加清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。 - -**[《代码大全》](https://book.douban.com/subject/1477390/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210314173253221.png) - -其实,《代码大全(第 2 版)》这本书我本身是不太想推荐给大家了。但是,看在它的豆瓣评分这么高的份上,还是拿出来说说吧! - -这也是一本非常经典的书籍,第二版对第一版进行了重写。 - -我简单地浏览过全书的内容,感觉内容总体比较虚,对于大部分程序员的作用其实不大。如果你想要切实地提高自己的代码质量,《Clean Code》和 《编写可读代码的艺术》我觉得都要比《代码大全》这本书更好。 - -不过,最重要的还是要多看优秀的源码,多学习优秀的代码实践。 - -**[《编写可读代码的艺术》](https://book.douban.com/subject/10797189/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210314175536443.png) - -《编写可读代码的艺术》这本书要表达的意思和《Clean Code》很像,你看它俩的目录就可以看出来了。 - -![](https://oss.javaguide.cn/github/javaguide/books/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70-20230309230739963.png) - -在我看来,如果你看过 《Clean Code》 的话,就不需要再看这本书了。当然,如果你有时间和精力,也可以快速过一遍。 - -另外,我这里还要推荐一个叫做 **[write-readable-code](https://github.com/biezhi/write-readable-code)** 的仓库。这个仓库的作者免费分享了一系列基于《编写可读代码的艺术》这本书的视频。这一系列视频会基于 Java 语言来教你如何优化咱们的代码。 - -在实践中学习的效果肯定会更好!推荐小伙伴们都抓紧学起来啊! - -![](https://oss.javaguide.cn/github/javaguide/books/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MzM3Mjcy,size_16,color_FFFFFF,t_70-20230309230743258.png) - -## 程序员职业素养 - -**[《The Clean Coder》](https://book.douban.com/subject/26919457/)** - -![](https://oss.javaguide.cn/github/javaguide/books/20210314191210273.png) - -《 The Clean Coder》是 Bob 大叔的又一经典著作。 - -《Clean Code》和《 The Clean Coder》这两本书在国内都翻译为 《代码整洁之道》,我觉得这个翻译还是不够优雅的。 - -另外,两者的内容差异也很大。《Clean Code》这本书从代码层面来讲解如何提高自己的代码质量。而《The Clean Coder》这本书则是从如何成为一名更优秀的开发者的角度来写的,比如这书会教你如何在自己的领域更专业、如何说不、如何做时间管理、如何处理压力等等。 - -## 架构整洁之道 - -**[《架构整洁之道》](https://book.douban.com/subject/30333919/)** - -![](https://oss.javaguide.cn/github/javaguide/books/2021031412342771.png) - -你没看错,《架构整洁之道》这本书又是 Bob 大叔的经典之作。 - -这本书我强烈安利!认真读完之后,我保证你对编程本质、编程语言的本质、软件设计、架构设计可以有进一步的认识。 - -国内的很多书籍和专栏都借鉴了《架构整洁之道》 这本书。毫不夸张地说,《架构整洁之道》就是架构领域最经典的书籍之一。 - -正如作者说的那样: - -> 如果深入研究计算机编程的本质,我们就会发现这 50 年来,计算机编程基本没有什么大的变化。编程语言稍微进步了一点,工具的质量大大提升了,但是计算机程序的基本构造没有什么变化。 -> -> 虽然我们有了新的编程语言、新的编程框架、新的编程范式,但是软件架构的规则仍然和 1946 年阿兰·图灵写下第一行机器代码的时候一样。 -> -> 这本书就是为了把这些永恒不变的软件架构规则展现出来。 - -## 项目管理 - -**[《人月神话》](https://book.douban.com/subject/1102259/)** - -![](https://oss.javaguide.cn/2021/03/8ece325c-4491-4ffd-9d3d-77e95159ec40.png) - -这本书主要描述了软件开发的基本定律:**一个需要 10 天才能干完的活,不可能让 10 个人在 1 天干完!** - -看书名的第一眼,感觉不像是技术类的书籍。但是,就是这样一个看似和编程不沾边的书名,却成了编程领域长久相传的经典。 - -**这本书对于现代软件尤其是复杂软件的开发的规范化有深刻的意义。** - -**[《领域驱动设计:软件核心复杂性应对之道》](https://book.douban.com/subject/5344973/)** - -![](https://oss.javaguide.cn/2021/03/7e80418d-20b1-4066-b9af-cfe434b1bf1a.png) - -这本领域驱动设计方面的经典之作一直被各种推荐,但是我还来及读。 - -## 其他 - -- [《代码的未来》](https://book.douban.com/subject/24536403/):这本书的作者是 Ruby 之父松本行弘,算是一本年代比较久远的书籍(13 年出版),不过,还是非常值得一读。这本书的内容主要介绍是编程/编程语言的本质。我个人还是比较喜欢松本行弘的文字风格,并且,你看他的文章也确实能够有所收获。 -- [《深入浅出设计模式》](https://book.douban.com/subject/1488876/):比较有趣的风格,适合设计模式入门。 -- [《软件架构设计:大型网站技术架构与业务架构融合之道》](https://book.douban.com/subject/30443578/):内容非常全面。适合面试前突击一些比较重要的理论知识,也适合拿来扩充/完善自己的技术广度。 -- [《微服务架构设计模式》](https://book.douban.com/subject/33425123/):这本书是世界十大软件架构师之一、微服务架构先驱 Chris Richardson 亲笔撰写,豆瓣评分 9.6。示例代码使用 Java 语言和 Spring 框架。帮助你设计、实现、测试和部署基于微服务的应用程序。 - -最后再推荐两个相关的文档: - -- **阿里巴巴 Java 开发手册**: -- **Google Java 编程风格指南**: diff --git a/docs/cs-basics/network/tcp-connection-and-disconnection.md b/docs/cs-basics/network/tcp-connection-and-disconnection.md index cc09bdce505bbfec1b2e0d1cd3561a06d085a725..623df379527f01b3f006bc7869e508d330eca5b2 100644 --- a/docs/cs-basics/network/tcp-connection-and-disconnection.md +++ b/docs/cs-basics/network/tcp-connection-and-disconnection.md @@ -13,6 +13,28 @@ tag: 建立一个 TCP 连接需要“三次握手”,缺一不可: +> SYN +> +> 就是同步的意思,大概表示的就是发起请求 +> +> ```text +> 可以将SYN视为“打招呼”或“发起请求”的信号。 +> 在TCP的三次握手过程中,客户端发送一个带有SYN标志的包给服务器,表示客户端请求建立连接。 +> SYN包中包含一个初始序列号(Initial Sequence Number,ISN),用于在数据传输中唯一标识每个字节。 +> 客户端选择一个随机的ISN,并将其放入TCP头部的序列号字段,向服务器发起连接请求。 +> ``` + +> ACK +> +> 为确认的意思,大致表示的是收到消息 +> +> ```text +> 可以将ACK视为“收到消息”的信号。 +> 在TCP通信中,接收方用ACK标志来确认已经接收到的字节数据。 +> 当接收到SYN包后,服务器会回复一个带有SYN/ACK标志的包给客户端,表示确认收到了客户端的请求,并同意建立连接。 +> 这个包中,服务器选择一个随机的ISN作为自己的初始序列号,并将确认号字段设置为客户端的ISN加1,表示已经成功接收到了SYN包。 +> ``` + - **一次握手**:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 **SYN_SEND** 状态,等待服务器的确认; - **二次握手**:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 **SYN_RECV** 状态 - **三次握手**:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务器端都进入**ESTABLISHED** 状态,完成 TCP 三次握手。 diff --git a/docs/database/redis/imgs/202221884139445.jpg b/docs/database/redis/imgs/202221884139445.jpg new file mode 100644 index 0000000000000000000000000000000000000000..882424c295d3ac44fd19d6503d8e008d7ccc22ef Binary files /dev/null and b/docs/database/redis/imgs/202221884139445.jpg differ diff --git a/docs/database/redis/imgs/202221884156544.gif b/docs/database/redis/imgs/202221884156544.gif new file mode 100644 index 0000000000000000000000000000000000000000..25193cbd86a9d5b7ed848f2c101699a0e8411193 Binary files /dev/null and b/docs/database/redis/imgs/202221884156544.gif differ diff --git a/docs/database/redis/imgs/2696113-20220414101939247-299165978.png b/docs/database/redis/imgs/2696113-20220414101939247-299165978.png new file mode 100644 index 0000000000000000000000000000000000000000..7e86f116fecf5816271508a57fd97795f3b32426 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220414101939247-299165978.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092639566-1455361370.png b/docs/database/redis/imgs/2696113-20220422092639566-1455361370.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2f071a26e59a92b75290a8e49577f3655e84ae Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092639566-1455361370.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092703711-1537932948.png b/docs/database/redis/imgs/2696113-20220422092703711-1537932948.png new file mode 100644 index 0000000000000000000000000000000000000000..709ed879a06ca0c9db3123029c5b55e4b397ddc5 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092703711-1537932948.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092816997-1001388706.png b/docs/database/redis/imgs/2696113-20220422092816997-1001388706.png new file mode 100644 index 0000000000000000000000000000000000000000..4da556b16baad3ecc7452b259917b8c170defb87 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092816997-1001388706.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092904007-1670304877.png b/docs/database/redis/imgs/2696113-20220422092904007-1670304877.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddc897a73f7bb4b3499e71ca58cb6412240b7a9 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092904007-1670304877.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092932678-1899635452.png b/docs/database/redis/imgs/2696113-20220422092932678-1899635452.png new file mode 100644 index 0000000000000000000000000000000000000000..9fcd351e0b36d8dae9b5a3cc583666767c8232e6 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092932678-1899635452.png differ diff --git a/docs/database/redis/imgs/2696113-20220422092958244-881010833.png b/docs/database/redis/imgs/2696113-20220422092958244-881010833.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3d274bcab4c8b88a2b4f01c6b2f5fb8386a706 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422092958244-881010833.png differ diff --git a/docs/database/redis/imgs/2696113-20220422093030366-1775368420.png b/docs/database/redis/imgs/2696113-20220422093030366-1775368420.png new file mode 100644 index 0000000000000000000000000000000000000000..730f1dad3896e4cda1c5d17dead60f76d09cf8e2 Binary files /dev/null and b/docs/database/redis/imgs/2696113-20220422093030366-1775368420.png differ diff --git a/docs/database/redis/imgs/8846b3aef89643908d358bb397f5ac14.png b/docs/database/redis/imgs/8846b3aef89643908d358bb397f5ac14.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc0dc23e60d0ae85ed75fa7c50afd7b93f136b0 Binary files /dev/null and b/docs/database/redis/imgs/8846b3aef89643908d358bb397f5ac14.png differ diff --git a/docs/database/redis/imgs/fc51145de60f499587872cdd871a26a8.png b/docs/database/redis/imgs/fc51145de60f499587872cdd871a26a8.png new file mode 100644 index 0000000000000000000000000000000000000000..7084430f411bb9374076a6ad443ef1ec74168cbe Binary files /dev/null and b/docs/database/redis/imgs/fc51145de60f499587872cdd871a26a8.png differ diff --git a/docs/database/redis/imgs/image-20240108111416166.png b/docs/database/redis/imgs/image-20240108111416166.png new file mode 100644 index 0000000000000000000000000000000000000000..5169d94d6c2e7ee48e555b2321f01d86a92e8b68 Binary files /dev/null and b/docs/database/redis/imgs/image-20240108111416166.png differ diff --git a/docs/database/redis/imgs/image-20240108111433856.png b/docs/database/redis/imgs/image-20240108111433856.png new file mode 100644 index 0000000000000000000000000000000000000000..067e2c26a60dd6323862cdc8c54e48f03f71927c Binary files /dev/null and b/docs/database/redis/imgs/image-20240108111433856.png differ diff --git a/docs/database/redis/redis-cluster.md b/docs/database/redis/redis-cluster.md deleted file mode 100644 index 60cd7dda8585c18ab4cfdeae0b9464fbf434de78..0000000000000000000000000000000000000000 --- a/docs/database/redis/redis-cluster.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Redis集群详解(付费) -category: 数据库 -tag: - - Redis ---- - -**Redis 集群** 相关的面试题为我的 [知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。 - -![](https://oss.javaguide.cn/github/javaguide/database/redis/redis-cluster-javamianshizhibei.png) - - - - diff --git "a/docs/database/redis/redis\351\233\206\347\276\244.md" "b/docs/database/redis/redis\351\233\206\347\276\244.md" new file mode 100644 index 0000000000000000000000000000000000000000..2d32684da2e486c6f6b98cf8d9e1bb370e71a45c --- /dev/null +++ "b/docs/database/redis/redis\351\233\206\347\276\244.md" @@ -0,0 +1,210 @@ +## 单机模式 + +- 下载地址: http://download.redis.io/releases/redis-5.0.7.tar.gz + +- 启动redis + ```bash + tar -zxvf redis-5.0.7.tar.gz + cd redis-5.0.7 + # 安装gcc环境(如果没有) + yum install -y gcc + make (如果报错的话可以使用这个命令 make MALLOC=libc) + + # 进入 /redis-5.0.7/src 目录下 这种方式没有指明配置文件,redis将采用默认配置 + cd /redis-5.0.7/src + ./redis-server + + # 也可以指定配置文件启动 + # 进入 src 目录,指定配置文件,配置文件在上一目录 + ./redis-server ../redis.conf + + # 关闭redis服务 + ./redis-cli -p 6379 shutdown + ``` + + 启动成功后如图 + ![image](./imgs/2696113-20220414101939247-299165978.png) + +## 主从模式 + + + +## 哨兵模式 + +- 适用场景:哨兵模式在主从复制的基础上,实现了自动化的故障修复。它主要用于实现高可用性,可以在主节点出现故障时自动将服务切换到从节点。然而,哨兵模式无法对从节点进行自动故障转移,在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。***Redis的哨兵模式适用于需要高可用性但不需要负载均衡的场景。*** +- 哨兵(`sentinal`)是一个分布式系统,用于对主从结构中的每台服务器进行**`监控`**,当出现故障时通过投票机制**`选择`**新的 master 并将所有的 slave 连接到新的 master。 +- 说白了也是基于**主从复制**,在主从复制中slave的数据是完全来自于master。![img](./imgs/202221884139445.jpg) + ![img](./imgs/202221884156544.gif) +- 哨兵的作用 + - 监控 + - 不断的检查 master 和 slave 是否正常运行 + - master 存活检测、master 与 slave 运行情况检测 + + - 通知(提醒) + - 自动故障转移 + - 断开 master 与 slave 连接,选取一个 slave 作为 master,将其他的 slave 连接到新的 master,并告知客户端新的服务器地址 + + + + +## cluster模式 + +- 适用场景:Cluster集群模式通过分片存储数据,实现了较为完善的高可用方案。它解决了写操作无法负载均衡以及存储能力受到单机限制的问题。在存储数据很大的时候,Cluster模式可以有效地分摊读写压力。然而,由于数据分布存储在不同节点,需要通过特定的算法进行数据分片,这会增加系统的复杂性。***Cluster集群模式适用于需要处理大规模数据并实现负载均衡的场景。*** + +- Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式为slot=CRC16(key)&16383。每一个节点负责维护一部 分槽以及槽所映射的键值数据 + +- 比如5个结点,每个槽负责大约3276个槽的数据。槽与节点关系图: + + ![img](./imgs/8846b3aef89643908d358bb397f5ac14.png) + +通过CRC16(key)&16383把key映射到槽上: + +![img](./imgs/fc51145de60f499587872cdd871a26a8.png) + +## redis与数据库的一致性问题 + +![image-20240108111433856](./imgs/image-20240108111433856.png) + +### 环境搭建 + +#### 安装 + +| server | ip | port | +| :------: | :-------------: | :--: | +| redis-01 | 192.168.180.196 | 7001 | +| redis-02 | 192.168.180.196 | 7002 | +| redis-03 | 192.168.180.196 | 7003 | +| redis-04 | 192.168.180.196 | 7004 | +| redis-05 | 192.168.180.196 | 7005 | +| redis-06 | 192.168.180.196 | 7006 | + +```bash +# 此处我是在一台服务器上安装6台redis服务,也可以在6台服务器上分别安装,视各自情况而定 +# 在 opt 目录下,创建 redis-cluster 目录,然后安装redis +cd /opt +mkdir redis-cluster +``` + +解压完压缩包,然后 make 完毕之后,执行 cp 命令,拷贝5份 + +```bash +# 先将解压后的文件夹重命名 redis-01 +mv redis-5.0.7 redis-01 +# 进行拷贝 +cp -R redis-01/ redis-02 +cp -R redis-01/ redis-03 +cp -R redis-01/ redis-04 +cp -R redis-01/ redis-05 +cp -R redis-01/ redis-06 +``` + +#### 配置 + +在redis-cluster 创建 redis-data,再在该文件夹中创建7001~7007七个文件夹,存放对应redis服务的数据 + +```bash +cd redis-cluster +mkdir redis-data +cd redis-data +mkdir 7001 7002 ... +``` + +![image](./imgs/2696113-20220422092639566-1455361370.png) + +再将redis-01文件夹下的 redis.conf 配置文件,拷贝出来,放在 redis-cluster 文件夹下, + +重命名为redis-01.conf,同样的,拷贝7份,如图所示: + +![image](./imgs/2696113-20220422092703711-1537932948.png) + +#### 编辑配置文件 + +```bash +# 添加端口号 +port 7001 +# 设置为守护进程,配置 redis 后台运行 +daemonize yes +# pid 文件,会自动创建的,直接指定目录 +pidfile /var/run/redis_7001.pid +# 数据保存位置 +dir /opt/redis-cluster/redis-data/7001 +# 关闭保护模式 +protected-mode no +# 开启集群 +cluster-enabled yes +# 集群配置文件,不需要我们维护,首次启动的时候会自动生成 +cluster-config-file nodes_7001.conf +# 请求超时时间 +cluster-node-timeout 10100 +# 开启 AOF 日志 +appendonly yes +``` + +其它6个配置文件,同样修改,7001 改为700n + +#### 创建启动脚本 + +`start-all.sh` + +```bash +touch start-all.sh +# 修改执行权限 +chmod +x start-all.sh +# 以下是脚本内容 +/opt/redis-cluster/redis-01/src/redis-server /opt/redis-cluster/redis-data/7001/redis.conf +/opt/redis-cluster/redis-02/src/redis-server /opt/redis-cluster/redis-data/7002/redis.conf +/opt/redis-cluster/redis-03/src/redis-server /opt/redis-cluster/redis-data/7003/redis.conf +/opt/redis-cluster/redis-04/src/redis-server /opt/redis-cluster/redis-data/7004/redis.conf +/opt/redis-cluster/redis-05/src/redis-server /opt/redis-cluster/redis-data/7005/redis.conf +/opt/redis-cluster/redis-05/src/redis-server /opt/redis-cluster/redis-data/7006/redis.conf +``` + +#### 关闭脚本 + +`stop-all.sh` + +```bash +/opt/redis-cluster/redis-01/src/redis-cli -p 7001 shutdown +/opt/redis-cluster/redis-01/src/redis-cli -p 7002 shutdown +/opt/redis-cluster/redis-01/src/redis-cli -p 7003 shutdown +/opt/redis-cluster/redis-01/src/redis-cli -p 7004 shutdown +/opt/redis-cluster/redis-01/src/redis-cli -p 7005 shutdown +/opt/redis-cluster/redis-01/src/redis-cli -p 7006 shutdown +``` + +#### 启动 + +执行命令 `./start-all.sh` + +![image](./imgs/2696113-20220422092816997-1001388706.png) + +#### 创建集群 + +随便登录一个redis-cli,执行创建集群命令 + +```bash +./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 +``` + +执行命令后,可以看到在创建集群,中间需要输入 `yes` 命令 + +最后,控制台出现 `ok` 即集群创建完成。 + +![image](./imgs/2696113-20220422092904007-1670304877.png) + +#### 查看集群 + +登录集群,-c表示以集群模式登录 + +``` +redis -cli -c -h 127.0.0.1 -p 7001 +``` + +1. `cluster info` 命令,查看集群信息 + ![image](./imgs/2696113-20220422092932678-1899635452.png) + +2. `cluster nodes` 查看节点信息 + ![image](./imgs/2696113-20220422092958244-881010833.png) + +3. `cluster slots` 查看槽信息 + ![image](./imgs/2696113-20220422093030366-1775368420.png) diff --git a/docs/distributed-system/seata.md b/docs/distributed-system/seata.md new file mode 100644 index 0000000000000000000000000000000000000000..57bec51b8c02a6cba47e96b693b3074085c28d4a --- /dev/null +++ b/docs/distributed-system/seata.md @@ -0,0 +1,26 @@ +> Seata是一款开源的分布式事务解决方案致力于提低高性简单易用的分布式事务服务。Seata将为用户提供AT、TCC、SAGA XA务模式,为用户打造一站式的分布式解决万案。AT模式是阿里首的模武,阿里云上有商用版本的GTS(Global Transacton Service全局事劳版务) + +### Seata中的事务模式 + +1. AT模式(auto transcation)(首推) +2. TCC模式 +3. Saga模式 +4. XA模式 + + + +### 1.1 Seata的三大角色 + +在seata的架构中,一共有三个角色 + +**TC(Transaction Coordinator) - 事务协调者** +维护全局和分支事务的状态,驱动全局事务提交或回滚。 + +**TM(Transaction Manager) - 事务管理器** +定义全局事务的范围:开始全局事务,提交或回滚全局事务 + +**RM(Resource Manager) - 资源管理器** +管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 + +==其中,TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端== + diff --git a/docs/high-availability/assets/15110b79f5472ab7881666597c64cb03.png b/docs/high-availability/assets/15110b79f5472ab7881666597c64cb03.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8c246914a09ac263cde342e981398f24f989b0 Binary files /dev/null and b/docs/high-availability/assets/15110b79f5472ab7881666597c64cb03.png differ diff --git a/docs/high-availability/assets/20200219111000334.jpg b/docs/high-availability/assets/20200219111000334.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60dff6421a9ebfd3a8d368b461e6610871c7a03c Binary files /dev/null and b/docs/high-availability/assets/20200219111000334.jpg differ diff --git a/docs/high-availability/assets/9fdc13cbb073b7231189cc86188b4cba.png b/docs/high-availability/assets/9fdc13cbb073b7231189cc86188b4cba.png new file mode 100644 index 0000000000000000000000000000000000000000..49d1b7b9beeae9e7ea31714ed3f42dfc91a27af6 Binary files /dev/null and b/docs/high-availability/assets/9fdc13cbb073b7231189cc86188b4cba.png differ diff --git a/docs/high-availability/assets/u=2921798127,3551110628&fm=253&fmt=auto&app=138&f=JPEG.webp b/docs/high-availability/assets/u=2921798127,3551110628&fm=253&fmt=auto&app=138&f=JPEG.webp new file mode 100644 index 0000000000000000000000000000000000000000..5e8fada58158443b26d908c0b40d96c78118732c Binary files /dev/null and b/docs/high-availability/assets/u=2921798127,3551110628&fm=253&fmt=auto&app=138&f=JPEG.webp differ diff --git a/docs/high-availability/limit-request.md b/docs/high-availability/limit-request.md index d809b64e1d669833a95dae62137dedae945bca2b..fde9f21d4b64583dc47e9a0d3d513f0e7730d53e 100644 --- a/docs/high-availability/limit-request.md +++ b/docs/high-availability/limit-request.md @@ -15,6 +15,10 @@ category: 高可用 > 图片来源于 InfoQ 的一篇文章[《分布式服务限流实战,已经为你排好坑了》](https://www.infoq.cn/article/Qg2tX8fyw5Vt-f3HH673)。 +### 计数器算法 + +。。。待补充。。。 + ### 固定窗口计数器算法 固定窗口其实就是时间窗口。**固定窗口计数器算法** 规定了我们单位时间处理的请求数量。 @@ -29,7 +33,12 @@ category: 高可用 除此之外,这种限流算法无法保证限流速率,因而无法应对突然激增的流量。例如,我们限制某个接口 1 分钟只能访问 1000 次,该接口的 QPS 为 500,前 55s 这个接口 1 个请求没有接收,后 1s 突然接收了 1000 个请求。然后,在当前场景下,这 1000 个请求在 1s 内是没办法被处理的,系统直接就被瞬时的大量请求给击垮了。 -![固定窗口计数器算法](https://static001.infoq.cn/resource/image/8d/15/8ded7a2b90e1482093f92fff555b3615.png) +![15110b79f5472ab7881666597c64cb03](./assets/15110b79f5472ab7881666597c64cb03.png) + +- 使用场景 + - 秒级以上的时间周期:对于秒级以上的时间周期,固定窗口算法可能会存在临界问题。例如,如果设定1秒内允许通过的请求阈值是200,如果有用户在时间窗口的最后几毫秒发送了200个请求,紧接着又在下一个时间窗口开始时发送了200个请求,那么这个用户其实在一秒内成功请求了400次,显然超过了阈值但并不会被限流。 + - 用户增长速度过快或热点事件:当用户增长速度过快或发生热点事件时,请求量可能会突然增加,导致接口压力过大。固定窗口算法可以在一定时间内限制访问量,从而减轻接口压力。 + - 爬虫或刷单行为:爬虫或刷单行为可能导致服务的请求量暴增,固定窗口算法可以限制这类行为的请求量,保护服务的稳定性。 ### 滑动窗口计数器算法 @@ -41,32 +50,57 @@ category: 高可用 很显然, **当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。** -![滑动窗口计数器算法](https://static001.infoq.cn/resource/image/ae/15/ae4d3cd14efb8dc7046d691c90264715.png) +![u=2921798127,3551110628&fm=253&fmt=auto&app=138&f=JPEG](./assets/u=2921798127,3551110628&fm=253&fmt=auto&app=138&f=JPEG.webp) 滑动窗口计数器算法可以应对突然激增的流量,但依然存在限流不够平滑的问题。 +- *滑动窗口算法的应用场景主要包括:* + 1. 数据对账:例如,按天做数据条数校对,需要合理切分子任务,控制批次数据的量,避免过程中出现OOM(Out of memory)。 + 2. 账号风险打分、账号打标签等非实时性的、可异步的计算场景。 + 3. 解决一些“满足一定要求的子区间”问题,例如,寻找数组或字符串中的最长或最短连续子数组或子字符串。 + ### 漏桶算法 我们可以把发请求的动作比作成注水到桶中,我们处理请求的过程可以比喻为漏桶漏水。我们往桶中以任意速率流入水,以一定速率流出水。当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。 如果想要实现这个算法的话也很简单,准备一个队列用来保存请求,然后我们定期从队列中拿请求来执行就好了(和消息队列削峰/限流的思想是一样的)。 -![漏桶算法](https://static001.infoq.cn/resource/image/75/03/75938d1010138ce66e38c6ed0392f103.png) +![9fdc13cbb073b7231189cc86188b4cba](./assets/9fdc13cbb073b7231189cc86188b4cba.png) 漏桶算法可以控制限流速率,避免网络拥塞和系统过载。不过,漏桶算法无法应对突然激增的流量,因为只能以固定的速率处理请求,对系统资源利用不够友好。 实际业务场景中,基本不会使用漏桶算法。 +- ***漏桶算法的应用场景包括但不限于以下几个方面:*** + + 1. 流量控制:在高并发环境下,为了保护系统免受过载的影响,可以利用漏桶算法对流量进行控制。通过限制每个请求进入系统的速率,确保系统能够平稳处理请求。这在访问频率限制、API 接口限流等场景中非常常见。 + + 1. 平滑网络传输:漏桶算法还可以用于平滑网络传输中的数据流。通过固定传输速率,使得数据包以均匀的速度发送,避免网络拥塞和突发流量对网络性能造成的影响。 + + 1. 缓解突发流量压力:当系统面对突发的流量压力时,漏桶算法可以起到缓冲的作用。通过设定合理的桶容量和出水速率,可以使系统在短时间内处理过载的请求,并释放剩余的请求。 + + 1. 保护后端服务免受大流量冲击:漏桶算法可以用于保护后端服务免受大流量冲击,避免服务崩溃。例如,对API调用进行限制,保证公平使用,稳定处理速率,避免流量激增。 + ### 令牌桶算法 令牌桶算法也比较简单。和漏桶算法算法一样,我们的主角还是桶(这限流算法和桶过不去啊)。不过现在桶里装的是令牌了,请求在被处理之前需要拿到一个令牌,请求处理完毕之后将这个令牌丢弃(删除)。我们根据限流大小,按照一定的速率往桶里添加令牌。如果桶装满了,就不能继续往里面继续添加令牌了。 -![令牌桶算法](https://static001.infoq.cn/resource/image/ec/93/eca0e5eaa35dac938c673fecf2ec9a93.png) +![20200219111000334](./assets/20200219111000334.jpg) 令牌桶算法可以限制平均速率和应对突然激增的流量,还可以动态调整生成令牌的速率。不过,如果令牌产生速率和桶的容量设置不合理,可能会出现问题比如大量的请求被丢弃、系统过载。 +- 以下是***令牌桶算法的一些应用场景:*** + + 1. 网络流量整形:在网络中传输数据时,为了防止网络拥塞,需要限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法可以控制发送到网络上数据的数目,并允许突发数据的发送。它可以根据需求生成令牌,然后以恒定的速率放入桶中,如果令牌被消耗的速度小于产生的速度,就会产生令牌溢出的情况。 + + 1. 限流:令牌桶算法可以用于限流,限制系统接收的请求数量。当请求到达时,需要从桶中获取一个令牌,如果没有令牌可取,则拒绝服务。令牌桶算法可以支持突发流量,因为只要有令牌就可以处理请求。 + + 1. 缓存系统:令牌桶算法也可以用于缓存系统,控制缓存的容量和访问速率。当新的请求到达时,需要从桶中获取一个令牌,如果没有令牌可取,则将请求转发到后端服务。这种方式可以保护后端服务免受突发流量的冲击。 + + 1. 实时数据处理:在实时数据处理系统中,令牌桶算法可以用于控制数据的处理速率。通过限制单位时间内处理的请求数量,可以保证系统能够平稳处理数据流 + ## 单机限流怎么做? 单机限流针对的是单体架构应用。 diff --git "a/docs/high-availability/\345\244\247\346\265\201\351\207\217\347\263\273\347\273\237\350\256\276\350\256\241.md" "b/docs/high-availability/\345\244\247\346\265\201\351\207\217\347\263\273\347\273\237\350\256\276\350\256\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..dae15ca182b37504e6b022a5bec25c5c959e5de3 --- /dev/null +++ "b/docs/high-availability/\345\244\247\346\265\201\351\207\217\347\263\273\347\273\237\350\256\276\350\256\241.md" @@ -0,0 +1,6 @@ +1. 前端 合并资源 减少不必要的请求 请求参数压缩 缓存 +2. 后端 dns解析(这里可以做一次负载均衡) + 1. cdn采用静态分离,根据不同地区来做一次分发,转发 + 2. LVS + 3. Nginx + 4. 网关 openfeign接口sential限流 \ No newline at end of file diff --git a/docs/high-performance/imgs/image-20240113001732132.png b/docs/high-performance/imgs/image-20240113001732132.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4c563885c6a309d1971afb1d54cda17695b7c6 Binary files /dev/null and b/docs/high-performance/imgs/image-20240113001732132.png differ diff --git a/docs/high-performance/imgs/image-20240113002017539.png b/docs/high-performance/imgs/image-20240113002017539.png new file mode 100644 index 0000000000000000000000000000000000000000..88c8dc08e989164716c7f699495943e262fc7a7a Binary files /dev/null and b/docs/high-performance/imgs/image-20240113002017539.png differ diff --git a/docs/high-performance/imgs/image-20240113002638000.png b/docs/high-performance/imgs/image-20240113002638000.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3c3b3d7e1643f2c189f9c9c2c59b61edc1bb6c Binary files /dev/null and b/docs/high-performance/imgs/image-20240113002638000.png differ diff --git a/docs/high-performance/imgs/image-20240113091551932.png b/docs/high-performance/imgs/image-20240113091551932.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c850ee4af0ecd1d47c7405ed78b0344721dee8 Binary files /dev/null and b/docs/high-performance/imgs/image-20240113091551932.png differ diff --git a/docs/high-performance/imgs/webp-1705109274067-3.webp b/docs/high-performance/imgs/webp-1705109274067-3.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6572569dacf4e6988f6a8024e72d2fef04c3bc5 Binary files /dev/null and b/docs/high-performance/imgs/webp-1705109274067-3.webp differ diff --git a/docs/high-performance/imgs/webp.webp b/docs/high-performance/imgs/webp.webp new file mode 100644 index 0000000000000000000000000000000000000000..d2f5f1218a50ec9a7943eaff6d77baf11c29277e Binary files /dev/null and b/docs/high-performance/imgs/webp.webp differ diff --git a/docs/high-performance/message-queue/imgs/4fc85100e279460689bb223dc005fd6a.png b/docs/high-performance/message-queue/imgs/4fc85100e279460689bb223dc005fd6a.png new file mode 100644 index 0000000000000000000000000000000000000000..11ccf87a59c6045583bd494868fc7b5c1f23880c Binary files /dev/null and b/docs/high-performance/message-queue/imgs/4fc85100e279460689bb223dc005fd6a.png differ diff --git a/docs/high-performance/message-queue/imgs/c53b450640f64f60ac51e93e9cec2b6a.png b/docs/high-performance/message-queue/imgs/c53b450640f64f60ac51e93e9cec2b6a.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0f795552e4789db495a5d308a348144d8c105d Binary files /dev/null and b/docs/high-performance/message-queue/imgs/c53b450640f64f60ac51e93e9cec2b6a.png differ diff --git a/docs/high-performance/message-queue/imgs/image-20240113121547417.png b/docs/high-performance/message-queue/imgs/image-20240113121547417.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4f1b3075cecf6373f8de1408cde80b31cf4ab7 Binary files /dev/null and b/docs/high-performance/message-queue/imgs/image-20240113121547417.png differ diff --git a/docs/high-performance/message-queue/imgs/image-20240113122400163.png b/docs/high-performance/message-queue/imgs/image-20240113122400163.png new file mode 100644 index 0000000000000000000000000000000000000000..ec54fc36697fe9edf498fbea3a20bb9a4fd15269 Binary files /dev/null and b/docs/high-performance/message-queue/imgs/image-20240113122400163.png differ diff --git a/docs/high-performance/message-queue/imgs/image-20240113154246441.png b/docs/high-performance/message-queue/imgs/image-20240113154246441.png new file mode 100644 index 0000000000000000000000000000000000000000..c5814fc6fb7b48daa14868f8c85a49205d4edc7c Binary files /dev/null and b/docs/high-performance/message-queue/imgs/image-20240113154246441.png differ diff --git a/docs/high-performance/message-queue/imgs/image-20240113154718684.png b/docs/high-performance/message-queue/imgs/image-20240113154718684.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa25b3fe27e6910bd937141bf9700ad10b4783c Binary files /dev/null and b/docs/high-performance/message-queue/imgs/image-20240113154718684.png differ diff --git a/docs/high-performance/message-queue/imgs/image-20240113155050785.png b/docs/high-performance/message-queue/imgs/image-20240113155050785.png new file mode 100644 index 0000000000000000000000000000000000000000..657ab5314dafb1d19d8ef213440ad97499ae690d Binary files /dev/null and b/docs/high-performance/message-queue/imgs/image-20240113155050785.png differ diff --git a/docs/high-performance/message-queue/kafka-questions-01.md b/docs/high-performance/message-queue/kafka-questions-01.md index 68ca0dd36b27f255775b6bb8b8f7ab187a37353f..3c02919ef7ab72edc6f602532d27d3471afafcce 100644 --- a/docs/high-performance/message-queue/kafka-questions-01.md +++ b/docs/high-performance/message-queue/kafka-questions-01.md @@ -7,6 +7,14 @@ tag: ## Kafka 基础 +### 吞吐量 + +> Kafka的具体吞吐量取决于多种因素,包括硬件配置、数据大小、网络带宽和延迟等。根据一些公开资料,Kafka的吞吐量可以达到每秒数百万条消息。 +> +> 例如,一些测试表明,在最佳配置下,Kafka可以每秒处理约25万条消息(约50MB/s)和55万条消息(约110MB/s)。这些测试结果表明,Kafka的吞吐量可以非常高,可以满足大规模数据流的处理需求。 +> +> 需要注意的是,Kafka的性能和吞吐量也受到客户端和应用程序的影响。因此,为了获得最佳性能和吞吐量,需要根据实际需求进行适当的配置和优化。 + ### Kafka 是什么?主要应用场景有哪些? Kafka 是一个分布式流式处理平台。这到底是什么意思呢? @@ -63,6 +71,180 @@ Kafka 主要有两大应用场景: > **RocketMQ 的消息模型和 Kafka 基本是完全一样的。唯一的区别是 Kafka 中没有队列这个概念,与之对应的是 Partition(分区)。** +### Kafka为什么能这么快 + +#### **利用Partition实现并行处理** + +Kafka的每个Topic都包含一个或多个Partition,不同Partition可位于不同节点。这种设计充分利用了集群的优势,实现了机器间的并行处理。同时,即使多个Partition位于同一个节点,也可以通过配置让它们分别置于不同的磁盘上,实现磁盘间的并行处理,充分发挥多磁盘的优势。 + +#### **顺序写入** + +Kafka优化了写入速度,采用了顺序写入的技术。在顺序读写的情况下,磁盘的顺序读写速度和内存持平。因为硬盘是机械结构,每次读写都会寻址 -> 写入,其中寻址是一个“机械动作”,是最耗时的。所以硬盘最讨厌随机I/O,最喜欢顺序I/O。 + +#### **零拷贝技术** + +传统的IO模型 + +![img](./imgs/4fc85100e279460689bb223dc005fd6a.png) + +如果要把磁盘中的某个文件发送到远程服务器需要经历以下几个步骤 + +1. 从磁盘中读取文件的内容,然后拷贝到内核缓冲区 + +2. CPU把内核缓冲区的数据赋值到用户空间的缓冲区 + +3. 在用户程序中调用write方法,把用户缓冲区的数据拷贝到内核下面的Socket Buffer中 + +4. 把内核下面的Socket Buffer中的数据赋值到网卡的缓冲区 + +5. 网卡的缓冲区把数据传输到目标服务器上 + +我们可以看到这个过程中经历了四次拷贝,我们所说的零拷贝并不是没有拷贝(数据赋值),去掉的两次浪费的拷贝分别是 + +1. 从内核空间赋值到用户空间的拷贝 + +2. 从用户空间再次复制到内核空间的拷贝 + +由于用户空间和内核空间的切换会带来CPU的上下文切换,对于CPU的性能也会造成影响 + +零拷贝就是把这两次多余的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不再需要经过应用程序所在的用户空间,所以零拷贝不是没有拷贝,而是对于用户空间来说,不再需要进行数据拷贝,这只是较少了不必要的拷贝次数而已 + +零拷贝的原理 + +![img](./imgs/c53b450640f64f60ac51e93e9cec2b6a.png) + + 在程序中实现零拷贝的方式: + +1. 在Linux中,零拷贝技术依赖于底层的sendfile方法实现 + +2. 在Java中,FileChannel.transferTo()方法的底层调用就是sendfile方法 + +3. MMAP文件映射机制 + +mmap(即 memory-mapped file)是一种内存映射文件的机制,它可以让程序将一个文件映射到进程的地址空间,从而实现文件和内存的无缝转换。 + +具体来说,使用mmap将一个文件映射到进程的地址空间后,该文件就可以像普通的内存一样被读写,甚至可以在多个进程之间共享,而不需要进行繁琐的文件读写操作。在使用mmap时,操作系统会自动将文件的某些部分或者整个文件的内容映射到内存中,而这些映射的内存区域可以被当作普通的内存指针来访问,从而实现对文件内容的访问。 + +mmap的一些主要应用场景包括: + +实现零拷贝(zero-copy)网络传输:可以将网络数据直接映射到进程的地址空间,避免了数据拷贝的开销。 +实现高性能的数据库和搜索引擎:将大规模的数据文件映射到内存中,可以大大提升数据的访问速度。 +实现内存共享和进程间通信:多个进程可以映射同一个文件到它们各自的地址空间,从而实现进程间共享数据的目的。 + + + + + + + +## Kafka集群部署 + +- 配置hosts文件 + + ``` + [root@flextrak opt]# cat /etc/hosts + 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 + ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 + 192.254.154.20 zookeeper1 zookeeper2 zookeeper3 + ``` + +- 下载文件到指定目录 + ``` + wget -P /opt http://192.168.1.43:886/kafka/kafka_2.13-2.5.0.tgz + tar -zxvf -C /opt/kafka_2.13-2.5.0.tgz -C /opt/ + mv /opt/kafka_2.13-2.5.0 kafka-01 + ``` + +- 修改conf目录下的配置文件`server.properties`,这里主要修改如下几个参数 + + | 实例 | broker.id | listeners | log.dirs | + | :-----: | :-------: | :---------------: | :--------------: | + | kafka01 | 1 | PLAINTEXT://:9092 | /tmp/kafka1-logs | + | kafka02 | 2 | PLAINTEXT://:9093 | /tmp/kafka2-logs | + | kafka03 | 3 | PLAINTEXT://:9094 | /tmp/kafka3-logs | + +- 部署详情 + +| ip | 端口 | 部署路径 | 启动命令 | +| :------------: | :--: | :-----------: | :----------------------------------------------------------: | +| 192.254.154.30 | 9092 | /opt/kafka-01 | nohup kafka-01/bin/kafka-server-start.sh kafka-01/config/server.properties & | +| 192.254.154.30 | 9093 | /opt/kafka-02 | nohup kafka-02/bin/kafka-server-start.sh kafka-02/config/server.properties & | +| 192.254.154.30 | 9094 | /opt/kafka-03 | nohup kafka-03/bin/kafka-server-start.sh kafka-03/config/server.properties & | + +## 常用命令 + +### topic + +``` +# 查看主题相关的命令参数 +bin/kafka-topics.sh + +# 查看服务器上的所有topic +kafka-topics.bat --bootstrap-server localhost:9092 --list + +# 创建topic +bin/kafka-topics.sh --bootstrap-server ip:9092 --create --partitions 1 --replication-factor 3 --topic first + +# 查看主题详情 +bin/kafka-topics.sh --bootstrap-server ip:9092 --describe --topic first + +# 修改分区数 (分区数只能增 不能减) +bin/kafka-topics.sh --bootstrap-server ip:9092 --alter --topic first --partitions 3 + +# 删除topic +bin/kafka-topics.sh --bootstrap-server ip:9092 --delete --topic first +``` + +### producer + +``` +# 查看操作生产者命令参数 +bin/kafka-console-producer.sh +``` + +| -参数 | -描述 | +| :---------------------------------------------- | :------------------------------------- | +| –bootstrap-server | 连接的 Kafka Broker 主机名称和端口号。 | +| –topic | 操作的 topic 名称 | + +发送消息 + +``` +bin/kafka-console-producer.sh --bootstrap-server ip:9092 --topic first +>hello world +``` + +### consumer + +``` +# 查看操作消费者命令参数 +bin/kafka-console-consumer.sh +``` + +| -参数 | -描述 | +| :---------------------------------------------- | :------------------------------------- | +| –bootstrap-server | 连接的 Kafka Broker 主机名称和端口号。 | +| –topic | 操作的 topic 名称。 | +| –from-beginning | 从头开始消费。 | +| –group | 指定消费者组名称。 | + +```bash +# 消费 first 主题中的数据。 +bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic first +# 把主题中所有的数据都读取出来(包括历史数据)。 +bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic first +``` + +### kafka连接工具 + +[Kafka Assistant - Kafka可视化管理与监控工具 (redisant.cn)](http://www.redisant.cn/ka) (国产的一款软件,好用,但是收费) + +![image-20240113121547417](./imgs/image-20240113121547417.png) + +[Offset Explorer (kafkatool.com)](https://www.kafkatool.com/download.html) + +![image-20240113122400163](./imgs/image-20240113122400163.png) + ## Kafka 核心概念 ### 什么是 Producer、Consumer、Broker、Topic、Partition? @@ -95,7 +277,8 @@ Kafka 将生产者发布的消息发送到 **Topic(主题)** 中,需要这 1. Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同的 Broker 上, 这样便能提供比较好的并发能力(负载均衡)。 2. Partition 可以指定对应的 Replica 数, 这也极大地提高了消息存储的安全性, 提高了容灾能力,不过也相应的增加了所需要的存储空间。 -## Zookeeper 和 Kafka + + ### Zookeeper 在 Kafka 中的作用是什么? diff --git a/docs/high-performance/message-queue/rabbitmq-questions.md b/docs/high-performance/message-queue/rabbitmq-questions.md index 8fbb53a952e8f81a7264fb8b616bddf0416b0030..5cace2d07dbe8a67efa722482e09cfc64c659f0a 100644 --- a/docs/high-performance/message-queue/rabbitmq-questions.md +++ b/docs/high-performance/message-queue/rabbitmq-questions.md @@ -132,6 +132,66 @@ direct 类型常用在处理有优先级的任务,根据任务的优先级把 headers 类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。在绑定队列和交换器时指定一组键值对,当发送消息到交换器时,RabbitMQ 会获取到该消息的 headers(也是一个键值对的形式),对比其中的键值对是否完全匹配队列和交换器绑定时指定的键值对,如果完全匹配则消息会路由到该队列,否则不会路由到该队列。headers 类型的交换器性能会很差,而且也不实用,基本上不会看到它的存在。 +## 部署 + +### 单机 + +```bash +cd /opt +wget http://192.168.1.43:886/Centos7_RabbitMQ/erlang-21.3-1.el7.x86_64.rpm +wget http://192.168.1.43:886/Centos7_RabbitMQ/rabbitmq-server-3.8.8-1.el7.noarch.rpm +wget http://192.168.1.43:886/Centos7_RabbitMQ/rabbitmq_delayed_message_exchange-3.8.0.ez +rpm -ivh erlang-21.3-1.el7.x86_64.rpm +# 安装rabbitmq需要依赖socat软件 +yum install socat -y +rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm +# 启动 +systemctl start rabbitmq-server +# 查看rabbitmq状态 +systemctl status rabbitmq-server +# 设置开机启动 +systemctl enable rabbitmq-server +``` + +如下图所示,说明`rabbitmq`启动成功 + +![image-20240113154246441](./imgs/image-20240113154246441.png) + +配置web管理界面,之后直接通过 主机地址:15672 就可以访问远程的web管理界面 + +```bash +rabbitmq-plugins enable rabbitmq_management +# 这里测试环境直接关闭防火墙 +systemctl stop firewalld +``` + +![image-20240113154718684](./imgs/image-20240113154718684.png) + +`rabbitmq`的web页面模式是没有提供登录账号的,需要自己去创建.(*也可以在/etc/rabbitmq目录下编辑rabbitmq.config配置文件,达到默认用户登陆。*) + +```bash +# 创建账号 +rabbitmqctl add_user admin 123 +# 设置用户角色 +rabbitmqctl set_user_tags admin administrator +# 设置用户权限:用户 user_admin 具有/vhost1 这个 virtual host 中所有资源的配置、写、读权限,相当于超级管理员权限。 +rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" +``` + +![image-20240113155050785](./imgs/image-20240113155050785.png) + +### 主备模式 + + + +### 主从模式 + + + +### 主主模式 + + + ## AMQP 是什么? RabbitMQ 就是 AMQP 协议的 `Erlang` 的实现(当然 RabbitMQ 还支持 `STOMP2`、 `MQTT3` 等协议 ) AMQP 的模型架构 和 RabbitMQ 的模型架构是一样的,生产者将消息发送给交换器,交换器和队列绑定 。 diff --git a/docs/high-performance/zookeeper.md b/docs/high-performance/zookeeper.md new file mode 100644 index 0000000000000000000000000000000000000000..316fa783fb510062e0dd4804bcc4e7fd8b882601 --- /dev/null +++ b/docs/high-performance/zookeeper.md @@ -0,0 +1,138 @@ +> zookeeper是一种分布式协调服务,可以再分布式系统中共享配置,协调锁资源,提供命名服务。 + +## 集群搭建(quorum模式) + +- | ip | client连接端口 | leader选举端口 | 集群通讯端口 | 部署路径 | + | :------------: | :------------: | :------------: | :----------: | :--------------- | + | 192.254.154.20 | 2181 | 3881 | 2881 | /opt/zookeeper-1 | + | 192.254.154.20 | 2182 | 3882 | 2882 | /opt/zookeeper-2 | + | 192.254.154.20 | 2183 | 3883 | 2883 | /opt/zookeeper-3 | + + + +- 下载安装包并执行如下名利 + + ```bash + wget -P /opt http://192.168.1.43:886/zookeeper/zookeeper-3.4.8.tar.gz && tar -zxvf /opt/zookeeper-3.4.8.tar.gz -C /opt + rm -f /opt/zookeeper-3.4.8.tar.gz + cd /opt + mv zookeeper-3.4.8 zookeeper-1 + mkdir zookeeper-1/data + cp zookeeper-1/conf/zoo_sample.cfg zookeeper-1/conf/zoo.cfg + ``` + +- 复制3份 + ![image-20240113001732132](./imgs/image-20240113001732132.png) + +- 在每个文件夹下分别创建data文件夹以及在conf文件夹下拷贝`zoo_sample.cfg`为新的`zoo.cfg`配置文件, + 同时在data目录下生成对应的myid(对应着文件夹的1 2 3序号) + +- 修改配置文件,这里需要注意三个实例的端口号不一样的 + ![image-20240113091551932](./imgs/image-20240113091551932.png) + +- 启动三个实例 + ```bash + sh zookeeper-1/bin/zkServer.sh start zookeeper-1/conf/zoo.cfg + sh zookeeper-2/bin/zkServer.sh start zookeeper-2/conf/zoo.cfg + sh zookeeper-3/bin/zkServer.sh start zookeeper-3/conf/zoo.cfg + ``` + +- 查看各节点状态 + ![image-20240113002638000](./imgs/image-20240113002638000.png) + + + +## 客户端命令操作 + +- 启动客户端 +```bash +# 启动客户端 +[root@localhost bin]# ./zkCli.sh +# 显示所有客户端操作命令 +[zk: localhost:2181(CONNECTED) 0] help +# 查看当前znode中所包含的内容 +[zk: localhost:2181(CONNECTED) 1] ls / +[zookeeper] +``` + +- 查看客户端节点详细数据 + +```bash +[zk: localhost:2181(CONNECTED) 2] ls -s / +[zookeeper] +cZxid = 0x0 +ctime = Wed Dec 31 19:00:00 EST 1969 +mZxid = 0x0 +mtime = Wed Dec 31 19:00:00 EST 1969 +pZxid = 0x0 +cversion = -1 +dataVersion = 0 +aclVersion = 0 +ephemeralOwner = 0x0 +dataLength = 0 +numChildren = 1 +``` + +当前节点参数的介绍见下: + +| 参数名 | 描述 | +| -------------- | ------------------------------------------------------------ | +| cZxid | 创建节点的事务。每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。 | +| ctime | 被创建的毫秒数(从1970年开始) | +| mZxid | 最后更新的事务zxid | +| mtime | 最后修改的毫秒数(从1970年开始) | +| pZxid | 最后更新的子节点zxid | +| cversion | 创建版本号,子节点修改次数 | +| dataVersion | 数据变化版本号 | +| aclVersion | 权限版本号 | +| ephemeralOwner | 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0 | +| dataLength | 数据长度 | +| numChildren | 子节点数 | + +## 数据模型 + +- `zookeeper数据模型`使用类似文件系统的树形结构 +- `zookeeper`把这个数据模型叫做`data` `tree`, `data tree`的每一个节点称为znode。 + +![img](./imgs/webp.webp) + +## 节点类型 + +- **永久节点**:客户端会话丢失时,`zookeeper`服务端不会自动删除这些节点 + +- **临时节点**:客户端会话丢失时,`zookeeper`服务端会自动删除这些节点 + +- **无序节点**:节点之间没有先后顺序关系 + +- **顺序节点**:节点之间有顺序关系,节点名称会按照创建顺序递增 + + + +## 节点角色 + +- **leader**:处理读写请求 +- **follower**:只能处理读请求,follower在收到写请求后会转发给leader +- **observer**:一种特殊的follower,处理读请求,不参与选举,不参与事务提交。只接收leader发送的inform信息更新自己的数据。一般用于跨区域数据同步 + observer一般用于跨机房的部署场景,能有效提升局部读性能。 + ![img](./imgs/webp-1705109274067-3.webp) + +## zookeeper 的watch机制 + +​ 当客户端对某个路径设置Watch时,Zookeeper服务端会将该Watch事件存储起来,并在该路径发生变化时向客户端发送通知。这种机制使得客户端可以实时地获取到Zookeeper服务端的数据变化情况,从而及时作出响应。 + + Watch机制具有一次性触发的特性,一旦Watch事件被触发,需要重新设置Watch才能再次接收通知。同时,Watch事件是异步发送到客户端的,Zookeeper可以保证客户端发送过去的更新顺序是有序的。 + +在Zookeeper中,可以通过调用`WatchManager.addWatch()`方法来添加watch。该方法的参数包括要监视的路径(path)和一个Watcher对象。 + +## zookeeper保证数据的一致性 + +?? + +## zookeeper的选举 + +1. **初始投票**:当服务器启动并进入选举模式时,每个Server都会给自己投上一票,投票信息包括服务器的myid和zxid,格式为(myid, zxid)。 +2. **同步投票结果**:集群中的服务器在投票后,会将各自的投票结果同步给集群中其他服务器。 +3. **检查投票有效性**:各服务器在收到投票后会检查投票的有效性,如是否本轮投票,是否来自LOOKING状态的服务器的投票等。 +4. **处理投票**:服务器之间会进行投票比对,规则是优先检查zxid,zxid较大的服务器优先作为Leader;如果zxid相同,则比较myid,myid较大的服务器作为Leader。 +5. **统计投票结果**:每轮投票比对之后都会统计投票结果,确认是否有超过半数的机器都得到相同的投票结果,如果是,则选出Leader,否则继续投票。 +6. **更改服务器状态**:一旦选出Leader,每个服务器就会更新自己的状态:Leader服务器的状态为LEADING,其他服务器的状态为FOLLOWING diff --git a/docs/interview-preparation/imgs/image-20240104134559837.png b/docs/interview-preparation/imgs/image-20240104134559837.png new file mode 100644 index 0000000000000000000000000000000000000000..97759be4098dafd55fe294085995ad54c6d2ceab Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240104134559837.png differ diff --git a/docs/interview-preparation/imgs/image-20240104134628890.png b/docs/interview-preparation/imgs/image-20240104134628890.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5377f7cce03ea485ba79b8ac47de927fd90609 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240104134628890.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175131294.png b/docs/interview-preparation/imgs/image-20240108175131294.png new file mode 100644 index 0000000000000000000000000000000000000000..0c737ad55860b712594fc12c45dc963e9f1fc457 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175131294.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175139394.png b/docs/interview-preparation/imgs/image-20240108175139394.png new file mode 100644 index 0000000000000000000000000000000000000000..136fbe4cd777be874b9437e804e11411148d4fc7 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175139394.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175146409.png b/docs/interview-preparation/imgs/image-20240108175146409.png new file mode 100644 index 0000000000000000000000000000000000000000..f4839107f15585882fa37929991e4cc23b6e0f5d Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175146409.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175153159.png b/docs/interview-preparation/imgs/image-20240108175153159.png new file mode 100644 index 0000000000000000000000000000000000000000..e809d3d55e3c829fb43075991fe84c7b2522b962 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175153159.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175159888.png b/docs/interview-preparation/imgs/image-20240108175159888.png new file mode 100644 index 0000000000000000000000000000000000000000..806bea9aac01d15d2876f652f26a6cb05045a16d Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175159888.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175206718.png b/docs/interview-preparation/imgs/image-20240108175206718.png new file mode 100644 index 0000000000000000000000000000000000000000..397e1d93187547e756c714a653e98cfc87f2b1fa Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175206718.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175215509.png b/docs/interview-preparation/imgs/image-20240108175215509.png new file mode 100644 index 0000000000000000000000000000000000000000..1641e7a5d6f546c3b885875f9c45ac40908fde1c Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175215509.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175222721.png b/docs/interview-preparation/imgs/image-20240108175222721.png new file mode 100644 index 0000000000000000000000000000000000000000..5f5e4a77c6f7bf5680da6db9d47b37529f485482 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175222721.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175230688.png b/docs/interview-preparation/imgs/image-20240108175230688.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c8fcf032cd137f4f6f46e354986864e59d9f56 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175230688.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175239037.png b/docs/interview-preparation/imgs/image-20240108175239037.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf1915d368c378f6ee93868adf6ae895bb876fc Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175239037.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175247914.png b/docs/interview-preparation/imgs/image-20240108175247914.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7b3a15100a03388f76f7779006113c82340bd2 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175247914.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175300696.png b/docs/interview-preparation/imgs/image-20240108175300696.png new file mode 100644 index 0000000000000000000000000000000000000000..fb907e3c7254b5220132d8ba2a13869f852d632e Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175300696.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175312578.png b/docs/interview-preparation/imgs/image-20240108175312578.png new file mode 100644 index 0000000000000000000000000000000000000000..703b00c0f2b05d9640a5680e9054b43fb7bd67e3 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175312578.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175319866.png b/docs/interview-preparation/imgs/image-20240108175319866.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7f2a4a70563b67bc4cc3c947b1bfff8857df10 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175319866.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175327182.png b/docs/interview-preparation/imgs/image-20240108175327182.png new file mode 100644 index 0000000000000000000000000000000000000000..789e9afc67e021689e2388ec5d9a7450db51ab69 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175327182.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175348029.png b/docs/interview-preparation/imgs/image-20240108175348029.png new file mode 100644 index 0000000000000000000000000000000000000000..6b7307958c6ab15489784230bc8e4e73bcb1a890 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175348029.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175356395.png b/docs/interview-preparation/imgs/image-20240108175356395.png new file mode 100644 index 0000000000000000000000000000000000000000..e14fa8264bcb7cf6f50df921d8751a9ce6fe3400 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175356395.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175407080.png b/docs/interview-preparation/imgs/image-20240108175407080.png new file mode 100644 index 0000000000000000000000000000000000000000..873ce3a7da2598a3c59b30ab4f60f98fa3734403 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175407080.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175415749.png b/docs/interview-preparation/imgs/image-20240108175415749.png new file mode 100644 index 0000000000000000000000000000000000000000..c0162e55b746310e01540993eef8d064633c6239 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175415749.png differ diff --git a/docs/interview-preparation/imgs/image-20240108175427491.png b/docs/interview-preparation/imgs/image-20240108175427491.png new file mode 100644 index 0000000000000000000000000000000000000000..f6b221de6e42b95234da81b4b93c1aabcfbd6e29 Binary files /dev/null and b/docs/interview-preparation/imgs/image-20240108175427491.png differ diff --git "a/docs/interview-preparation/\345\270\214\351\237\263\351\235\242\350\257\225/shein\351\235\242\350\257\225\351\242\230.md" "b/docs/interview-preparation/\345\270\214\351\237\263\351\235\242\350\257\225/shein\351\235\242\350\257\225\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..f161a9dbc9bc34fab76a3922296ab24e37acb8f7 --- /dev/null +++ "b/docs/interview-preparation/\345\270\214\351\237\263\351\235\242\350\257\225/shein\351\235\242\350\257\225\351\242\230.md" @@ -0,0 +1,116 @@ +# 高级java开发工程师 + +## 自我介绍 + +1. 自我介绍,掌握的技术栈介绍 +2. 说一个项目的具体某块业务实现过程 +3. 项目遇到的最大问题及解决办法 + + + + +## 面试 + +### 基础问题 + +1. 聊聊你对封装继承多态的各自理解 + + 1. 封装是指将数据和行为封装在一个类中,使得外部无法直接访问或修改其中的数据。这样可以保证数据的安全性和一致性,并且可以通过公共接口来控制数据的访问权限和行为。在面向对象编程中,封装可以通过访问修饰符来实现,如public、private和protected等。 + 2. 继承是指在已有的类的基础上,通过定义一个新的类来继承其中的属性和方法。这样可以避免重复编写代码,提高代码的复用性和可维护性。在面向对象编程中,继承可以通过extends关键字来实现。 + 3. 多态是指同一个方法或属性在不同的对象上可以表现出不同的行为。这样可以提高代码的灵活性和可扩展性,并且可以避免硬编码。在面向对象编程中,多态可以通过方法重载和方法重写来实现。 +2. error和exception的区别 + + > Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable类有两个重要的子类Exception(异常)和Error(错误)。 + > + > Exception和Error二者都是Java异常处理的重要子类,各自都包含大量子类。 + > + > Error:Error属于程序无法处理的错误,是JVM需要负担的责任,无法通过try-catch来进行捕获。例如,系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复。 + > + > 比如StackOverFlowError;VirtualMachineError;OutofMemoryError;ThreadDeath + > + > Exception:程序本身可以处理的异常,可以通过catch来进行捕获,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。Exception又可以分为运行时异常(RuntimeException,又叫非受检查异常unchecked Exception)和非运行时异常(又叫受检查异常checked Exception)。 + > + > checked Exception就是在写代码的时候,需要写try catch的Exception,这种Exception一般不会影响主体程序,可以由程序员手动诊断修复异常。 + > + > 比如IOException;SQLException;ClassNotFoundException + > + > unchecked Exception又称RunTimeException,这一类就是在代码处理了checked Exception之后,运行时候仍然会遇到的Exception。 + > + > 比如`NullPropagationException`;`ClassCastException`;ArithmeticException;IllegalArgumentException;IndexOutOfBoundsException(包括ArrayIndexOutofBoundsExcpetion;StringIndexOutofBoundsExcpetion);NumberFormatException。 + +3. Linklist和ArrayList有什么区别?是线程安全的吗?如何解决? + + Linklist和ArrayList是Java中两种常用的集合类,它们都实现了List接口,但是有一些区别: + + - Linklist是基于双向链表实现的,它可以在任意位置插入和删除元素,而不需要移动其他元素。它的查找效率较低,因为需要遍历链表。它占用的内存空间较大,因为每个节点除了存储数据外,还需要存储前后节点的引用。 + - ArrayList是基于数组实现的,它可以根据索引快速访问元素,但是在插入和删除元素时,需要移动其他元素,或者扩容数组。它占用的内存空间较小,因为每个元素只存储数据。 + + Linklist和ArrayList都不是线程安全的,如果多个线程同时对它们进行修改,可能会导致数据不一致或者并发异常。要解决这个问题,有以下几种方法: + + - 使用同步代码块或者同步方法,对集合的操作进行加锁,保证同一时间只有一个线程可以访问集合。这种方法的缺点是会降低并发性能,因为其他线程需要等待锁的释放。 + - 使用线程安全的集合类,如`Vector`或者`CopyOnWriteArrayList`,它们内部实现了同步机制,可以在多线程环境下安全地进行修改操作。这种方法的缺点是会增加内存开销,因为每次修改都需要复制一个新的数组。 + - 使用`Collections`工具类,提供了一些静态方法,可以将非线程安全的集合包装成线程安全的集合,如`Collections.synchronizedList`。这种方法的缺点是只能保证单个操作的原子性,不能保证复合操作的原子性,比如迭代器的遍历。 +4. 不用Collection呢?自己写如何解决? +5. 讲一下红黑树,b数和二叉平衡树 +6. Class.forName和classLoader有什么不同 +7. 讲讲类加载过程 +8. 讲讲你对jvm的认识 +9. 讲一下你对java锁的认识,乐观锁悲观锁分布式锁等等。 +10. 分布式锁用过吗,讲一下 +11. es了解过吗? +12. springboot为什么能够开箱即用 +13. 事务用过吗?有没有遇到事务失败的问题,知道是什么情况吗?如何解决? +14. redis有哪些数据结构,用过哪些 +15. 学过哪些mq? + + 1. kafkamq + 2. rabbitmq + +16. 不用JUC的线程池,如果让你设计一个线程池,说说你的设计思路 + +17. 反问环节 + + 1. 公司业务 + 2. 所用框架 + 3. 团队规模 +### mysql + +1. mysql慢sql优化思路 +2. mysql什么是最左前缀原则,最左前缀原则原理 +3. mysql回表是什么意思 +4. mysql中有一张表id自增name找出name重复的记录 + ```sql + SELECT name, COUNT(id) as count + FROM your_table_name + GROUP BY name + HAVING count > 1; + ``` + + +5. 我有四张表几十亿的数据,没有关联,我要从里面查询上个月的数据 select * from 表名 where time #面试#= '上个月',然后把结果合并,查询很慢,我怎么去优化,优化思路 + + 1. 分区,如果这些表支持分区(例如:MySQL的Partition功能),可以考虑根据时间或其他适当的字段对数据进行分区。这样,查询只会涉及相关的分区,从而大大减少查询的数据量 + 2. 时间字段索引,如果这些表中有一个表示时间的字段(如`time`),确保该字段已经被索引。这可以大大加快查询速度如果这些表中有一个表示时间的字段(如`time`),确保该字段已经被索引。这可以大大加快查询速度 + 3. 物化视图 + 如果经常需要查询上个月的数据,考虑创建一个物化视图来保存这个月的汇总数据。这样,你只需要查询这个物化视图而不是原始数据 + 4. 查询优化, + 1. 避免使用`SELECT *`,只选择你真正需要的字段。 + 2. 避免在`WHERE`子句中使用函数或复杂的表达式,这会导致全表扫描 + +### 多线程 + +1. voilate原理(缺点),可以用什么替代比较好 +2. 多线程计数countdowlatch原理 + +### redis + +1. redis分布式锁怎么实现 +2. redis除了5种数据结构还有没有其它数据结构 +3. redis加锁和设置过期时间非原子性操作,怎么去解决 +4. redis的集群模式 + +### 其它 + +1. 期望薪资 +2. 对加班有啥看法 +3. 你有啥想问我的吗 \ No newline at end of file diff --git "a/docs/interview-preparation/\350\211\276\350\236\215\346\234\272\350\200\203\351\242\230.md" "b/docs/interview-preparation/\350\211\276\350\236\215\346\234\272\350\200\203\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..14eb88b6bb6ae745f40bf42a19cdd96fdb366be3 --- /dev/null +++ "b/docs/interview-preparation/\350\211\276\350\236\215\346\234\272\350\200\203\351\242\230.md" @@ -0,0 +1,39 @@ +![image-20240108175131294](./imgs/image-20240108175131294.png) + +![image-20240108175139394](./imgs/image-20240108175139394.png) + +![image-20240108175146409](./imgs/image-20240108175146409.png) + +![image-20240108175153159](./imgs/image-20240108175153159.png) + +![image-20240108175159888](./imgs/image-20240108175159888.png) + +![image-20240108175206718](./imgs/image-20240108175206718.png) + +![image-20240108175215509](./imgs/image-20240108175215509.png) + +![image-20240108175222721](./imgs/image-20240108175222721.png) + +![image-20240108175230688](./imgs/image-20240108175230688.png) + +![image-20240108175239037](./imgs/image-20240108175239037.png) + +![image-20240108175247914](./imgs/image-20240108175247914.png) + +![image-20240108175300696](./imgs/image-20240108175300696.png) + +![image-20240108175312578](./imgs/image-20240108175312578.png) + +![image-20240108175319866](./imgs/image-20240108175319866.png) + +![image-20240108175327182](./imgs/image-20240108175327182.png) + +![image-20240108175348029](./imgs/image-20240108175348029.png) + +![image-20240108175356395](./imgs/image-20240108175356395.png) + +![image-20240108175407080](./imgs/image-20240108175407080.png) + +![image-20240108175415749](./imgs/image-20240108175415749.png) + +![image-20240108175427491](./imgs/image-20240108175427491.png) \ No newline at end of file diff --git "a/docs/interview-preparation/\351\201\207\345\210\260\347\232\204\351\227\256\351\242\230.md" "b/docs/interview-preparation/\351\201\207\345\210\260\347\232\204\351\227\256\351\242\230.md" new file mode 100644 index 0000000000000000000000000000000000000000..2a5f16c219a6cfc1586e33c29d5ee2430d00565e --- /dev/null +++ "b/docs/interview-preparation/\351\201\207\345\210\260\347\232\204\351\227\256\351\242\230.md" @@ -0,0 +1,14 @@ +# 数据库事务更新超时 + +- 现象 + + ![image-20240104134559837](./imgs/image-20240104134559837.png) + 生产上经常会报这么一个错,主要就是这么一句话,意思就是当你执行这条更新语句的时候呢,尝试对这条记录加锁,但是呢发现获取锁超时了,导致抛出了一个异常 ,排查了一下错误的信息来源,这是我们的一个项目信息编辑的页面 ,这里面有很多tab页,切换不同的tab页会对当前页面数据进行保存,而出错的方法呢,正是这些tab页切换的方法 + +- 排查过程 + 我刚看到这行代码报错的时候呢,我第一时间想到的这是不是一个长事务呢,可能事务执行时间太长导致超时了,但是呢分析完代码之后发现这里其实根本就没有加事务,并且呢它是非常简单的一个单表更新操作,那么就说会不会是它本身其实没有事务,但是被嵌套在别的方法里面呢,由此呢我把代码的上下文全都lou了一遍,看了一遍确定就是没有事务的。确定没有事务了之后就只能从头来看了啊 + +- ![image-20240104134628890](./imgs/image-20240104134628890.png) + 数据库的update语句其实是会对更新范围进行加锁的,单条更新呢就是行锁,多条更新可能是间隙锁或者是表锁,主要看你命中的索引情况,如果你尝试去加锁失败的话,那么是不是就意味着你前面是有一把锁是没有释放呢。之后结合这个场景,用户频繁的去切换tab页,前面的数还没更新完后面的数据又更新了,其实也很正常啊,这时候呢我就不得不说我们公司工具齐全的好处了,我只需要打开我们公司的这个链路监控工具,那么正序排列一下这段时间的接口条用情况 ,发现呢在21分41秒的时候,有一个超过13秒的调用,到54秒的时候结束,而我们这次报错呢正好是在21分45秒的时候,所以猜想呢可能是这个问题了。然后打开日志平台分别搜索这两个接口的调用入参,最后确定是同一个项目。前面一个更新的花了 13秒时间,后一个更新获取不到这条记录的锁,所以呢导致更新超时了,后面再根据这种方式去排查另外几处错误确定的是这几个问题。 + +- 为什么这么简单的一条单表更新语句执行这么长时间,并且呢是走索引的情况下这个才是问题所在。这个问题呢我其实排查了很久都没有发现为什么,后来呢我偶然撇了一下这个异常发生的时间都发生在11:21和下午的4:21,然后我再通过日志平台跟链路平台再搜索一下,发现呢就是在这两个时间段我们平常几毫秒,几十毫秒会花费几秒钟才能完成,并且呢我们数据库是共享呢,大概率呢是在这个时间段有人在高负载的使用数据库,为了印证这个猜想呢,我找了dba去拉了一下数据库的历史负载图,发现呢确实有两个毛尖在11点21分跟下午的4点21分,然后再找dba去定位是哪个操作库的,最后呢找到相关的负责人去沟通一下怎么解决,至此呢这个问题算是排查完毕 \ No newline at end of file diff --git a/docs/java/collection/Vector.md b/docs/java/collection/Vector.md new file mode 100644 index 0000000000000000000000000000000000000000..5bc3ac41c311268fd89ee4ff18f6e0bb10a8e623 --- /dev/null +++ b/docs/java/collection/Vector.md @@ -0,0 +1,24 @@ +1. **Vector**的定义 + +> public class Vector +> extends AbstractList +> implements List, RandomAccess, Cloneable, java.io.Serializable + +2. *Vector*底层也是一个对象数组 + +```java +protected Object[] elementData; +``` + +3. `Vector`是[线程同步](https://so.csdn.net/so/search?q=线程同步&spm=1001.2101.3001.7020)的,即线程安全,`Vector`类的操作方法带有`synchronized`; + +4. 在开发中,需要线程同步安全时,考虑使用`Vector`。 + +5. `Vector`对比`ArrayList` + + | | 底层结构 | 版本 | 线程安全&&效率 | 扩容倍数 | + | ----------- | :-------------------: | :-----: | :----------------: | :----------------------------------------------------------: | + | `ArrayList` | 可变数组 elementData; | jdk 1.2 | 线程不安全,效率高 | 无参构造,初始空间10,之后按照1.5倍扩容;有参构造,初始空间为指定的值,之后按照1.5倍扩容。 | + | `Vector` | 可变数组 elementData; | jdk 1.2 | 线程安全,效率不高 | 无参构造,初始空间为10,之后按照2倍扩容; | + + diff --git a/docs/java/collection/hashmap-source-code.md b/docs/java/collection/hashmap-source-code.md index a4f92b8a38e2a57fd63ceacd3a5a8036bba539e8..a16ba5e16c94e232be1add695fafa8b4f8606618 100644 --- a/docs/java/collection/hashmap-source-code.md +++ b/docs/java/collection/hashmap-source-code.md @@ -29,6 +29,12 @@ HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值, 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。 +![img](imgs/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cGVyY21k,size_16,color_FFFFFF,t_70.png) + +最后一步这里其实是拿扰动函数去与hashmap的数组长度做一个按位与操作(取模),得出的就是具体的下标 + + + **JDK 1.8 HashMap 的 hash 方法源码:** JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加简化,但是原理不变。 diff --git a/docs/java/collection/imgs/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cGVyY21k,size_16,color_FFFFFF,t_70.png b/docs/java/collection/imgs/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cGVyY21k,size_16,color_FFFFFF,t_70.png new file mode 100644 index 0000000000000000000000000000000000000000..f38251beb15a9c643326b536f7b1a3bb8bb76bf9 Binary files /dev/null and b/docs/java/collection/imgs/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N1cGVyY21k,size_16,color_FFFFFF,t_70.png differ diff --git a/docs/java/concurrent/imgs/1757082-20210126223031440-778548435.png b/docs/java/concurrent/imgs/1757082-20210126223031440-778548435.png new file mode 100644 index 0000000000000000000000000000000000000000..72bbc29f56de87e91d575e9b31f4917193149e02 Binary files /dev/null and b/docs/java/concurrent/imgs/1757082-20210126223031440-778548435.png differ diff --git a/docs/java/concurrent/imgs/1757082-20210126223642709-730471093.png b/docs/java/concurrent/imgs/1757082-20210126223642709-730471093.png new file mode 100644 index 0000000000000000000000000000000000000000..047bf457dbce0f96975dd66ca40390f7094c3240 Binary files /dev/null and b/docs/java/concurrent/imgs/1757082-20210126223642709-730471093.png differ diff --git a/docs/java/concurrent/imgs/20210421083553896.png b/docs/java/concurrent/imgs/20210421083553896.png new file mode 100644 index 0000000000000000000000000000000000000000..7db2dc8b1a5dbec23dbb3294722d9dd72c39d90b Binary files /dev/null and b/docs/java/concurrent/imgs/20210421083553896.png differ diff --git a/docs/java/concurrent/java-concurrent-questions-01.md b/docs/java/concurrent/java-concurrent-questions-01.md index 3bf2d18083371592288576c4a9f3936025dafad8..db37319379ecd56d8f60f04d27eeadc1a470e7b2 100644 --- a/docs/java/concurrent/java-concurrent-questions-01.md +++ b/docs/java/concurrent/java-concurrent-questions-01.md @@ -276,10 +276,10 @@ Thread[线程 2,5,main]waiting get resource1 上面的例子符合产生死锁的四个必要条件: -1. 互斥条件:该资源任意一个时刻只由一个线程占用。 -2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。 -3. 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。 -4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。 +1. **互斥条件**:至少有一个资源被且只能被一个线程持有。 +2. **请求与保持条件**:一个线程因请求资源而阻塞时,对已获得的资源保持不放。 +3. **不剥夺条件**:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。 +4. **循环等待条件:**若干线程之间形成一种头尾相接的循环等待资源关系。 ### 如何预防和避免线程死锁? diff --git a/docs/java/concurrent/java-concurrent-questions-02.md b/docs/java/concurrent/java-concurrent-questions-02.md index 0d43dcd0c2a3141884d623551d70905fc802316b..b122c7930b9d0aec82f5a262b2195df57bd77230 100644 --- a/docs/java/concurrent/java-concurrent-questions-02.md +++ b/docs/java/concurrent/java-concurrent-questions-02.md @@ -83,6 +83,17 @@ public class Singleton { 但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 `getUniqueInstance`() 后发现 `uniqueInstance` 不为空,因此返回 `uniqueInstance`,但此时 `uniqueInstance` 还未被初始化。 +volatile重排序遵循以下两个原则: + +1. `as-if-serial` + + as-f-sei语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、 + runtime和处理器都必须遵守as-if-sera语义。 + 为了遵守as-if-seriali语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操 + 作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。 + +2. `happens-before` + ### volatile 可以保证原子性么? **`volatile` 关键字能保证变量的可见性,但不能保证对变量的操作是原子性的。** @@ -385,6 +396,28 @@ synchronized(this) { - `synchronized` 关键字加到实例方法上是给对象实例上锁; - 尽量不要使用 `synchronized(String a)` 因为 JVM 中,字符串常量池具有缓存功能。 + + +### synchronized锁升级过程 + +![在这里插入图片描述](./imgs/20210421083553896.png) + +- **偏向锁:**只有一个线程争抢锁资源的时候.将线程拥有者标识为当前线程。引入了偏向锁目的是来尽可能减少无竞争情况下的同步操作开销。当一个线程访问同步块并获取对象的锁时,会将锁的标记记录在线程的栈帧中,并将对象头中的Thread ID设置为当前线程的ID。此后,当这个线程再次请求相同对象的锁时,虚拟机会使用已经记录的锁标记,而不需要再次进入同步块。 + +- **轻量级锁([自旋锁](https://so.csdn.net/so/search?q=自旋锁&spm=1001.2101.3001.7020)):**一个或多个线程通过CAS去争抢锁,如果抢不到则一直自旋。虚拟机会将对象的Mark Word复制到线程的栈帧中作为锁记录,并尝试使用CAS(Compare and Set)操作尝试获取锁。如果CAS成功,则表示线程获取了轻量级锁,并继续执行同步块。如果CAS失败,说明有竞争,虚拟机会通过自旋(spinning)等待其他线程释放锁。 + +- **重量级锁:** 如果**自旋等待不成功,虚拟机会将轻量级锁升级为重量级锁**。在这种状态下,虚拟机会将线程**阻塞**,并使用操作系统的互斥量来实现锁的释放和获取。 + + 需要注意的是,锁的升级是**逐级升级**的过程,而**不会存在降级**。换句话说,一旦锁升级到更高级别,就不会再回到低级别 + + + +### 锁粗化 + +锁粗化(Lock Coarsening)是一种编译器优化技术,可以将多个连续的小锁合并成一个大锁,从而减少锁的竞争次数,提高程序性能。 + +在java中,锁粗化通常用于对一个循环体内的锁操作进行优化。如果编译器发现一个循环体内有多个连续的锁操作,它就会将这些锁合并成一个大锁,从而减少锁的获取和释放次数,提高程序性能。 + ### 构造方法可以用 synchronized 修饰么? 先说结论:**构造方法不能使用 synchronized 关键字修饰。** @@ -393,7 +426,27 @@ synchronized(this) { ### synchronized 底层原理了解吗? -synchronized 关键字底层原理属于 JVM 层面的东西。 +在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。如下: + +![img](./imgs/1757082-20210126223031440-778548435.png) + +实例变量:存放 类的属性 数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。 + +填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。 + +HotSpot虚拟机的对象头分为两部分信息,第一部分用于存储对象自身运行时数据,如哈希码、GC分代年龄等,这部分数据的长度在32位和64位的虚拟机中分别为32位和64位。官方称为Mark Word。另一部分用于存储指向对象类型数据的指针,如果是数组对象的话,还会有一个额外的部分存储数组长度。 + +![img](./imgs/1757082-20210126223642709-730471093.png) + + + + + + 由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本,因此考虑到JVM的空间效率,Mark Word 被设计成为一个非固定的数据结构,以便存储更多有效的数据,它会根据对象本身的状态复用自己的存储空间。 + +这里我们主要分析一下重量级锁也就是通常说synchronized的对象锁 + +其锁标识位为10,其中指针指向的是**monitor对象**(也称为管程或监视器锁)**的起始地址**。每个对象都存在着一个 monitor 与之关联,对象与其 monitor 之间的关系有存在多种实现方式,如monitor可以与对象一起创建,销毁或当线程试图获取对象锁时自动生成,**但当一个 monitor 被某个线程持有后,它便处于锁定状态。**在Java虚拟机(HotSpot)中,monitor是由ObjectMonitor实现的,其主要数据结构如下(位于HotSpot虚拟机源码ObjectMonitor.hpp文件,C++实现的) #### synchronized 同步语句块的情况 diff --git a/docs/java/concurrent/java-thread-pool-summary.md b/docs/java/concurrent/java-thread-pool-summary.md index e232aae98ee9b277ff33fcec9377fb439443cc45..f5de1ad0b4c525543bd79e66cdf137cc8b736e54 100644 --- a/docs/java/concurrent/java-thread-pool-summary.md +++ b/docs/java/concurrent/java-thread-pool-summary.md @@ -116,9 +116,25 @@ public class ScheduledThreadPoolExecutor **`ThreadPoolExecutor` 3 个最重要的参数:** -- **`corePoolSize` :** 任务队列未达到队列容量时,最大可以同时运行的线程数量。 -- **`maximumPoolSize` :** 任务队列中存放的任务达到队列容量的时候,当前可以同时运行的线程数量变为最大线程数。 -- **`workQueue`:** 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。 +- **`corePoolSize` :** 最小核心线程数量,即使这些线程处于空闲状态,他们也不会销毁。当任务提交到线程池之后,首先会检查当前线程是否达到了`corePoolSize`,如果没有达到的话则会创建一个新的线程来处理任务 +- **`maximumPoolSize` :** 当前线程数达到`coolPoolSize`之后,如果继续有任务被提交到线程池,会将任务缓存到线程池工作队列中 +- **`workQueue`:** 新任务来的时候会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。有以下几种队列 + + 1. ArrayBlockingQueue + 基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。 + + 2. LinkedBlockingQuene + + 基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。 + + 3. SynchronousQuene + + 一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。 + + 4. PriorityBlockingQueue + + 具有优先级的无界阻塞队列,优先级通过参数Comparator实现。 + `ThreadPoolExecutor`其他常见参数 : diff --git a/docs/java/jvm/jvm-intro.md b/docs/java/jvm/jvm-intro.md index 2fdb9b3e0559202c4df462f31843bc4d6c24fe88..e41bf4adf04ce2429da141dbac537e7d8037d2dc 100644 --- a/docs/java/jvm/jvm-intro.md +++ b/docs/java/jvm/jvm-intro.md @@ -138,6 +138,68 @@ public class String { 尝试运行当前类的 `main` 函数的时候,我们的代码肯定会报错。这是因为在加载的时候其实是找到了 rt.jar 中的`java.lang.String`,然而发现这个里面并没有 `main` 方法。 + + +#### 2.3.1 双亲委派机制的优点 + +1. 避免重复加载 +2. 保证类的安全性 + +#### 2.3.2 如何打破双亲委派机制 + +​ 尽管双亲委派机制有着诸多好处,但有时我们也需要打破它,比如在某些场景下需要加载自定义的类库,或者需要实现热部署等功能。这时,我们就需要自定义类加载器,并在其中打破双亲委派机制。 + +​ 以Java代码为例,我们可以通过继承ClassLoader类并重写loadClass方法来打破双亲委派机制。在loadClass方法中,我们可以根据需要自行加载类文件,并通过defineClass方法将其转换为Class对象。 + +```java +public class MyClassLoader extends ClassLoader { + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + // 首先检查是否已经加载该类 + Class clazz = findLoadedClass(name); + if (clazz == null) { + try { + // 尝试委托给父类加载器加载 + clazz = getParent().loadClass(name); + } catch (ClassNotFoundException e) { + // 如果父类加载器无法加载,则自行加载该类 + byte[] classData = getClassData(name); + if (classData == null) { + throw new ClassNotFoundException(); + } else { + clazz = defineClass(name, classData, 0, classData.length); + } + } + } + return clazz; + } + + private byte[] getClassData(String name) { + // 从本地磁盘或网络等获取类文件数据 + // ... + } + +} +``` + +在上述代码中,我们首先检查该类是否已经被加载,如果没有,则尝试委托给父类加载器加载。如果父类加载器无法加载该类,则自行加载该类,并通过defineClass方法将其转换为Class对象。 + +需要注意的是,打破双亲委派机制并不是一件简单的事情,容易出现一些问题,比如类的重复加载、类的安全性等。因此,在实际开发中,我们应该慎重考虑是否需要打破双亲委派机制,并在实现时遵循一些规范和最佳实践。 + +#### 2.3.3 tomcat打破双亲委派机制 + + 在某些情况下,`Tomcat(Apache Tomcat)`需要打破双亲委派机制,主要是为了解决类加载的灵活性和可定制性的需求。 + + `Tomcat`作为一个Web应用服务器,它允许部署和运行多个独立的Web应用程序,每个应用程序都有自己的类加载器。在传统的双亲委派机制下,所有的Web应用程序共享同一个父类加载器(通常是系统类加载器),这可能导致以下问题: + +1. 类冲突:由于所有Web应用程序共享同一个类加载器,如果不同的应用程序中存在相同包名和类名的类,会导致类冲突,无法正确加载和使用这些类。 +2. 动态更新:在运行时动态更新Web应用程序的某些类文件,由于双亲委派机制的限制,无法直接加载新的类定义,需要重启应用程序才能生效,影响应用的灵活性和可用性。 + +为了解决上述问题,Tomcat引入了类加载器的分级机制,打破了双亲委派机制。在Tomcat中,每个Web应用程序都有自己的Web应用类加载器(WebAppClassLoader),它负责加载应用程序的类和资源。Web应用类加载器在加载类时会先检查自己是否已加载,如果未加载则尝试加载,而不委派给父加载器。 + + + ## 三、运行时数据区 ### 3.1 本地方法栈和程序计数器 diff --git a/docs/javaguide/contribution-guideline.md b/docs/javaguide/contribution-guideline.md deleted file mode 100644 index ea0079b53d0f39254cde2998646de9b28e225ef4..0000000000000000000000000000000000000000 --- a/docs/javaguide/contribution-guideline.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: 贡献指南 -category: 走近项目 -icon: guide ---- - -欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](https://zhuanlan.zhihu.com/p/464832264) 。 - -你可以从下面几个方向来做贡献: - -- 笔记内容大多是手敲,所以难免会有笔误,你可以帮我找错别字。 -- 很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。 -- 现有的知识点难免存在不完善或者错误,所以你可以对已有知识点进行修改/补充。 - -一定一定一定要注意 **排版规范**: - -- [中文文案排版指北 - GitHub](https://github.com/sparanoid/chinese-copywriting-guidelines) -- [写给大家看的中文排版指南 - 知乎](https://zhuanlan.zhihu.com/p/20506092) -- [中文文案排版细则 - Dawner](https://dawner.top/posts/chinese-copywriting-rules/) -- [中文技术文档写作风格指南](https://github.com/yikeke/zh-style-guide/) - -如果要提 issue/question 的话,强烈推荐阅读下面这些资料: - -- [《提问的智慧》](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)。 diff --git a/docs/javaguide/faq.md b/docs/javaguide/faq.md deleted file mode 100644 index 37f9bc3a94d49ca1c2827a6a8f87aa0564460543..0000000000000000000000000000000000000000 --- a/docs/javaguide/faq.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: 常见问题 -category: 走近项目 -icon: help ---- - -## JavaGuide 是否支持 RSS? - -必须支持!推荐 RSS 订阅本网站获取最新更新。 - -## JavaGuide 有没有 PDF 版本? - -由于 JavaGuide 内容在持续完善,所以并没有一个完全与之同步的 PDF 版本提供。如果你想要 PDF 版本的话,可以考虑 **《JavaGuide 面试突击版》** ,这是对 JavaGuide 内容的浓缩总结。 - -《JavaGuide 面试突击版》在我的公众号后台回复“**PDF**”即可获取,免费的。除了 《JavaGuide 面试突击版》之外,还会免费送你多本优质面试 PDF 手册。 - -![公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) - -## 如何看待 JavaGuide 的 star 数量很多? - -[JavaGuide](https://github.com/Snailclimb) 目前已经是 Java 领域 star 数量最多的几个项目之一,登顶过很多次 GitHub Trending。 - -不过,这个真心没啥好嘚瑟的。因为,教程类的含金量其实是比较低的,star 数量比较多主要也是因为受众面比较广,大家觉得不错,点个 star 就相当于收藏了。很多特别优秀的框架,star 数量可能只有几 K。所以,单纯看 star 数量没啥意思,就当看个笑话吧! - -维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。 - -对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎! - -开源非常重要的一点就是协作。如果你开源了一个项目之后,就不再维护,别人给你提交 issue/pr,你都不处理,那开源也没啥意义了! - -## JavaGuide 会不会推出纸质书籍? - -可以给出一个比较明确的答案:**暂时没有考虑出书** 。 - -JavaGuide 这个项目诞生一年左右就有出版社的老师联系我了,由于自知个人能力尚需沉淀,我都婉拒了。这几年的话,由于项目还是有一点知名度的,找我出书的出版社老师更多了,也都被我一一婉拒了。 - -**出书既能博名又能赚点钱,我为啥不考虑出书呢?** - -- JavaGuide 的很多内容我还不是很满意,也一直在维护中,细心的小伙伴看我的[提交记录](https://github.com/Snailclimb/JavaGuide/commits/main)就明白了。 -- 开源版本更容易维护和修改,也能让更多人更方便地参与到项目的建设中,这也是我最初做这个项目的初衷。 -- 我觉得出书是一件神圣的事情,自认能力还不够。 -- 个人精力有限,不光有本职工作,还弄了一个[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)赚点外快,还要维护完善 JavaGuide。 -- …… - -这几年一直在默默完善,真心希望 JavaGuide 越来越好,帮助到更多朋友!也欢迎大家参与进来! - -## JavaGuide 上为什么有一些付费文章? - -是这样的,JavaGuide 上确实有非常非常少的付费文章,差不多 10 篇不到吧,这对于整个网站的内容来说算是微不足道了。 - -这些付费文章属于[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)专属,是我用来引流知识星球的,对整体阅读其实并没有什么影响的。 - -我也知道大家不喜欢营销,所以我会让自己控制好一个度。我一不割韭菜,二不贩卖焦虑,仅仅赚一份小钱提升家人生活品质。 - -**用心做内容,真心希望能帮助到其他人。** diff --git a/docs/javaguide/history.md b/docs/javaguide/history.md deleted file mode 100644 index 07dfcb883acb7498ae492075c7ca3c1491964b89..0000000000000000000000000000000000000000 --- a/docs/javaguide/history.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: 网站历史 -category: 走近项目 ---- - -由于项目内容一直持续在更新迭代,所以,这里就不记录项目内容的具体更新情况了。 - -你可以通过 [RSS 订阅](https://javaguide.cn/feed.json)获取网站的最新更新,你还可以通过 [https://javaguide.cn/article/](https://javaguide.cn/article/)获取到网站最新更新的文章。 - -![](https://oss.javaguide.cn/github/javaguideimage-20220614172338606.png) - -这里只记录一些比较重要的一些节点: - -- [2022-06-13](https://github.com/Snailclimb/JavaGuide/commit/83efb36fb56d197f2c4b471084b884c6a4f23e37):完善网站排版以及样式。 -- [2022-04-09](https://github.com/Snailclimb/JavaGuide/commit/618477f96c4a976cfe5a3bba2f646c0d20e3137e):添加[技术书籍精选](https://javaguide.cn/books/)。 -- [2021-03-13](https://github.com/Snailclimb/JavaGuide/commit/5c45af9c7a7cff0d3bc905b09b3bc42f2ee8a88a):添加[开源项目精选](https://javaguide.cn/open-source-project/)。 -- [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 重构整个项目,提升阅读体验。 diff --git a/docs/javaguide/intro.md b/docs/javaguide/intro.md deleted file mode 100644 index 9eadc8a89499c8e7a458e45b0d1f9ef8d4705cc8..0000000000000000000000000000000000000000 --- a/docs/javaguide/intro.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: 项目介绍 -category: 走近项目 -icon: about ---- - -我是 19 年大学毕业的,在大三准备面试的时候,我开源了 JavaGuide 。我把自己准备面试过程中的一些总结都毫不保留地通过 JavaGuide 分享了出来。 - -开源 JavaGuide 初始想法源于自己的个人那一段比较迷茫的学习经历,主要目的是为了通过这个开源平台来帮助一些在学习 Java 或者面试过程中遇到问题的小伙伴。 - -- **对于 Java 初学者来说:** 本文档倾向于给你提供一个比较详细的学习路径,目录清晰,让你对于 Java 整体的知识体系有一个清晰认识。你可以跟着视频或者书籍学习完某个知识点之后,然后来这里找对应的总结,帮助你更好地掌握对应的知识点。 -- **对于非 Java 初学者来说:** 本文档更适合回顾知识,准备面试,让你搞清面试应该把重心放在哪些问题上。 - -**由于本网站的内容完全开源,由大家共同维护完善,因此内容质量比较高。** 如果你也想要参与 JavaGuide 的维护建设工作,请查阅[贡献指南](./contribution-guideline.md)。 - -相比于其他通过 JavaGuide 学到东西或者说助力获得 offer 的朋友来说 , JavaGuide 对我的意义更加重大。不夸张的说,有时候真的感觉像是自己的孩子一点一点长大一样,我一直用心呵护着它。虽然,我花了很长时间来维护它,但是,我觉得非常值得!非常有意义! - -不过,希望大家对面试不要抱有侥幸的心理,打铁还需自身硬! **我希望这个文档是为你学习 Java 指明方向,而不仅仅是用来应付面试用的。** - -另外,JavaGuide 不可能把面试中的所有内容都给涵盖住,尤其是阿里、美团这种挖的比较深入的面试。你可以根据你的目标公司进行针对性的深入学习,多看一些目标公司的面经进行查漏补缺,没事就自测一下,多多思考总结。 - -加油!奥利给! - -## 官方知识星球 - -对于准备面试的同学来说,强烈推荐我创建的一个纯粹的[Java 面试知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习氛围也很不错! - -下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍): - -[![星球服务](https://oss.javaguide.cn/xingqiu/xingqiufuwu.png)](../about-the-author/zhishixingqiu-two-years.md) - -## 项目说明 - -- [在线阅读网站](https://javaguide.cn)基于 Vuepress 搭建,使用的是主题是 [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope)(很 Nice 的一个主题)。 -- 项目的 Markdown 格式参考:[GitHub Markdown 格式](https://guides.github.com/features/mastering-markdown/),表情素材来自:[EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)。 -- Logo 下的小图标是使用[Shields.IO](https://shields.io/) 生成的。 - -## 贡献者 - -[你可以点此链接查看 JavaGuide 的所有贡献者。](https://github.com/Snailclimb/JavaGuide/graphs/contributors) 感谢你们让 JavaGuide 变得更好!如果你们来到武汉一定要找我,我请你们吃饭玩耍。 diff --git a/docs/javaguide/use-suggestion.md b/docs/javaguide/use-suggestion.md deleted file mode 100644 index e7ce843aaee08caf735bd233fbadca59d138ff0a..0000000000000000000000000000000000000000 --- a/docs/javaguide/use-suggestion.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: 使用建议 -category: 走近项目 -icon: star ---- - -**对于不准备面试的同学来说** ,本文档倾向于给你提供一个比较详细的学习路径,目录清晰,让你对于 Java 整体的知识体系有一个清晰认识。你可以跟着视频、书籍或者官方文档学习完某个知识点之后,然后来这里找对应的总结,帮助你更好地掌握对应的知识点。甚至说,你在有编程基础的情况下,想要学习某个知识点的话,可以直接看我的总结,这样学习效率会非常高。 - -**对于准备面试的同学来说** ,本文档涵盖 Java 程序员所需要掌握的核心知识的常见面试问题总结。 - -大部分人看 JavaGuide 应该都是为了准备技术八股文。**那如何才能更高效地准备技术八股文?** - -对于技术八股文来说,尽量不要死记硬背,这种方式非常枯燥且对自身能力提升有限!但是!想要一点不背是不太现实的,只是说要结合实际应用场景和实战来理解记忆。 - -我一直觉得面试八股文最好是和实际应用场景和实战相结合。很多同学现在的方向都错了,上来就是直接背八股文,硬生生学成了文科,那当然无趣了。 - -举个例子:你的项目中需要用到 Redis 来做缓存,你对照着官网简单了解并实践了简单使用 Redis 之后,你去看了 Redis 对应的八股文。你发现 Redis 可以用来做限流、分布式锁,于是你去在项目中实践了一下并掌握了对应的八股文。紧接着,你又发现 Redis 内存不够用的情况下,还能使用 Redis Cluster 来解决,于是你就又去实践了一下并掌握了对应的八股文。 - -而且, **面试中有水平的面试官都是根据你的项目经历来顺带着问一些技术八股文** 。 - -举个例子:你的项目用到了消息队列,那面试官可能就会问你:为什么使用消息队列?项目中什么模块用到了消息队列?如何保证消息不丢失?如何保证消息的顺序性?(结合你使用的具体的消息队列来准备)……。 - -**一定要记住你的主要目标是理解和记关键词,而不是像背课文一样一字一句地记下来!** - -另外,记录博客或者用自己的理解把对应的知识点讲给别人听也是一个不错的选择。 - -最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。 diff --git a/docs/readme.md b/docs/readme.md deleted file mode 100644 index 115bddd4f8abe9bc11bc1a583e5738dc4213dd9c..0000000000000000000000000000000000000000 --- a/docs/readme.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -home: true -icon: home -title: Java 面试指南 -heroImage: /logo.svg -heroText: JavaGuide -tagline: 「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide! -actions: - - text: 开始阅读 - link: /home/ - type: primary - - text: 知识星球 - link: /about-the-author/zhishixingqiu-two-years.md - type: default -footer: |- - 鄂ICP备2020015769号-1 | 主题: VuePress Theme Hope ---- - -[![Banner](https://oss.javaguide.cn/xingqiu/xingqiu.png)](./about-the-author/zhishixingqiu-two-years.md) - -## 关于网站 - -JavaGuide 已经持续维护 5 年多了,累计提交了 **5000+** commit ,共有 **440** 多位朋友参与维护。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友! - -如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,你觉得内容不错再点赞就好),这是对我最大的鼓励,感谢各位一起同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。 - -- [项目介绍](./javaguide/intro.md) -- [贡献指南](./javaguide/contribution-guideline.md) -- [常见问题](./javaguide/faq.md) - -## 关于作者 - -- [我曾经也是网瘾少年](./about-the-author/internet-addiction-teenager.md) -- [害,毕业三年了!](./about-the-author/my-college-life.md) -- [我的知识星球快 3 岁了!](./about-the-author/zhishixingqiu-two-years.md) -- [坚持写技术博客六年了](./about-the-author/writing-technology-blog-six-years.md) - -## 公众号 - -最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。 - -![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png) diff --git a/docs/vmware/Centos.md b/docs/vmware/Centos.md new file mode 100644 index 0000000000000000000000000000000000000000..0db884b99beb931c2865d0b6eb9d499666fb72ad --- /dev/null +++ b/docs/vmware/Centos.md @@ -0,0 +1,83 @@ +## 国内源配置 + +```Bash +# 下载阿里云的base源 +wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo +# 如果没有wget程序则使用curl下载 +curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo + +# 快速生成缓存 +sudo yum makecache fast +# 生成完整缓存 +sudo yum clean all && sudo yum makecache +``` + +## 防火墙配置 + +**一、防火墙的开启、关闭、禁用命令** + +(1)设置开机启用防火墙:`systemctl enable firewalld.service` + +(2)设置开机禁用防火墙:`systemctl disable firewalld.service` + +(3)启动防火墙:`systemctl start firewalld` + +(4)关闭防火墙:`systemctl stop firewalld` + +(5)检查防火墙状态:`systemctl status firewalld` + +**二、使用firewall-cmd配置端口** + +(1)查看防火墙状态:`firewall-cmd --state` + +(2)重新加载配置:`firewall-cmd --reload` + +(3)查看开放的端口:`firewall-cmd --list-ports` + +(4)开启防火墙端口:`firewall-cmd --zone=public --add-port=9200/tcp --permanent` + +命令含义: + +–zone #作用域 + +`–add-port=9200/tcp` #添加端口,格式为:端口/通讯协议 + +`–permanent` #永久生效,没有此参数重启后失效 + +**注意:***添加端口后,必须用命令\**** `firewall-cmd --reload`****重新加载一遍才会生效** + +(5)关闭防火墙端口:`firewall-cmd --zone=public --remove-port=9200/tcp --permanent` + +## 安装jdk8 + +```Bash +# 检查是否含有jdk1.8的包 +yum list java-1.8* +# 安装 +yum install java-1.8.0-openjdk* -y +# 验证 +java -version +``` + +## 卸载jdk8 + +```Bash +[root@bogon jre]# rpm -qa|grep jdk +java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 +java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64 +java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_64 +java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 +[root@bogon jre]# yum -y remove java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 +``` + +## 安装jdk11 + +```Bash +# 搜索可安装的版本 +yum search openjdk +# 安装jdk11 +yum -y install java-11-openjdk + +# 安装jdk11 +yum -y install java-11-openjdk +``` \ No newline at end of file diff --git a/docs/vmware/imgs/image-1704726062333-11.png b/docs/vmware/imgs/image-1704726062333-11.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7bcaef0165a26b62e4a28d269e6e2d4500bcbf Binary files /dev/null and b/docs/vmware/imgs/image-1704726062333-11.png differ diff --git a/docs/vmware/imgs/image-1704726062333-12.png b/docs/vmware/imgs/image-1704726062333-12.png new file mode 100644 index 0000000000000000000000000000000000000000..5a4a619ea8281990ce5a246b2f070cd70c398ca6 Binary files /dev/null and b/docs/vmware/imgs/image-1704726062333-12.png differ diff --git a/docs/vmware/imgs/image-1704726062333-13.png b/docs/vmware/imgs/image-1704726062333-13.png new file mode 100644 index 0000000000000000000000000000000000000000..03d7defd61c8fb36bad249224a4bb426894a2b21 Binary files /dev/null and b/docs/vmware/imgs/image-1704726062333-13.png differ diff --git a/docs/vmware/imgs/image-1704726062333-14.png b/docs/vmware/imgs/image-1704726062333-14.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2b77fc7dc1ac2f4ef4d88b927261f351589263 Binary files /dev/null and b/docs/vmware/imgs/image-1704726062333-14.png differ diff --git a/docs/vmware/imgs/image-1704726062333-15.png b/docs/vmware/imgs/image-1704726062333-15.png new file mode 100644 index 0000000000000000000000000000000000000000..c0396c3141549be8a7031e2f75c8ce241d6aca3e Binary files /dev/null and b/docs/vmware/imgs/image-1704726062333-15.png differ diff --git a/docs/vmware/imgs/image.png b/docs/vmware/imgs/image.png new file mode 100644 index 0000000000000000000000000000000000000000..05c2aab65b518cad133853030116dd38958249ec Binary files /dev/null and b/docs/vmware/imgs/image.png differ diff --git "a/docs/vmware/\351\205\215\347\275\256\351\235\231\346\200\201ip.md" "b/docs/vmware/\351\205\215\347\275\256\351\235\231\346\200\201ip.md" new file mode 100644 index 0000000000000000000000000000000000000000..c89f3c3d414198c67a08aac79fe0b2bad90f0b49 --- /dev/null +++ "b/docs/vmware/\351\205\215\347\275\256\351\235\231\346\200\201ip.md" @@ -0,0 +1,39 @@ +## 配置环境 + +Linux:Centos 8 远程连接工具:Xshell 7 + +## 设置步骤 + +1. 在菜单栏选择虚拟机–>设置–>网络适配器,勾选NAT模式,然后点击确定。 + +![img](./imgs/image.png) + +![img](./imgs/image-1704726062333-11.png) + +1. 在菜单栏选择编辑,点击"虚拟网络编辑器",点击"更改设置"进行授权 + +![img](./imgs/image-1704726062333-12.png) + +![img](./imgs/image-1704726062333-13.png) + +1. 得到授权后根据下面图片提示进行配置修改 + +![img](./imgs/image-1704726062333-14.png) + +1. 在终端打开网卡配置文件并修改 + +``` +vim /etc/sysconfig/network-scripts/ifcfg-ens33(网卡名称) +``` + +将BOOTPROTO字段修改为static(静态),如果ONBOOT字段为no,则将其修改为yes(开机自启)。然后添加IP地址、子网掩码、网关、以及DNS。 + +![img](./imgs/image-1704726062333-15.png) + +IPADDR代表IP地址(根据子网IP地址所处网段进行配置),NETMASK代表子网掩码,GATEWAY代表网关,DNS代表域名解释器。这些信息可以在网络编辑器里面的NAT设置中查看 + +1. 修改完成后重启网卡 + +```Bash +systemctl restart network +``` \ No newline at end of file diff --git a/docs/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.md b/docs/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.md deleted file mode 100644 index ee848d003b82a12322f874cd4e440fdc68b0645d..0000000000000000000000000000000000000000 --- a/docs/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: 《后端面试高频系统设计&场景题》 -category: 知识星球 ---- - -## 介绍 - -**《后端面试高频系统设计&场景题》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。 - -近年来,随着国内的技术面试越来越卷,越来越多的公司开始在面试中考察系统设计和场景问题,以此来更全面的考察求职者,不论是校招还是社招。不过,正常面试全是场景题的情况还是极少的,面试官一般会在面试中穿插一两个系统设计和场景题来考察你。 - -于是,我总结了这份《后端面试高频系统设计&场景题》,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。 - -即使不是准备面试,我也强烈推荐你认真阅读这一系列文章,这对于提升自己系统设计思维和解决实际问题的能力还是非常有帮助的。并且,涉及到的很多案例都可以用到自己的项目上比如抽奖系统设计、第三方授权登录、Redis 实现延时任务的正确方式。 - -《后端面试高频系统设计&场景题》本身是属于《Java 面试指北》的一部分,后面由于内容篇幅较多,因此被单独提了出来。 - -## 内容概览 - -![《后端面试高频系统设计&场景题》](https://oss.javaguide.cn/xingqiu/back-end-interview-high-frequency-system-design-and-scenario-questions-fengmian.png) - - diff --git a/docs/zhuanlan/handwritten-rpc-framework.md b/docs/zhuanlan/handwritten-rpc-framework.md deleted file mode 100644 index 5a055d56a319eb9db68b25367e044512ea9d6428..0000000000000000000000000000000000000000 --- a/docs/zhuanlan/handwritten-rpc-framework.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 《手写 RPC 框架》 -category: 知识星球 ---- - -## 介绍 - -**《手写 RPC 框架》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 - -麻雀虽小五脏俱全,项目代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。 - -## 内容概览 - -![](https://oss.javaguide.cn/github/javaguide/image-20220308100605485.png) - -通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。你甚至可以把它当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。 - -- GitHub 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 。 -- Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework) 。 - - diff --git a/docs/zhuanlan/java-mian-shi-zhi-bei.md b/docs/zhuanlan/java-mian-shi-zhi-bei.md deleted file mode 100644 index a9fc248f907eef37b973916b1133a0e14e162515..0000000000000000000000000000000000000000 --- a/docs/zhuanlan/java-mian-shi-zhi-bei.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: 《Java 面试指北》 -category: 知识星球 -star: 5 ---- - -我花费了两年多的时间,写了一本针对 Java 面试的《Java 面试指北》。这份资料的内容质量还是非常高的,帮助了上万名同学高效准备 Java 面试。 - -目前的成绩:累计阅读 **162w+** ,点赞 **2300+** ,评论 **700+** (几乎每一条提问类型的评论我看到后都会用心回复)。 - -![《Java 面试指北》统计](https://oss.javaguide.cn/xingqiu/java-interview-guide-statistics.png) - -## 介绍 - -**《Java 面试指北》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补。相比于开源版本来说,《Java 面试指北》添加了下面这些内容(不仅仅是这些内容): - -- 15+ 篇文章手把手教你如何准备面试,40+ 准备面试过程中的常见问题详细解读,让你更高效地准备 Java 面试。 -- 更全面的八股文面试题(系统设计、场景题、常见框架、分布式&微服务、高并发 ……)。 -- 优质面经精选(相比于牛客网或者其他网站的面经,《Java 面试指北》中整理的面经质量更高,并且,我会提供优质的参考资料)。 -- 技术面试题自测(高效准备技术八股文的技巧之一在于多多自测,查漏补缺)。 -- 练级攻略(有助于个人成长的经验分享)。 - -《Java 面试指北》 会根据每一年的面试情况对内容进行更新完善,保证内容质量的时效性。并且,只需要加入[知识星球](../about-the-author/zhishixingqiu-two-years.md)一次,即可永久获取《Java 面试指北》的访问权限,持续同步更新完善。 - -## 内容概览 - -![《Java 面试指北》内容概览](https://oss.javaguide.cn/javamianshizhibei/javamianshizhibei-content-overview.png) - -### 面试准备篇 - -在 **「面试准备篇」** ,我写了 15+ 篇文章手把手教你如何准备面试,准备面试过程中常见的疑问这里都有解答,内容涵盖项目经验、简历编写、源码学习、算法准备、面试资源等等。 - -![《Java 面试指北》面试准备篇](https://oss.javaguide.cn/javamianshizhibei/preparation-for-interview.png) - -另外,考虑到很多小伙伴缺少项目经历,我还推荐了很多小众但优质的实战项目,有视频也有开源项目,有业务系统,也有各种含金量比较高的轮子类项目。 - -![实战项目推荐](https://oss.javaguide.cn/javamianshizhibei/practical-project-recommendation.png) - -### 技术面试题篇 - -**「技术面试题篇」** 的内容和 JavaGuide 开源版本互补,不仅仅包括最基本的 Java、常见框架等八股文,还包括系统设计、分布式、高并发等进阶内容。 - -![《Java 面试指北》技术面试题篇](https://oss.javaguide.cn/javamianshizhibei/technical-interview-questions.png) - -### 面经篇 - -古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。 - -**「面经篇」** 主要会分享一些高质量的 Java 后端面经,有校招的,也有社招的,有大厂的,也有中小厂的。 - -如果你是非科班的同学,也能在这些文章中找到对应的非科班的同学写的面经。 - -![《Java 面试指北》面经篇](https://oss.javaguide.cn/javamianshizhibei/thinkimage-20220612185810480.png) - -并且,[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。 - -![](https://oss.javaguide.cn/xingqiu/image-20220304120018731.png) - -![](https://oss.javaguide.cn/xingqiu/image-20220628101743381.png) - -![](https://oss.javaguide.cn/xingqiu/image-20220628101805897.png) - -相比于牛客网或者其他网站的面经,《Java 面试指北》中整理的面经质量更高,并且,我会提供优质的参考资料。 - -### 技术面试题自测篇 - -为了让小伙伴们自测以检查自己的掌握情况,我还推出了 **「技术面试题自测」** 系列。不过,目前只更新了 Java 和数据库的自测,正在持续更新中。 - -![《Java 面试指北》技术面试题自测篇](https://oss.javaguide.cn/xingqiu/image-20220621095641897.png) - -高效准备技术八股文的技巧之一在于多多自测,查漏补缺。 - -### 练级攻略篇 - -**「练级攻略篇」** 这个系列主要内容一些有助于个人成长的经验分享。 - -![《Java 面试指北》练级攻略篇](https://oss.javaguide.cn/javamianshizhibei/training-strategy-articles.png) - -每一篇内容都非常干货,不少球友看了之后表示收获满满。不过,最重要的还是知行合一。 - -### 工作篇 - -**「工作篇」** 这个系列主要内容是分享一些有助于个人以及职场发展的内容。 - -![《Java 面试指北》工作篇](https://oss.javaguide.cn/javamianshizhibei/gongzuopian.jpg) - - diff --git a/docs/zhuanlan/readme.md b/docs/zhuanlan/readme.md deleted file mode 100644 index 9175b71ff3caa3148cf11cee4f30f01c2b88c998..0000000000000000000000000000000000000000 --- a/docs/zhuanlan/readme.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: 星球专属优质专栏概览 -category: 知识星球 ---- - -这部分的内容为我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)专属,目前已经更新了下面这些专栏: - -- **[《Java 面试指北》](./java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补! -- **[《后端面试高频系统设计&场景题》](./back-end-interview-high-frequency-system-design-and-scenario-questions.md)** : 包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。 -- **[《手写 RPC 框架》](./java-mian-shi-zhi-bei.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。 -- **[《Java 必读源码系列》](./source-code-reading.md)**:目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码 -- …… - -欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多!收费虽然是白菜价,但星球里的内容比你参加几万的培训班质量还要高。 - -我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你! - - diff --git a/docs/zhuanlan/source-code-reading.md b/docs/zhuanlan/source-code-reading.md deleted file mode 100644 index 2441f2e7adc38a2518a1d4a418db778966f53516..0000000000000000000000000000000000000000 --- a/docs/zhuanlan/source-code-reading.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: 《Java 必读源码系列》 -category: 知识星球 -star: true ---- - -## 介绍 - -**《Java 必读源码系列》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码。后续还会整理更多值得阅读的优质源码,持续完善中。 - -结构清晰,内容详细,非常适合想要深入学习框架/中间件源码的同学阅读。 - -## 内容概览 - -![](https://oss.javaguide.cn/xingqiu/image-20220621091832348.png) - - - -## 更多专栏 - -除了《Java 必读源码系列》之外,我的知识星球还有 [《Java 面试指北》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247536358&idx=2&sn=a6098093107d596d3c426c9e71e871b8&chksm=cea1012df9d6883b95aab61fd815a238c703b2d4b36d78901553097a4939504e3e6d73f2b14b&token=710779655&lang=zh_CN#rd)**、**[《后端面试高频系统设计&场景题》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247536451&idx=1&sn=5eae2525ac3d79591dd86c6051522c0b&chksm=cea10088f9d6899e0aee4146de162a6de6ece71ba4c80c23f04d12b1fd48c087a31bc7d413f4&token=710779655&lang=zh_CN#rd)、《手写 RPC 框架》等多个专栏。进入星球之后,统统都可以免费阅读。 - -![](https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TyC1icms4objsyiaJe2Iic7RZUq6nzsOOTX27x6Vfm5SibGic952kp3JM0RfRpLZXrneOCEOOogicj69yKw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1) diff --git "a/\345\234\272\346\231\257\351\242\230/\345\276\256\344\277\241\347\272\242\345\214\205.md" "b/\345\234\272\346\231\257\351\242\230/\345\276\256\344\277\241\347\272\242\345\214\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/\345\234\272\346\231\257\351\242\230/\346\212\226\351\237\263\347\233\264\346\222\255.md" "b/\345\234\272\346\231\257\351\242\230/\346\212\226\351\237\263\347\233\264\346\222\255.md" new file mode 100644 index 0000000000000000000000000000000000000000..d62a76e347826f29f0e48618b3762bcbe41d3e8b --- /dev/null +++ "b/\345\234\272\346\231\257\351\242\230/\346\212\226\351\237\263\347\233\264\346\222\255.md" @@ -0,0 +1,6 @@ +**抖音直播系统如何设计?** + +- 抖音核心功能:直播推流(推拉流)+IM(聊天室)+推荐系统+电商秒杀 +- 打赏送礼 +- 直播PK +- 红包功能 \ No newline at end of file