diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000..7626be2
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "lastFilter": {
+ "state": "OPEN",
+ "assignee": "AobingJava"
+ }
+}
+ {
+ "selectedUrlAndAccountId": {
+ "url": "https://github.com/AobingJava/JavaFamily.git",
+ "accountId": "db293c56-b1d4-4a65-bc7c-ff15bdc7754a"
+ }
+}
+ {
+ "associatedIndex": 2
+}
+
+
+
+
+
+
+ {
+ "keyToString": {
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "git-widget-placeholder": "master",
+ "kotlin-language-version-configured": "true",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "vue.rearranger.settings.migration": "true"
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1720708986075
+
+
+ 1720708986075
+
+
+
+
+
+
+ 1720709175765
+
+
+
+ 1720709175765
+
+
+
+ 1725441940766
+
+
+
+ 1725441940766
+
+
+
+ 1725441956012
+
+
+
+ 1725441956012
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index aaa28c7..7658f65 100644
--- a/README.md
+++ b/README.md
@@ -1,58 +1,84 @@
-[**我帮阿里云推广服务器89/年,229/3年,买来送自己,送女朋友马上过年再合适不过了,买了搭建个项目给面试官看也香,还可以熟悉技术栈(老用户用家人账号买就好了,我用我妈的😂)。←点击或者扫码购买↓**](https://www.aliyun.com/minisite/goods?userCode=tybhsgp5&share_source=copy_link)
-
automata = new ArrayList<>();
+ String wildcardText = wildcardquery.text();
+ for (int i = 0; i < wildcardText.length();) {
+ final int c = wildcardText.codePointAt(i);
+ int length = Character.charCount(c);
+ switch(c) {
+ case WILDCARD_STRING:
+ automata.add(Automata.makeAnyString());
+ break;
+ case WILDCARD_CHAR:
+ automata.add(Automata.makeAnyChar());
+ break;
+ case WILDCARD_ESCAPE:
+ // add the next codepoint instead, if it exists
+ if (i + length < wildcardText.length()) {
+ final int nextChar = wildcardText.codePointAt(i + length);
+ length += Character.charCount(nextChar);
+ automata.add(Automata.makeChar(nextChar));
+ break;
+ } // else fallthru, lenient parsing with a trailing \
+ default:
+ automata.add(Automata.makeChar(c));
+ }
+ i += length;
+ }
+ return Operations.concatenate(automata);
+ }
+```
+
+2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。
+
+3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA
+
+```java
+/**
+ \* Determinizes the given automaton.
+ \*
+ \* Worst case complexity: exponential in number of states.
+ \* @param maxDeterminizedStates Maximum number of states created when
+ \* determinizing. Higher numbers allow this operation to consume more
+ \* memory but allow more complex automatons. Use
+ \* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know
+ \* how many to allow.
+ \* @throws TooComplexToDeterminizeException if determinizing a creates an
+ \* automaton with more than maxDeterminizedStates
+ */
+```
+
+代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别!
+
+为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制
+
+```java
+ /**
+ * Default maximum number of states that {@link Operations#determinize} should create.
+ */
+ public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000;
+```
+
+在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。
+
+至于NFA和DFA的区别是什么? 如何相互转换?
+
+网上有很多数学层面的资料和论文,限于帅丙算法方面有限的知识,无精力去深入探究。
+
+但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。
+
+**DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。**
+
+回想Elasticsearch官方文档里对于Wildcard query有特别说明,**要避免使用通配符开头的term**。
+
+> " Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?."
+
+结合对上面Wildcard query底层实现的探究,也就不难理解这句话的含义了!
+
+**小结: Wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。**
+
+最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。
+
+对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。
+
+**补充**: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。
+
+**回忆**:为啥之前挂了一次重启恢复了,马上又挂了?用户搜了两次。。。
+
+### 解决方案
+
+其实解决这种问题很简单,既然知道关键词长了会有问题,我就**做限制**嘛,大家可以去看看搜索引擎某度、某宝啥的,是不是都做了长度限制?
+
+我复制了很长的一段汉字进去百度就是这个结果咯,某宝过长都返回**默认页面**了。
+
+
+
+
+
+
+
+如果你的产品一定要给用户一点东西,简单,找出一些热词分析出来就好了,或者给点热搜商品**兜底**。
+
+我怎么做的呢?判断字符串长度大于50我就直接返回空数组了,这样对用户体验好点,你返回个参数错误或者默认错误别人还**以为你有Bug**呢对吧。
+
+### 总结
+
+其实敖丙我啥事故等级都没背哈哈,这个算是事故,但是敖丙我这么可爱,领导也心疼我啊,肯定不会怪我的拉,主要是我设计都考虑了很多方案和场景了,没想到有这个坑。(yy:敖丙你个渣男,又是标题党,人家还以为你没工作了要养你呢!)
+
+大家也可以通过这次事故体会到,技术选型的时候,**方案的重要性**了吧,就算你考虑不全,但是不至于真正的问题来了手足无措啊,并不是所有的事故都可以像这次这样重启就搞定了,**不要存有侥幸心理,心存敬畏**。
+
+### 絮叨
+
+敖丙啊,又有牌面了,得到**阿里云消息中间件团队**小伙伴的认可,并且发现居然是我学姐-**风云**(花名)!!!
+
+她是个好学的小姐姐,大家多多像优秀的仔学习,学姐不是做技术的,但是都在不断学习,说实话我的眼角又湿了。
+
+
+
+### 别跑,投票!!!
+
+我准备把我的公众号**JavaFamily** 这个名字改了,这个名字还是差点意思,但是又不能叫敖丙了,被注册商标了,我就问了下群里的人才,目前有两个我比较喜欢的
+
+- **帅丙**
+- **三太子敖丙**
+- 其他给我留言
+
+因为这个可能会陪伴我很久,甚至直到死去,希望大家都给点建议哈哈。
+
+别问我为啥要跟敖丙这个名字相关,**再问自杀**!
+
+我花名就叫这个,所以😂
+
+
+
+
+
+## 日常求赞
+
+好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
+
+我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
+
+创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
+
+敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 !
+
+------
+
+> 文章每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有**技术交流群**,我们一起有点东西。
+
+
+书三千,吾全取。
+
+人千万,独暖你。 ---暖男敖丙
\ No newline at end of file
diff --git "a/docs/creative/\343\200\212\345\220\220\350\241\200\346\225\264\347\220\206\343\200\213\345\215\201\345\271\264\351\243\216\351\233\250\346\212\200\346\234\257\344\272\272\347\232\204\344\271\246\345\215\225\346\225\264\347\220\206.md" "b/docs/creative/\343\200\212\345\220\220\350\241\200\346\225\264\347\220\206\343\200\213\345\215\201\345\271\264\351\243\216\351\233\250\346\212\200\346\234\257\344\272\272\347\232\204\344\271\246\345\215\225\346\225\264\347\220\206.md"
new file mode 100644
index 0000000..fae21c8
--- /dev/null
+++ "b/docs/creative/\343\200\212\345\220\220\350\241\200\346\225\264\347\220\206\343\200\213\345\215\201\345\271\264\351\243\216\351\233\250\346\212\200\346\234\257\344\272\272\347\232\204\344\271\246\345\215\225\346\225\264\347\220\206.md"
@@ -0,0 +1,790 @@
+## 《程序人生》十年风雨技术人的书单整理
+
+> 你知道的越多,你不知道的越多
+
+> 点赞再看,养成习惯
+
+> 给岁月以文明,而不是给文明以岁月
+
+> 本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。
+
+### 前言
+
+王潇:格局决定了一个人的梦想,梦想反过来决定行为。
+
+那格局是什么呢?
+
+**格局是你能够看见的深度、广度和密度。**
+
+王潇认为,格局是一本本书搭建起来的,正如她所言:“**读书让我知道世界很大,然后才知道推开门去看看这个世界。**”
+
+之前有一篇文章我写到了几乎是一个技术人从0到1的整个生涯了,其实大家发现根本就没有终点。
+
+[《程序人生》风雨十年-从大学到技术专家我做了啥?](https://juejin.im/post/5ded1639e51d455830350da5)
+
+我们的一生其实也基本上都在学习,那提到学习,我第一时间想到的就是读书了。
+
+记得帅丙在自己21岁的那个夏天,当时拿到了自己的第一笔实习工资1400块,因为是110块一天嘛,而且入职的第一个月也没上满,但是还是很开心,第一个月师傅就给了一个建议,买本书吧。
+
+就这样我买了出社会之后的第一本技术书籍《Java核心卷一》,也是师傅推荐的,如获至宝。
+
+到现在我的书架都茫茫当当了,但是这本书还是一直陪伴我左右,也是我印象最深刻的技术书籍,因为那感觉就像是**初恋的味道**,甜甜的。
+
+为啥推荐大家读书呢,**书籍的作者都是几年甚至几十年的经验,最后总结为一本书,**那就算里面有错误的点,我想你花几十块,只用几个礼拜甚至几天就可以拜读人家十几年的经验,我觉得怎么算都是血赚?
+
+## 正文
+
+好了扯了这么多只是想要引出今天的主题,我会按照不同的类型把我知道的一些书籍,包括身边朋友推荐的书籍,都在这里列给大家,大家按需自取。
+
+我还推荐了很多非技术的书籍,人文地理悬疑情感都会涉及,反正很多书我是真的很喜欢。
+
+我上一篇提到的我亦师亦友的阿里技术专家朋友,他就是个很喜欢读书的人,说实话他的**学校背景不好**,刚开始出来也是在外包干活的,但是他有个习惯,就是看书,基本上闲暇时候,都能看到他看书的身影。
+
+看他的动态也都是分享各类书籍,**口吐芬芳**,我要是个女人,估计他跑不掉了。
+
+反正经常读书的人,你跟他说话,看他谈吐,自然就知道了,我经常说的那句:**腹有诗书气自华** 希望你能懂,不看真像网上的段子那样,看到美好的景色只能:卧*
+
+下面是我截图的他的几条动态,这种谈吐我爱了❤
+
+
+
+
+
+
+
+### Java
+
+#### Java核心技术·卷 I(原书第10版)| Core Java Volume
+
+> 讲的很全面,书中的代码示例都很好,很适合Java入门。
+>
+> 但是作者不太厚道的是把现在没人用的GUI编程放在了第一卷,基本上10~13章是可以不用读的。
+
+
+
+
+
+
+
+
+
+#### Java性能权威指南|Java Performance: The Definitive Guide
+
+> 市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。
+>
+> 通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,最终使程序如虎添翼。
+
+
+
+#### 实战Java高并发程序设计|葛一鸣
+
+> 由部分段落的行文来看,搬了官方文档。
+>
+> 也有一些第一人称的叙述和思考,也能看出作者也是花了一点心思的。胜在比较基础,涉及到的知识点也还很全面(讲到了流水线计算和并发模型这些边边角角的),但是由于是编著,全书整体上不够统一和深入,适合作为学习高并发的第一本工具书。
+
+
+
+#### Java 8实战
+
+> 对Java8的新特性讲解的十分到位,尤其是lamdba表达式和流的操作。
+>
+> 再者对于Java8并发处理很有独到见解。对于并行数据处理和组合式异步编程还需要更深的思考才能更加掌握。
+>
+> 推荐给再用java8但没有去真正了解的人看,有很多你不知道的细节、原理和类库设计者的用心良苦在里面、内容没有很难,抽出几个小时就能看完,花费的时间和收获相比,性价比很高。
+
+
+
+#### Java并发编程实战
+
+> 先不谈本书的内容如何,光书名就足够吸引不少目光。“并发”这个词在Java世界里往往和“高级、核心”等字眼相联系起来,就冲着这两个字,都将勾起软件工程师们埋藏在心底那种对技术的探索欲和对高级API的驾驭感。
+>
+> 程序员嘛,多少都有点职业病。其实Java对“并发”优化从未停止过,从5.0到7.0,几乎每个版本的新特性里,都会针对前一版本在“并发”上有所改进。这种改进包括提供更丰富的API接口、JVM底层性能优化等诸多方面。
+
+
+
+#### Thinking in Java
+
+> 很美味的一本书,不仅有icecreamm,sundae,sandwich,还有burrito!真是越看越饿啊~
+
+
+
+#### Effective Java中文版(第3版)|Effective Java Third Edition
+
+> Java 高阶书籍,小白劝退。介绍了关于Java 编程的90个经验技巧。
+>
+> 作者功力非常强悍,导致这本书有时知识面迁移很广。总之,非常适合有一定Java开发经验的人阅读提升。
+
+
+
+#### 深入理解Java虚拟机(第3版)| 周志明
+
+> 浅显易懂。最重要的是开启一扇理解虚拟机的大门。
+>
+> 内存管理机制与Java内存模型、高效并发这三章是特别实用的。
+
+
+
+
+
+#### Java虚拟机规范(Java SE 8版)|爱飞翔、周志明
+
+> 整本书就觉得第二章的方法字节码执行流程,第四章的前8节和第五章能看懂一些。其他的过于细致和琐碎了。
+>
+> 把Java字节码讲的很清楚了,本质上Java虚拟机就是通过字节码来构建的一套体系罢了。所以字节码说的非常细致深入。
+
+
+
+
+
+### 数据&大数据
+
+#### 数据结构与算法分析|Data Structures and Algorithm Analysis in Java
+
+> 数据结构是计算机的核心,这部书以java语言为基础,详细的介绍了基本数据结构、图、以及相关的排序、最短路径、最小生成树等问题。
+>
+> 但是有一些高级的数据结构并没有介绍,可以通过《数据结构与算法分析——C语言描述》来增加对这方面的了解。
+
+
+
+#### MySQL必知必会
+
+> 《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。
+>
+> 书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。
+
+
+
+#### 数据库系统概念|Datebase System Concepts(Fifth Edition)
+
+> 从大学读到现在,每次拿起都有新的收获。而且这本书还是对各个数据相关领域的概览,不仅仅是数据库本身。
+
+
+
+#### 高性能MySQL
+
+> 对于想要了解MySQL性能提升的人来说,这是一本不可多得的书。
+>
+> 书中没有各种提升性能的秘籍,而是深入问题的核心,详细的解释了每种提升性能的原理,从而可以使你四两拨千斤。授之于鱼不如授之于渔,这本书做到了。
+
+
+
+#### 高可用MySQL
+
+> 很实用的书籍,只可惜公司现有的业务和数据量还没有达到需要实践书中知识的地步。
+
+
+
+#### 利用Python进行数据分析|唐学韬
+
+> 内容还是跟不上库的发展速度,建议结合里面讲的库的文档来看。
+>
+> 内容安排上我觉得还不错,作者是pandas的作者,所以对pandas的讲解和设计思路都讲得很清楚。除此以外,作者也是干过金融数据分析的,所以后面专门讲了时间序列和金融数据的分析。
+
+
+
+#### HBase
+
+> 看完影印版第一遍,开始以为会是大量讲API,实际上除了没有将HBase源代码,该讲的都讲了,CH8,9章留到最后看的,确实有点顿悟的感觉,接下来需要系统的看一遍Client API,然后深入代码,Come ON!
+
+
+
+#### Programming Hive
+
+> Hive工具书,Hive高级特性。
+
+
+
+#### Hadoop in Practice| Alex Holmes
+
+> 感觉比action那本要强 像是cookbook类型的 整个过完以后hadoop生态圈的各种都接触到了 这本书适合当参考手册用。
+
+
+
+#### Hadoop技术内幕|董西成
+
+> 其实国人能写这样的书,感觉还是不错的,不过感觉很多东西不太深入,感觉在深入之前,和先有整体,带着整体做深入会更好一点, jobclient,jobtracer,tasktracer之间的关系最好能系统化
+
+
+
+#### Learning Spark
+
+> 很不错,core的原理部分和api用途解释得很清楚,以前看文档和代码理解不了的地方豁然开朗。
+>
+> 不足的地方是后几章比较弱,mllib方面没有深入讲实现原理。graphx也没有涉及
+
+
+
+#### ODPS权威指南
+
+> 基本上还算一本不错的入门,虽然细节方面谈的不多,底层也不够深入,但毕竟是少有的ODPS书籍,且覆盖面很全,例子也还行。
+
+
+
+#### 数据之巅|徐子沛
+
+> 从一个新的视角(数据)切入,写美国历史,统计学的发展贯穿其中,草蛇灰线,伏脉千里,读起来波澜壮阔。
+
+
+
+### 消息队列&Redis
+
+#### RabbitMQ实战
+
+> 很多年前的书了,书中的例子现在已经不适用了,推荐官方教程。
+>
+> 一些基础还是适用,网上也没有太多讲rab的书籍,将就看下也行,我没用过所以....
+
+
+
+#### Apache Kafka源码剖析|徐郡明
+
+> 虽然还没看,但知道应该不差。我是看了作者的mybatis源码分析,再来看这本的,相信作者。
+>
+> 作者怎么有这么多时间,把框架研究的这么透彻,佩服,佩服。
+
+
+
+#### 深入理解Kafka:核心设计与实践原理|朱忠华
+
+> 通俗易懂,图文并茂,用了很多图和示例讲解kafka的架构,从宏观入手,再讲到细节,比较好,值得推荐。
+>
+> 深入理解Kafka是市面上讲解Kafka核心原理最透彻的,全书都是挑了kafka最核心的细节在讲比如分区副本选举、分区从分配、kafka数据存储结构、时间轮、我认为是目前kafka相关书籍里最好的一本。
+
+
+
+#### Kafka
+
+> 认真刷了 kafka internal 那章,看了个talk,算是入了个门。
+>
+> 系统设计真是门艺术。
+
+
+
+#### RocketMQ实战与原理解析|杨开元
+
+> 对RocketMQ的脉络做了一个大概的说明吧,深入细节的东西还是需要自己看代码
+
+
+
+#### Redis设计与实现|黄健宏
+
+> 部分内容写得比较啰嗦,当然往好了说是对新手友好,不厌其烦地分析细节,但也让整本书变厚了😂,个人以为精炼语言可以减少20%的内容。
+>
+> 对于有心一窥redis实现原理的读者来说,本书展露了足够丰富的内容和细节,却不至于让冗长的实现代码吓跑读者——伪代码的意义在此。下一步是真正读源码了。
+
+
+
+#### Redis 深度历险:核心原理与应用实践|钱文品
+
+> 真心不错,数据结构原理+实际应用+单线程模型+集群(sentinel, codis, redis cluster), 分布式锁等等讲的都十分透彻。
+>
+> 一本书的作用不就是系统性梳理,为读者打开一扇窗,读者想了解更多,可以自己通过这扇窗去Google。这本书的一个瑕疵是最后一章吧,写的仓促了。不过瑕不掩瑜。
+
+
+
+### 技术综合
+
+#### TCP/IP详解 卷1:协议
+
+> 读专业性书籍是一件很枯燥的事,我的建议就是把它作为一本手册,先浏览一遍,遇到问题再去详细查,高效。
+
+
+
+#### Netty in Action
+
+> 涉及到很多专业名词新概念看英文原版顺畅得多,第十五章 Choosing the right thread model 真是写得太好了。另外结合Ron Hitchens 写的《JAVA NIO》一起看对理解JAVA NIO和Netty还是很有帮助的
+
+
+
+#### ZooKeeper
+
+> 值得使用zookeeper的人员阅读, 对于zookeeper的内部机制及api进行了很详细的讲解, 后半部分深入地讲解了zookeeper中ensemble互相协作的流程, 及group等高级配置, 对zookeeper的高级应用及其它类似系统的设计都很有借鉴意义.
+
+
+
+#### 从Paxos到Zookeeper|倪超
+
+> 分布式入门鼻祖,开始部分深入阐述cap和base理论,所有的分布式框架都是围绕这个理论的做平衡和取舍,中间 zk的原理、特性、实战也讲的非常清晰,同时讲cap理论在zk中是如何体现,更加深你对cap的理解.
+
+
+
+#### 深入理解Nginx(第2版)|陶辉
+
+> 云里雾里的快速读了一遍,主要是读不懂,读完后的感受是设计的真好。
+>
+> 原本是抱着了解原理进而优化性能的想法来读的,却发现书中的内容都是讲源码,作者对源码的注释超级详细,非常适合开发者,但不适合使用者,给个五星好评是因为不想因为我这种菜鸡而埋没了高质量内容。
+>
+> 另外别人的代码写的真好看,即便是过程式语言程序也吊打我写的面向对象语言程序。
+>
+>
+> 作者是zookeeper的活跃贡献者,而且是很资深的研究员,内容比较严谨而且较好的把握住了zk的精髓。书很薄,但是没有废话,选题是经过深思熟虑的。
+
+
+
+#### 深入剖析Tomcat
+
+> 本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。
+
+
+
+#### 深入理解计算机系统 | 布莱恩特
+
+> 无论是内容还是纸张印刷,都是满分。计算机学科的集大成之作。引导你如何练内功的,算是高配版本的计算机导论,目的是釜底抽薪引出来操作系统、组成原理这些专业核心的课程。帮助我们按图索骥,点亮一个一个技能树。
+
+
+
+#### 架构探险分布式服务框架 | 李业兵
+
+> 刚看前几章的时候,心里满脑子想得都是这特么贴一整页pom文件代码上来干鸡毛,又是骗稿费的,买亏了买亏了,后来到序列化那章开始,诶?还有那么点意思啊。
+>
+> 到服务注册中心和服务通讯,60块钱的书钱已经赚回来了。
+>
+> 知识是无价的,如果能花几十块钱帮你扫了几个盲区,那就是赚了。
+
+
+
+#### 深入分析JavaWeb技术内幕 | 许令波
+
+> 与这本书相识大概是四年前是在老家的北方图书城里,当时看到目录的感觉是真的惊艳,对当时刚入行的自己来说,这简直就是为我量身定做的扫盲科普集啊。
+>
+> 但是可惜的是,这本书在后来却一直没机会读上。然后经过四年的打怪升级之后,这次的阅读体验依旧很好。
+>
+> 其中,java编译原理、 Servlet工作原理、 Tomcat、spring和iBatis这几章的收获很大。
+
+
+
+### 前端
+
+#### jQuery 技术内幕| 高云
+
+> 非常棒的一本书,大大降低了阅读jquery源码的难度(虽然还是非常难)。
+
+
+
+#### Head First HTML与CSS(第2版)
+
+> 翻了非常久的时间 断断续续 其实从头翻到尾 才发现一点都不难。
+>
+> 可我被自己的懒惰和畏难情绪给拖累了 简单说 我成了自己往前探索的负担。网页基础的语法基本都涵盖了 限于文本形态 知识点都没法像做题一样被反复地运用和复习到。通俗易懂 这不知算是多高的评价?
+>
+> 作为入门真心算不错了 如果更有耐心 在翻完 HTML 后 对 CSS 部分最好是可以迅速过一遍 找案例练习估计更好 纸上得来终觉浅 总是这样。
+
+
+
+#### JavaScript高级程序设计(第3版)
+
+> JavaScript最基础的书籍,要看认真,慢慢地看,累计接近1000小时吧。而且对象与继承,性能优化,HTML5 api由于没有实践或缺乏代码阅读量导致看的很糊涂,不过以后可以遇到时再翻翻,或者看更专业的书。
+
+
+
+#### 深入理解ES6
+
+> Zakas的又一部杰作,他的作品最优秀的地方在于只是阐述,很少评价,这在帮助我们夯实基础时十分有意义,我也喜欢这种风格。
+>
+> 我是中英文参照阅读的,译本后半部分有一些文字上的纰漏,但是总体来说忠实原文,水平还是相当不错,希望再版时可以修复这些文字问题。
+
+
+
+#### 高性能JavaScript
+
+> 还是挺不错的。尤其是对初学者。总结了好多程序方面的好习惯。
+>
+> 不过对于老手来说,这些常识已经深入骨髓了。
+
+
+
+#### 深入浅出Node.js|朴灵
+
+> 本书是我看到现在对Node.JS技术原理和应用实践阐述的最深入,也最全面的一本书。鉴于作者也是淘宝的一位工程师,在技术总是国外好的大环境下,没有理由不给本书五颗星。
+>
+> 作者秉着授人于鱼不如授人于渔的精神,细致入微的从V8虚拟机,内存管理,字符串与Buffer的应用,异步编程的思路和原理这些基础的角度来解释Node.JS是如何工作的,比起市面上众多教你如何安装node,用几个包编写一些示例来比,本书绝对让人受益匪浅。
+>
+> 认真看完本书,几乎可以让你从一个Node的外行进阶到专家的水平。赞!
+
+
+
+#### Vue跟React的技术栈的书不多,很多也是官方文档的照搬照抄,我觉得看官网吧哈哈。
+
+### 非技术类
+
+#### 失踪的孩子
+
+> 整本书的能量太密集了,像一个源源不断喷发的火山,读完怅然若失。最后几页,莱农从时间中回望,生命的真相被自己毫不留情的剖白,而即使是这样的时刻,她依然能再次在对莉拉的爱和嫉妒中被激发开始进行她最为重要、最可能留在时间之中的作品的创作,如此的勇气,诚实和坚韧……反正我已经喜欢她了。
+>
+> 而莉拉依然是个迷。她和莱农是相反的人,莱农会攫住一切填充自己,去成为,但莉拉对任何事情的投入都不会滋养自身,而是燃烧掉自己的一部分。
+>
+> 她的激情,超越一切的理解和视野与她的情绪化,她的恐惧,都让人困惑。莉拉是所有人的镜子,任何人在她面前都不得不面对自己;同时,是不是没有人,或者说莉拉没有允许任何人了解她?因为她在与外界和自己的对抗中也未能真正看见自己?
+
+
+
+
+
+#### 人生|路遥
+
+> 想着和平凡的世界一个调子,都是乡村,都是文革的尾巴,都是那点家长里短绝对真实。
+>
+> 我总觉得那是作者的真实写照,一切都是从自己的记忆中提炼出来的故事。
+>
+> 只不过根据高加林我总在思考劳动人民是否应该有文化,有文化了以后就开始痛苦,开始怀春悲秋,开始事逼,开始怨天尤人。
+>
+> 知识分子那些臭毛病显露无疑。
+
+
+
+
+
+#### 丝绸之路 | 彼得·弗兰科潘
+
+
+
+> 书的颜值很高,厚厚的大开本,包装和纸张都不枉自己百元大洋。书名虽叫【丝绸之路】,但是读后发现其实是以中东为针,一路串起亚欧大陆各个文明两千多年间所发生的故事。
+>
+> 从史实、文化、宗教、政治、权力、金钱等多方面论述了以中亚和欧洲为主的发展史,信息量非常的大。每个章节的标题都用四个字直接道出当前世界的核心驱动,比如基督之路、铁蹄之路、西欧之路、纳粹之路、争霸之路。
+>
+> 视野广阔,大开大合,时间跨度可算是穿越千年中东。美中不足的是,中国作为丝绸之路东段上最为重要的国家,描述的篇幅却很少。
+
+
+
+#### 我的天才女友 | 埃莱娜·费兰特
+
+> 来自意大利作家的小说,“那不勒斯”四部曲的第1部,讲述了两个女主人公莉拉和埃莱娜的少女时代。
+>
+> 相比七月与安生,跨度更大,情节也要丰富很多,但是作为一个男性阅读角度似乎get不到小说所评价那样优秀的点,代入感很好,时间已经过去好久,现在留在记忆中的还是如西西里的美丽传说般暖色调的意大利小镇上有两个小女生在平淡的生活。
+
+
+
+
+
+#### 长安十二时辰 | 马伯庸
+
+> 开年第一单,阅读体验非常的好,完全是美国个人主义英雄大片的大唐版,而主人公张小敬身上却有着更多的坚忍和矛盾,中间有个片段,讲檀棋在元宵灯会的街上跟着张小敬,在万千盏灯笼一齐高高烛起,光彩明耀,火树银花中,看张小敬的背影显得很是落寞。
+>
+> 读完之后,这一幕仍然记忆犹新,靠整个故事的支撑,这一幕真的完全可以体会到落寞二字。
+>
+> 书中很认真的说了一些长安的城建和大唐的民俗,管制,可以看出来为了写出这本书,亲王的确是花费了不少心思的,很佩服。
+>
+> 一本非常非常适合改编成电影的小说(事实上也的确正在拍摄),值得推荐。
+>
+> ps:2019年同名电视剧已经上线了…
+
+
+
+#### 布谷鸟的呼唤 | J·K·罗琳
+
+> 大概三年前买的,今年回家整理新书架的时候发现了它,就带回杭州了。
+>
+> 故事情节比不上哈利波特,但是文笔是真的没得说,毕竟是能写出来哈利波特的人。
+>
+> 作为推理小说,怕是不及格,但是把它作为犯罪小说之类的非类型小说来看的话,其实阅读体验还是可以的。
+
+
+
+#### 欧洲:1453年以来的争霸之路 | 布伦丹·西姆斯
+
+> 自文艺复兴之后,欧洲开始渐渐的走进地球文明的舞台正中心。
+>
+> 读到中间德意志民族的内政被周边国家的各种干涉,感觉德国和我们的兔子一样,是个多难的民族,所以统一之后思想家才会这么多,一战二战的德国,如果用兔子的一句话概括,我们走了一些弯路。
+
+
+
+
+
+#### 房思琪的初恋乐园 | 林奕含
+
+> 正如文前李银河所说,林奕含属于老天爷赏口饭的那种人,非常有才华的、有灵气的一位年轻作者。我们应当感激,不用亲身经历,就可以看到世界的背面,难以想象出林每次去回忆,然后再去一步一步的描述出当时的心理活动,此间的痛苦。
+>
+> 最后,书中的话:忍耐不是美德,把忍耐当成美德是这个伪善的世界维持它扭曲的秩序的方式,生气才是美德。
+
+
+
+#### 毛泽东传 | 迪克·威尔逊
+
+> 来自英国人的传记,可以当做记事表,而且就算有一些主观评价在里面,作为外国人难免有偏差,也不可信,毛公当称之为我等民族力挽狂澜第一人。
+
+
+
+#### 半小时漫画世界史 | 陈磊
+
+> 和上一本中国史一样,阅读体验很轻松,如果是对这段历史毫无概念的话,真的砸墙推荐。但是如果是要有了一定的知识储备的话,那就没啥意思了,半小时也别指望能讲多深了。
+>
+> 巴黎和罗马真的是太值得去一次的了。
+
+
+
+
+
+#### 欧洲现代史:从文艺复兴到现在 | 约翰·梅里曼
+
+> 耶鲁大学历史教授的课堂讲义,采用的是国别和编年混合风格,顺着历史发展的脉络逐一展开,又不失相互关联性,而不是简简单单的说几几年发生了什么,几月几日谁谁谁死了这些。
+>
+> 5个世纪中葡萄牙西班牙瑞典荷兰法国轮流崛起,俄国西化,德国统一,英国宗教改革,奥地利波兰土耳其相继衰落,文艺复兴,启蒙运动,航海时代,工业革命,世界大战,美苏冷战。
+>
+> 维多利亚女王拿破仑一世路易十四彼得大帝叶卡捷琳娜俾斯麦希特勒丘吉尔,当称人类群星闪耀时。
+
+
+
+#### 爱德华•巴纳德的堕落:毛姆短篇小说集1 | 毛姆
+
+> 屯了毛姆这么多书,这次才是第一次看。
+>
+> 书的纸张倒是很有意思,600多页,却很轻。故事读起来倒像是个老朋友再和你讲故事,叨叨叨的从夏威夷讲到南美洲,又从西海岸讲到东南亚,讲故事的水平非常的高,几乎都是几段字下来,就把人带到了故事场景中。最喜欢的两篇是爱德华•巴纳德的堕落,赴宴之前,和最后的译后记。
+
+
+
+#### 一句顶一万句 | 刘震云
+
+> 第八届茅盾文学奖获奖作品,叙事架构犹如一生二二生三三生万物绵绵不绝扩散开来,薄薄三百页,前后一百年,初看时以为《平凡的世界》,结局才发现是《百年孤独》,“生活是过以后,而不是过从前”。
+
+
+
+#### 生活的艺术家 | 李小龙
+
+> 来自李小龙的一本散文集,是的,就是那个李小龙。
+>
+> 很难想到那个在电影里面喊着啊哒~的他,大学是专修哲学的。书中的文章大都是对于生活和哲学的思考,可以看到那个在大荧幕前面一秒五踢啊哒啊哒的背后,是一个冷静、理性、智慧、通达的李小龙。“我无法教你什么,只能帮助你探求你自己。除此之外,别无他法。”
+
+
+
+#### 穷查理宝典 | 查理芒格
+
+> 查理芒格的思想集和演讲稿编,知识面跨学科,洞察力才能足够深,包括数学、物理、生物、历史、经济等这些硬学科,从而形成一个多学科的思维框架。
+>
+> 致富也不只是赚了多少钱那么简单,而是在道德品质、阅读能力和个人生活上全面提升的过程。应该专注于正在做的事情,多阅读,特别是传记,来和“伟人”交朋友,减少物欲,满足自己已经拥有的,不嫉妒别人。
+
+
+
+
+
+
+
+#### 汉密尔顿传 | 罗恩·切诺
+
+> 我只能说汉密尔顿,这个被印在美元上的人,人生只能用精彩至极来形容了。
+>
+> 书中详细介绍了汉密尔顿在独立战争、费城制宪、宪法批准、首届国会以及建国初期等不同历史阶段中发挥的巨大作用,尤其是建国之初,在一切都没有先例的情况下,汉密尔顿为奠定美国联邦的政治体制、经济秩序和金融体系做出了巨大的贡献——建立美国信用体系,建立联邦银行,建立联邦税收体系,建立海关,建立海岸警卫队,以及促进制造业发展等。
+>
+> 在这本波澜壮阔的自传的最后,本以为能写上一大段对他的盖棺定论,然而却很平淡随意的用他写给艾丽萨的一封信作为了结尾,可能是不再需要作者去告诉书前的人他该如何评价,历史已经给出了答案。
+>
+> “艾丽萨,你治愈了我此生因爱而生的伤痛。”
+
+
+
+#### 百年孤独|加西亚·马尔克斯
+
+> 久负盛名的大作,读完只能说,果然只有这种书才配得上诺奖。
+>
+> 先前看《霍乱时期的爱情》,印象最深的就是华丽魔幻文笔和细腻的心理活动描写,到这本《百年孤独》,震撼的目瞪口呆,怎么能有人写得出这样的小说。
+>
+> 只能说,无论怎么列必读书籍,都绕不开此书。
+
+
+
+#### 月亮与六便士
+
+> 毛大爷名气最具盛名的一本书,很易读的文学作品。
+>
+> 全篇小说都是从第一人称“我”的角度,对斯特里克兰德进行了主观的描写,从斯特里克兰德开始离家出走开始渐入佳境,毛姆在环球旅行中写作,以至于场景地点的代入感都非常强,带着读者登上塔希提岛上,在酒馆里和众人逐个聊起斯特里克兰德,“我”和读者一起,在一来一去的谈话中,了解到了这个天才最后的经历。后半生穷困潦倒的他在死的时候,肯定不会知道自己在死后的一个世纪,被称之为天才,画作也被收藏在美术馆作为镇馆之宝,流传百年。但他是自由的,没有遗憾的。
+>
+> 最后引用一段话,“只要在我的生活中能有变迁——变迁和无法预见的刺激,**我是准备踏上怪石嶙峋的山崖,奔赴暗礁遍布的海滩的**。”
+
+
+
+#### 股票作手回忆录|杰西·利弗莫尔
+
+> 被誉为百年美股第一人,杰西·利弗莫尔的自传,五美元起家,到日赚一亿美金的投机之路,可以看到利弗莫尔在小的时候就对数字有着非常人的敏感和对波动线的记忆力,十多岁只身一人远走纽约,更见其杀伐果断之气。全书并没有讲操作细节,但是传主的做事风格很值得研究,时机、独立思考、判断、知错能改、以及鳄鱼般的耐心。
+
+
+
+#### 万历十五年 | 黄仁宇
+
+> 一本表面上写历史,却涵盖当时的政治、经济、社会民俗、当世思想的大作,对中国历史上诸多王朝暗流下那道潜规则的分析和批判。格局之大,立意之高,实属罕见。
+>
+> 读罢全书,我们明白明王朝的覆灭是必然的,而后的满清,只不过是改朝换代,骨子里与前朝无异,灭亡也是迟早的。
+>
+> 我们的身上被锁住了一个牢固的枷锁,丢在泥坑,都在挣扎,越来越烂。
+
+
+
+#### 第五项修炼| 彼得·圣吉
+
+> 前半部分理论,后半部分讲实战。捞干的来说,大局观的系统思考能力、增长极限和转移负担的自我超越能力、正向暗示的心智能力,拓展认知边界建立跨学科的思维架构能力。
+
+
+
+#### 海边的卡夫卡|村上春树
+
+> 卡夫卡,舒伯特,艾希曼,琼尼沃克,乌鸦少年,短毛猫语,竹筴鱼雨,肠子迷宫,夏目漱石,雨月物语,俄狄浦斯。在这个世界上,不单调的东西让人很快厌倦,不让人厌倦的大多是单调的东西。
+>
+> 我的人生可以有把玩单调的时间,但没有忍受厌倦的余地,而大部分人分不出二者的差别。
+>
+> 孤独因你本身而千变万化。
+
+
+
+#### 白夜行|东野圭吾
+
+> 把小说写成这样绝对是开挂了吧,除了连番登场的几十号人物,随处雕琢的大时代的背景也让人叹为观止。对人性的挖掘比起吉田修一还是弱一些,就是纯好看,从第一句开始吸住你逐渐往往里掉。
+
+
+
+#### 嫌疑人X的献身|东野圭吾
+
+> 这个社会 每一个人都是时钟上的齿轮,为了自己的意愿,也不该牺牲掉他人,哪怕那是出于爱,一个错误尚且为错,付出更大的努力用更大错误也扭转不了的,
+>
+> 这毕竟不是数学的负负得正,逻辑之所以没法解决罪恶的问题,只因为最初就规避了人性。
+
+
+
+#### 追风筝的人|卡勒德·胡赛尼
+
+> 为什么忠诚善良的人反而遭到这样的结局,面对阿米尔的污蔑,他和阿里选择离去。
+>
+> 当房屋需要他时,他又毅然决然的选择坚守,为了阿米尔能够得到父亲的赞许,哈桑却受到那样的凌辱,换来的却是懦弱的阿米尔的回避,身份,阶级,好可笑的头衔,生命与忠诚在那些虚无的名誉不值一提。
+>
+> 犹如草芥浮萍....
+
+
+
+
+
+#### 恋情的终结 | 格雷厄姆
+
+> 现在看的小说都不多了,而爱情小说更是少之又少,但幸运的是,这本和上一本霍乱时期的爱情一样,都是不可多得的大师之作。
+>
+> 小说情节简单来说就是爱上了个有妇之夫,然后阴差阳错私奔失败,接着分道扬镳直到多年之后的偶遇,最后女主患病而亡。
+>
+> 但文笔是真的细腻到不敢相信是个男人写的,书里穷尽了爱情中所有狂热的情感,狂热的爱,狂热的恨,狂热的猜疑,狂热的嫉妒,狂热的占有。
+
+
+
+#### 龙族I-IV|江南
+
+> 我十六岁的时候,看《缥缈录》,心中念着那个拿着虎牙枪的少年。
+>
+> 如今我二十三岁了,看《龙族》,面对一堆白烂中二的吐槽不知所措。
+>
+> 就像拿枪的少年穿起了风衣,救美的英雄接受了金币。我看着商业化写作对一个作者的侵蚀和改变,这让我觉得难过极了。
+
+
+
+#### 三体I-Ⅲ|刘慈欣
+
+> 《三体》就是那种让你在读完三部之后掩卷抬头,感觉眼中的世界都从此不一样了的书。
+
+
+
+#### 流浪地球|刘慈欣
+
+>觉得文笔胜于三体,且惊觉是三体之前的作品。
+>
+>对于其中地球变轨后的生态变化仍存在疑惑,那段地球与木星擦肩表现力强,不错的作品。
+
+
+
+#### 全球通史
+
+> 这种时间跨度如此之长的,有之前的《丝绸之路》和《人类简史》,但是无论是整体行文的架构、视野的宽度、以及分析思考的深度上来说,此书都要比这两本要优秀得多,尤其是到一战之前的部分。
+>
+> 幸亏之前大量零碎的知识点做背书,再遇此书建立整体体系,穿针引线,才有所体会到书前序中的"思接千载,视通万里"之感。
+
+
+
+#### 程序员的自我修养|俞甲子 / 石凡 / 潘爱民
+
+> 讲的不错,将硬件与系统、机器层与实现层整合了起来,有了一个很清晰的视角。
+
+
+
+#### 颈椎病康复指南|董晓俊
+
+> 出来打工不容易,大家照顾好自己。
+
+
+
+#### 活着|余华
+
+> 为啥安利这个,大家懂就好了
+
+
+
+#### 我们一无所有|安东尼·马拉
+
+> 艺术让我们不因真实而亡故,结构相当特别,像是在看电影。
+>
+> 讲述从苏联联邦到新俄罗斯近80年历史车轮下一些动人心魄的小人物微尘。
+>
+> 语言克制、平静,读来却十分疼痛,或是戏谑嘲讽像是苦中求乐,非常喜欢。
+
+
+
+### 总结
+
+其实我觉得在我们现在这个浮躁的社会,大家闲暇时间都是刷抖音,逛淘宝,微博......他们都在一点点吞噬你的碎片时间,如果你尝试着去用碎片的时间看看书,我想时间久了你自然能体会这样的好处。
+
+美团技术团队甚至会奖励读完一些书本的人,很多公司都有自己的小图书馆,我觉得挺好的。
+
+
+
+我现在也认识很多作者,像程序员小灰,老钱这样的作者,都很不错,如果未来自己能达到写作的条件的话我也想写哈哈。
+
+至于我为啥不敢懈怠......三歪(java3y作者)在我对面我真的不敢有丝毫放松,每次闲暇之余我准备拿起手机玩耍的时候,看到他在看书,我默默的放下手机,就是这样的人在不断鞭笞着我。
+
+
+
+### 鸣谢
+
+自己技术群的小伙伴:很多书籍我没写进去,主要是记录被刷走太多了,我让大家私聊,结果都发群里了,我就懒得整理了,主要是没书评我没看过也不敢写。
+
+豆瓣小伙伴:很多我没有的书籍我都是找的豆瓣书评。
+
+阿里技术团队的小伙伴:文章有很多书评都是来自他。
+
+博文视点:对文末抽奖的赞助
+
+**其实很多好书我都没写到,一时想不到,大家有喜欢的也留言让更多朋友看到嘛,我有空会修改文章。**
+
+**还有就是本文主要的目的不是安利多少书,主要是想大家放下手机翻开你在角落积灰的书籍,你会发现里面有光的。**
+
+这周双十二有点小忙,年会的事情也紧锣密鼓的筹备着,我下周要是鸽了那......
+
+### 抽书!!!
+
+#### 书名:Java系统性能优化实战
+
+
+
+个人推荐理由:
+
+- 20多个优化技巧:说明Java性能优化的各种方法。
+
+- 30多个具有“坏味道”的代码片段:实战演练优化技巧。
+
+- 常用的高性能工具:以Caffeine、Jackson、HikariCP为例进行讲解,并对其高性能的原因做一定的源码解析。
+
+- 容易阅读的代码:从代码注释、代码分解和面向对象三方面讲解如何编写容易阅读的代码。
+
+#### 规则:
+
+抽两本,公众号「**三太子敖丙**」这个文章下面留言点赞排名前两位送两本,截止本周我发周报之前,公众号和掘金周六我会写周报。
+
+觉得概率不大?
+
+**月底会有一个文章抽30本书**,至于送啥书,贫穷的我得好好想想。
+
+
+
+## 点关注,不迷路
+
+好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
+
+我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
+
+创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
+
+敖丙 | 文 【原创】
+
+如果本篇博客有任何错误,请批评指教,不胜感激 !
+
+------
+
+> 文章每周持续更新,可以微信搜索「 **三太子敖丙** 」第一时间阅读和催更(比博客早一到两篇哟),本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。
diff --git "a/docs/creative/\345\275\251\350\233\213.md" "b/docs/creative/\345\275\251\350\233\213.md"
index 3b463db..2395089 100644
--- "a/docs/creative/\345\275\251\350\233\213.md"
+++ "b/docs/creative/\345\275\251\350\233\213.md"
@@ -2,4 +2,8 @@
- 无论面对怎么样的失败,我决定再来一次。
-- 最高级的自律,享受孤独。
\ No newline at end of file
+- 最高级的自律,享受孤独。
+
+- 你要悄悄拔尖,然后惊艳所有人。
+
+- 如果父母还那么辛苦,那我们长大有什么用?
\ No newline at end of file
diff --git "a/docs/creative/\351\241\266\347\272\247\347\250\213\345\272\217\345\221\230\347\232\204\347\231\276\345\256\235\347\256\261.md" "b/docs/creative/\351\241\266\347\272\247\347\250\213\345\272\217\345\221\230\347\232\204\347\231\276\345\256\235\347\256\261.md"
index ca4d776..39e68f9 100644
--- "a/docs/creative/\351\241\266\347\272\247\347\250\213\345\272\217\345\221\230\347\232\204\347\231\276\345\256\235\347\256\261.md"
+++ "b/docs/creative/\351\241\266\347\272\247\347\250\213\345\272\217\345\221\230\347\232\204\347\231\276\345\256\235\347\256\261.md"
@@ -221,7 +221,7 @@
#### Devdocs
-- 官网地址:[http://asciiflow.com](http://asciiflow.com/)
+- 官网地址:[https://devdocs.io](https://devdocs.io)
> 上面那个的兄弟,但是这个不用下载,在线的
@@ -448,5 +448,3 @@
------
> 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。
-
-
\ No newline at end of file
diff --git a/docs/idea/idea.md b/docs/idea/idea.md
new file mode 100644
index 0000000..56673cf
--- /dev/null
+++ b/docs/idea/idea.md
@@ -0,0 +1,149 @@
+> 点赞再看,养成习惯,微信搜索【**三太子敖丙**】我所有文章都在这里,本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已收录,有一线大厂面试完整考点。
+
+昨天群里被的人文怎么破解,晚上洗完澡睡觉正准备睡觉的时候,米豆吵醒了我,说他的idea炸了。
+
+
+
+于是我让他搜我在公司写的破解文档,这个文档已经造福了很多同事了,我痛定思痛,觉得造福一下你们,但是我先说明,大家有能力的还是支持下正版,我只是觉得这个钱拿去洗脚香一点。
+
+## 开始破解
+
+今天破解的方法很简单,jar包破解的,先下载Jar包。
+
+
+
+ 破解包使用方法:
+
+ 0. 先下载压缩包解压后得到jetbrains-agent.jar,把它放到你认为合适的文件夹内。
+
+ 公众号回复【**idea**】获取网盘链接。
+
+ 1. 启动你的IDE,如果上来就需要注册,选择:试用(Evaluate for free)进入IDE
+
+ 2. 点击你要注册的IDE菜单:"Configure" 或 "Help" -> "Edit Custom VM Options ..."
+ 如果提示是否要创建文件,请点"Yes"。
+
+ 3. 在打开的vmoptions编辑窗口末行添加:-javaagent:/absolute/path/to/jetbrains-agent.jar
+ 一定要自己确认好路径(不要使用中文路径),**填错会导致IDE打不开**!!!最好使用绝对路径。
+ 一个vmoptions内只能有一个-javaagent参数。
+
+ 4. 示例:
+ mac: -javaagent:/Users/neo/jetbrains-agent.jar
+ linux: -javaagent:/home/neo/jetbrains-agent.jar
+ windows: -javaagent:C:\Users\neo\jetbrains-agent.jar
+
+ **注**:如果还是填错了,我帮你找到了目录:
+
+ ### Windows
+
+ All the files are located under this directory by default:
+
+ - **Windows Vista, 7, 8, 10:**
+
+ ```
+ \Users\\.
+ ```
+
+ - **Windows XP:**
+
+ ```
+ \Documents and Settings\\.
+ ```
+
+ ### Mac OS X
+
+ - **Configuration (idea.config.path):**
+
+ ```
+ ~/Library/Preferences/
+ ```
+
+ - **Caches (idea.system.path):**
+
+ ```
+ ~/Library/Caches/
+ ```
+
+ - **Plugins (idea.plugins.path):**
+
+ ```
+ ~/Library/Application Support/
+ ```
+
+ - **Logs (idea.log.path):**
+
+ ```
+ ~/Library/Logs/
+ ```
+
+ 找到对应的系统idea安装目录,我的是mac,直接去这个目录 ~/Library/Preferences/
+
+ 
+
+ 进去就能直接看到那个idea.vmoptions然后简单,vim打开输入正确的地址就好了
+
+ **暖男提示**:一定要写对,有的路径你看着是对的,有的有空格啥的,三歪就是这样,告诉我路径没错,结果有空格,写错是启动不了的。
+
+ 5. 重启你的IDE。
+
+ 6. 点击IDE菜单 "Help" -> "Register..." 或 "Configure" -> "Manage License..."
+ 支持两种注册方式:License server 和 Activation code:
+ 1). 选择License server方式,地址填入:http://jetbrains-license-server (应该会自动填上)
+ 或者点击按钮:"Discover Server"来自动填充地址。
+ 2). 选择**Activation code**方式**离线**激活,请使用:ACTIVATION_CODE.txt 内的注册码激活
+ 如果激活窗口一直弹出(error 1653219),请去hosts文件里移除jetbrains相关的项目
+ 如果你需要自定义License name,请访问:https://zhile.io/custom-license.html
+
+ **注意**:第一种方法偶尔会失效,你用第二种一样的,记得一定要**离线**
+
+ 本项目在最新2019.3上测试通过。
+
+ IDE升级会从旧版本导入以上设置,导入配置后可能提示未注册(因为刚导入的vmoptions未生效),直接重启IDE即可,无需其他操作。
+
+## 知识产权说明
+
+中美达成初步“经贸协定”,我国将对知识产权立法更加的严格。
+
+在民事诉讼中,知识产权侵权将由原先的“谁主张谁举证”改为“举证责任倒置”,由被告提供自己不构成侵权的证据。
+
+在刑事责任中,原先知识产权犯罪为结果犯,造成损失才够罪,经贸协定会让知识产权犯罪变为行为犯,只要有违法行为就可能够罪。
+
+行政上,对于销售假冒商品和盗版商品的电子平台,会被吊销经营许可证。
+
+## 警告
+
+ 本项目只做学习研究之用,不得用于商业用途!
+
+ 若资金允许,请点击 [https://www.jetbrains.com/idea/buy/] 购买正版,谢谢合作!
+
+ 学生凭学生证可免费申请 [https://sales.jetbrains.com/hc/zh-cn/articles/207154369-学生授权申请方式] 正版授权!
+
+ 创业公司可5折购买 [https://www.jetbrains.com/shop/eform/startup] 正版授权!
+
+开源项目也可以去官网申请一年的免费使用,到期续费就好了,我就是用的这个:
+
+
+
+暖不暖你说了算,我们下篇文章见:目测是索引,我还用了新的GIF动图方式,以后可能搭配视频。
+
+放个图预告下:
+
+
+
+
+
+持续更新,未完待续......
+
+**白嫖不好,创作不易,**各位的支持和认可(**求点赞**),就是我创作的最大动力,我们下篇文章见!
+
+敖丙 | 文 【原创】
+
+如果本篇博客有任何错误,请批评指教,不胜感激 !
+
+------
+
+> 文章每周持续更新,可以微信搜索「 **三太子敖丙** 」第一时间阅读和催更(比博客早一到两篇哟),本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已经收录,有一线大厂面试完整考点,欢迎Star和完善,我们一起有点东西。
+
+
+
+你知道的越多,你不知道的越多
\ No newline at end of file
diff --git "a/docs/idea/\347\224\265\345\255\220\344\271\246.md" "b/docs/idea/\347\224\265\345\255\220\344\271\246.md"
new file mode 100644
index 0000000..95eb87f
--- /dev/null
+++ "b/docs/idea/\347\224\265\345\255\220\344\271\246.md"
@@ -0,0 +1,285 @@
+计算机类的书籍那么贵,作为一个几个小时看完一本书且机不离身的程序员,天天买纸质书是不可能的了,所以对电子书的需求量还是挺多的。为了方便广大的小伙伴也能方便找到对应的电子书,我花费洪荒之力收集了几百本常用的电子书,并且为了解决百度云链接容易失效的问题,我把电子书全部下载打包上传,都有哪些电子书呢?请往下看。
+
+
+> **重要说明**:**如果目录无法跳转的话,直接拉下去就可以了**,这些书籍都是在同一个页面的,我只是方便大家找到对应的,弄了一个**页内目录**,不过有部分读者反馈他跳转不了(手机是绝对跳转不了的了)。
+
+
+
+- [数据结构与算法相关书籍](#数据结构与算法相关书籍)
+- [计算机基础](#计算机基础)
+ - [操作系统](#操作系统)
+ - [汇编语言](#汇编语言)
+ - [计算机网络](#计算机网络)
+ - [计算机组成原理](#计算机组成原理)
+- [Python](#python)
+ - [1、Python基础](#1python基础)
+ - [2、数据分析与爬虫](#2数据分析与爬虫)
+- [Linux](#linux)
+- [C语言](#c语言)
+- [C ](#c)
+- [前端](#前端)
+- [人工智能](#人工智能)
+- [设计模式](#设计模式)
+- [Java](#java)
+ - [Java 基础](#java-基础)
+ - [Java进阶](#java进阶)
+ - [JavaWeb](#javaweb)
+- [数据库](#数据库)
+- [Go](#go)
+- [中间件](#中间件)
+- [面试相关](#面试相关)
+- [未分类书籍](#未分类书籍)
+- [Git](#git)
+- [没找到请看这里](#没找到请看这里)
+- [免责声明](#免责声明)
+
+
+
+# 数据结构与算法相关书籍
+
+- 挑战程序设计竞赛 [百度云下载链接](https://pan.baidu.com/s/1diObrFpHKm4r-XyTp4cGAQ) 密码:mxn7
+- Java数据结构和算法 [百度云下载链接](https://pan.baidu.com/s/1vD9CQVwnWMfqSaEmn8Dudw ) 密码:lpym
+- 算法图解 [百度云下载链接](https://pan.baidu.com/s/1NFiwO-_Kzt-VxXxxteRCTA) 密码:7osf
+- 算法导论 [百度云下载链接](https://pan.baidu.com/s/1WHmnchIdy0FvMWLImPoIhQ) 密码:p2tp
+- 算法第四版 [百度云下载链接](https://pan.baidu.com/s/1WEliUJ_hQhl-OzWPtXcFdQ) 密码:rixw
+- 数据结构与算法分析C语言描述版 [百度云下载链接](https://pan.baidu.com/s/1v4OsTTCd5SyC4WGarHZdcA) 密码:mn10
+- 数据结构与算法分析Java语言描述版 [百度云下载链接](https://pan.baidu.com/s/1hZGhkErn9Bc17ZnN_ilgAw) 密码:917n
+- 数据结构与算法 Python语言描述_裘宗燕 [百度云下载链接](https://pan.baidu.com/s/1VjlQugLPIiN91bmISkJ3xg) 密码:96gw
+- 剑指offer [百度云下载链接](https://pan.baidu.com/s/1lUs2fVqxNMK8OOUrVSBCmw) 密码:a4rt
+- 计算机程序设计艺术1-3卷 [百度云下载链接](https://pan.baidu.com/s/1rxEqkKAogFpy1aNQnXUyBw) 密码:i3nh
+- 大话数据结构 [百度云下载链接](https://pan.baidu.com/s/1fTxelwIZa8pBmdnMW8PFYg) 密码:np2o
+- 程序员代码面试指南:IT 名企算法与数据结构题目最优解 [百度云下载链接](https://pan.baidu.com/s/1DhjBLEiORLRTiffpJnJq_g) 密码:20oh
+- 编程珠玑 [百度云下载链接](https://pan.baidu.com/s/1ix17W5-CG4r5Wn8bF3erVQ) 密码:4oow
+- 编程之美 [百度云下载链接](https://pan.baidu.com/s/1y8SWiLipsKEzCulyxdbgGQ) 密码:4zme
+- 啊哈算法 [百度云下载链接](https://pan.baidu.com/s/1S6OTJlQtywaRvu4IA_ogCw) 密码:h4id
+- 程序员的算法趣题 [百度云下载链接](https://pan.baidu.com/s/1iIHm0kRlfwck3IQn-BUZZA) 密码:kk84
+
+# 计算机基础
+
+### 操作系统
+
+- 30天填自制操作系统 [百度云下载链接](https://pan.baidu.com/s/1QSIUlat1HpllNFMWY9WBzw) 密码:pxxr
+- 操作系统之哲学原理 [百度云下载链接](https://pan.baidu.com/s/1GEfALJhtJ2IJtjtKcLneKg) 密码:hua7
+- 程序是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1i_xDxT8QgA_x4kRHXEmPqg) 密码:pbvh
+- 深入理解计算机操作系统 [百度云下载链接](https://pan.baidu.com/s/1xrDC6wGAH7Yv3uuXzVUWxg) 密码:2toh
+- 现代操作系统 [百度云下载链接](https://pan.baidu.com/s/1QA0VZ20pA8giW6ax7AHQBA) 密码:huk2
+
+
+
+### 汇编语言
+
+- 汇编语言(注:这边是王爽写的,我觉得写的很好,适合入门) [百度云下载链接](https://pan.baidu.com/s/1kZLH0dW6Y37S-WCLNV309A) 密码:qea3
+
+### 计算机网络
+
+- 计算机网络:自顶向下 [百度云下载链接](https://pan.baidu.com/s/18X_L2RINmtLK9g0Ki2GiFw) 密码:l77d
+- 图解HTTP [百度云下载链接](https://pan.baidu.com/s/1NEAK2PH_4JzPY454QvmmsQ) 密码:b42z
+- 图解TC/IP [百度云下载链接](https://pan.baidu.com/s/1FJru4ppyxBhx_J3pk8rpvA) 密码:5k3x
+- 网络是怎样连接的 [百度云下载链接](https://pan.baidu.com/s/1HhE9MoC4rp5NSvyWOtk_hw) 密码:g983
+- HTTP权威指南 [百度云下载链接](https://pan.baidu.com/s/1b2fIsmdt9ANVMcqU97t6kw) 密码:tqj8
+- UNIX网络编程 [百度云下载链接](https://pan.baidu.com/s/1vXbj7OLsouVFH4DCIMqF3w) 密码:4buy
+
+### 计算机组成原理
+
+- 隐匿在计算机软硬件背后的语言 [百度云下载链接](https://pan.baidu.com/s/1gJCnChBTCZD07mm3IqCRwQ) 密码:6jiq
+- 大话计算机 [百度云下载链接](https://pan.baidu.com/s/1AakpZmD8hziokFnV0VSGFA) 密码:6j1o
+- 计算机是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1JIq3U8kNYohz0C3xnCk6EA) 密码:er12
+
+
+
+
+
+# Python
+
+### 1、Python基础
+
+- 编程小白的第一本Python入门书 [百度云下载链接](https://pan.baidu.com/s/128kxkHLrEAidlMt0E80SUg) 密码:s76b
+- Python编程初学者指南 [百度云下载链接](https://pan.baidu.com/s/1ytNZt1VMlbyREyc1L7ShYA) 密码:g696
+- Python高级编程 [百度云下载链接](https://pan.baidu.com/s/1-ItrNDj2R9Z-S1ZuEMlf1Q) 密码:qnuf
+- Python高性能编程 [百度云下载链接](https://pan.baidu.com/s/10wPoXPM83so2WvdlVnPZTw) 密码:d8s5
+- Python灰帽子 [百度云下载链接](https://pan.baidu.com/s/17hvNff7O5OsdRAB3_mBBcg) 密码:nfkt
+- Python开发技术详解 [百度云下载链接](https://pan.baidu.com/s/1cTVhr9BEmy79GbKq41qQ5A) 密码:z0av
+- Python开发实战 [百度云下载链接](https://pan.baidu.com/s/1AFgXTjEQyBf6SP2CCniA1A) 密码:ee5x
+- Python网络编程基础 [百度云下载链接](https://pan.baidu.com/s/1qBpXTD3Ll6p2KAv0RAkKHQ) 密码:m15q
+- Python学习手册 [百度云下载链接](https://pan.baidu.com/s/18DsRhIawELjVGGDSTRvhYA) 密码:0yqf
+- 精通Scrapy网络爬虫
+
+### 2、数据分析与爬虫
+
+- 数据科学入门 [百度云下载链接](https://pan.baidu.com/s/1LBUGeGdjUNhCUUOZRpgbrg) 密码:1hz8
+- 用Python写网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1ENi8Y4vAMqSQviPYNRBMUA) 密码:nlpa
+- Python数据处理 [百度云下载链接](https://pan.baidu.com/s/1UOOC1APb6fueaxDyyshMuQ) 密码:8eom
+- Python数据分析实战 [百度云下载链接](https://pan.baidu.com/s/13yQ4hvUf4EzgGAuKQUM4ag) 密码:idn1
+- Python数据科学手册 [百度云下载链接](https://pan.baidu.com/s/1Y1KnyILg-0ZWJbIKNzNsmw) 密码:16u0
+- Python数据可视化编程实战 [百度云下载链接](https://pan.baidu.com/s/1BKIzCFI_5CzLXAQpRQCp8Q) 密码:i7hp
+- 精通Scrapy网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1FuAE8Kq3YItoO4yNba5ckA) 密码:jb6u
+
+# Linux
+
+- 精通正则表达式 [百度云下载链接](https://pan.baidu.com/s/1tt-S2QEye0qZde_3SiG1Eg) 密码:vp94
+- 鸟哥的Linux私房菜基础篇和服务器篇 [百度云下载链接](https://pan.baidu.com/s/1ZvTMk23dKPbQG7siYXyrbg) 密码:ubg2
+- 深入Linux内核架构 [百度云下载链接](https://pan.baidu.com/s/15Vyl69xGDY_RkpQPk5qCCQ) 密码:fnh2
+- Linux宝典 [百度云下载链接](https://pan.baidu.com/s/1cQX4jgG0-7fYFuR5F9G2_g) 密码:nxhe
+- Linux常用命令大全 [百度云下载链接](https://pan.baidu.com/s/1WH7DFOzL25mOHsp5orrWmQ) 密码:e0n2
+- Linux防火墙 [百度云下载链接](https://pan.baidu.com/s/1NTMCysm_btHNpek38rBMfg) 密码:sc4u
+- Linux高级程序设计 [百度云下载链接](https://pan.baidu.com/s/11y7OBER2c9mcbsCtjTRsrA) 密码:d4wq
+- Linux环境编程 [百度云下载链接](https://pan.baidu.com/s/1sl-6GF3onLPRXeJDVedwqA) 密码:xudv
+- Linux命令详解词典 [百度云下载链接](https://pan.baidu.com/s/1CSlkxcBRBPsHHRYOrQpfSw) 密码:yxuz
+- 汇编语言基于linux环境第3版 [百度云下载链接](https://pan.baidu.com/s/13gwNQvvG5fRYxo83zMb2VA) 密码:yq75
+
+# C语言
+
+- 经典C程序100例 [百度云下载链接](https://pan.baidu.com/s/1fJnp014zqOCdO8O6gzcDUw) 密码:tls2
+- C Primer Plus [百度云下载链接](https://pan.baidu.com/s/1SuVacfN0q-MGeKs6Z-O2LQ) 密码:5s85
+- C程序设计语言(包括课后答案等) [百度云下载链接](https://pan.baidu.com/s/1ICTaU2avonev25DfykAr-w) 密码:cfj4
+- C和指针 [百度云下载链接](https://pan.baidu.com/s/11zphu-XC2YS57BkkKjAtoQ) 密码:d8a0
+- C语言编程精粹 [百度云下载链接](https://pan.baidu.com/s/1_GmhiP3jL0cQR36uAiZNNw) 密码:6mct
+- C语言参考手册 [百度云下载链接](https://pan.baidu.com/s/1hzINX8yDELZ4WF1ALwDsYg) 密码:4hnx
+- C语言函数大全 [百度云下载链接](https://pan.baidu.com/s/1_kM7pd1J6K65X6oC38AviA) 密码:xywt
+- C语言解析教程 [百度云下载链接](https://pan.baidu.com/s/1Sm-CRO8DzhT7gCgxNJkKfw) 密码:6luf
+- C语言深度剖析 [百度云下载链接](https://pan.baidu.com/s/1Dn4csGs7xEdZt9smdBcmbQ) 密码:yu63
+- C专家编程 [百度云下载链接](https://pan.baidu.com/s/1y_Uz1SWi1NikG0D0URqv0w) 密码:xlfm
+
+# C++
+
+- C++ Primer [百度云下载链接](https://pan.baidu.com/s/1OvJd3JfxujySAs6Tqugl9g) 密码:js1a
+- C++编程思想 [百度云下载链接](https://pan.baidu.com/s/1p98_fU039F6Er3_CtnmIfQ) 密码:vi02
+- C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1JVnJwxbTXe6HIMDFXlYnbQ) 密码:v90k
+- 深入探索C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1NxvGvIBYpKNunjnu5ev_vw) 密码:3xuv
+- C++ Templates [百度云下载链接](https://pan.baidu.com/s/1bkQ-aPpFDc_osxqFC9I1Jw) 密码:4rvw
+- C++编程规范-101条规则准则与最佳实践 [百度云下载链接](https://pan.baidu.com/s/1PAfapM3g1YDNB2qpZlJnpg) 密码:t43e
+- C++沉思录中文第2版 [百度云下载链接](https://pan.baidu.com/s/1ckINRCEKKt3DJ9eg412EtA) 密码:6emr
+- C++大学教程 [百度云下载链接](https://pan.baidu.com/s/1OS5iWmRib0QvFOFaRMSpMw) 密码:n6ph
+- C++设计新思维-泛型编程与设计之应用 [百度云下载链接](https://pan.baidu.com/s/1zKojQCCfs0NPH_9ORpiBvA) 密码:0el5
+- Effective STL 中文版 [百度云下载链接](https://pan.baidu.com/s/1btF8iWfAXoEUo5A18SYaLw) 密码:u7s1
+- More Effective C++中文版 [百度云下载链接](https://pan.baidu.com/s/1I3uRE2s8n5OZRm_76a1Lag) 密码:xbxv
+- STL源码剖析 [百度云下载链接](https://pan.baidu.com/s/1DbnRAJgeAtmXo5tpuhc-rg) 密码:mxsh
+
+# 前端
+
+- 疯狂aJax讲义 [百度云下载链接](https://pan.baidu.com/s/1C1NdOCrYD6LULgbGtRp_Vw) 密码:pce0
+- Bootstrap实战 [百度云下载链接](https://pan.baidu.com/s/1ty1U6-XUDFqnjVS57IrZSA) 密码:rzhm
+- HTML5揭秘 [百度云下载链接](https://pan.baidu.com/s/138vuPiKZFIU0Zza80eui_g) 密码:vaam
+- HTML5与CSS3基础教程 [百度云下载链接](https://pan.baidu.com/s/1ddq73aQviPIM9ci6xhAt_g) 密码:2wxm
+- HTML与CSS入门经典 [百度云下载链接](https://pan.baidu.com/s/1fJaT9zqQOWxIB8Mkn_vQqQ) 密码:tsgm
+- JavaScript DOM编程艺术 [百度云下载链接](https://pan.baidu.com/s/1Dx3z3D9DYbWyebr3V86cLA) 密码:gsbt
+- JavaScript高级程序设计 [百度云下载链接](https://pan.baidu.com/s/1NYkMExeBSG1SBVfT7nUkWQ) 密码:wbw0
+- JavaScript高效图形编程 [百度云下载链接](https://pan.baidu.com/s/1jLPlJ1tpnF6LOkhhUgcF6w) 密码:tab1
+- jQuery高级编程 [百度云下载链接](https://pan.baidu.com/s/1XSvgFixfnm_9YxytuuSvLA) 密码:qwtr
+- jQuery技术内幕 [百度云下载链接](https://pan.baidu.com/s/11sUqBmGJWlHOB29WtZjf2A) 密码:pglf
+- jQuery权威指南 [百度云下载链接](https://pan.baidu.com/s/14Iu2h8BQ4oHXsyuKG9k-Qw) 密码:4vrw
+- Node.js开发指南 [百度云下载链接](https://pan.baidu.com/s/1cSoqtNHTrmoovTNy7VonqA) 密码:voze
+
+# 人工智能
+
+- 贝叶斯思维统计建模的Python学习法 [百度云下载链接](https://pan.baidu.com/s/1GX6Uqzh8-AzMv0UjO2Ed2A) 密码:ztbe
+- 机器学习实战 [百度云下载链接](https://pan.baidu.com/s/1ZDcgp1ht4XZPYH5Wy3I1KQ) 密码:cfqc
+- Python机器学习及实践 [百度云下载链接](https://pan.baidu.com/s/1IIUCLptUPsQvLRbUEqJaTA) 密码:qq3q
+- Tensorflow实战Google深度学习框架 [百度云下载链接](https://pan.baidu.com/s/1CJIJmNvZHx2rtkUDH-zrIg) 密码:12kj
+- TensorFlow实践与智能系统 [百度云下载链接](https://pan.baidu.com/s/1EYFAmV8z9hvTX06Hwf1MsA) 密码:e668
+- 深度学习_中文版 [百度云下载链接](https://pan.baidu.com/s/1FH9vlBBBb-yvB26eFmKjQw) 密码:01xp
+
+# 设计模式
+
+- 图解设计模式 [百度云下载链接](https://pan.baidu.com/s/16Lss7o-zu0_HNio6od4c0Q) 密码:g50a
+- 研磨设计模式 [百度云下载链接](https://pan.baidu.com/s/1a5EPImWzDfPGg1DQ4F7EkA) 密码:h5fb
+- Head First设计模式 [百度云下载链接](https://pan.baidu.com/s/1-rMyG6AuRHrzFF-dOiaBDw) 密码:pxpq
+
+# Java
+
+### Java 基础
+
+- 阿里巴巴Java开发手册 [百度云下载链接](https://pan.baidu.com/s/1SoqPq0-x9aZPEaCiggVtUA) 密码:g6lv
+- 码出高效 [百度云下载链接](https://pan.baidu.com/s/1ejmKaxyd2ACKbV3lj9Vyvg) 密码:mbt9
+- Head First Java [百度云下载链接](https://pan.baidu.com/s/1AhFSveV6DE3nWMpBUhFcMw) 密码:d5ll
+- Java8实战 [百度云下载链接](https://pan.baidu.com/s/1ni-dF2XqmMFwI5pBPo3P2A) 密码:lvmb
+- Java编程思想 [百度云下载链接](https://pan.baidu.com/s/1cqF8lcDdMoV3g2OLxQCUKg) 密码:0add
+- Java并发编程的艺术 [百度云下载链接](https://pan.baidu.com/s/1N3aSnY8rZxQLTbnUwIk5yQ) 密码:vn74
+- Java并发编程实践 [百度云下载链接](https://pan.baidu.com/s/1Bk47A0tLXUv1wVQjJlxd6Q) 密码:i6w9
+- Java从小白到大牛 [百度云下载链接](https://pan.baidu.com/s/1qDLSzWrkSVu91KcrBN5fKQ) 密码:9auc
+- Java核心技术1-2卷 [百度云下载链接](https://pan.baidu.com/s/1t9YFSagCpVC7N4pK6aNuGQ) 密码:tr3s
+- 深入理解Java虚拟机 [百度云下载链接](https://pan.baidu.com/s/1qyRd-YANK1Czs51k1tWYWQ) 密码:b6op
+
+### Java进阶
+
+- 代码大全 [百度云下载链接](https://pan.baidu.com/s/1ehGZsgt-Rl47pVnNGUKWWw) 密码:juhq
+- 代码整洁之道 [百度云下载链接](https://pan.baidu.com/s/1fQf91LpvIWeJ-HH2QWKVog) 密码:hzn2
+- 敏捷软件开发 [百度云下载链接](https://pan.baidu.com/s/1HveePOP4fOynad9yrHKS_A) 密码:mmi4
+- Effective Java(中文) [百度云下载链接](https://pan.baidu.com/s/1jvaEtd4H-ELdjY-I2uV76A) 密码:4dcx
+- Effective Java(英文) [百度云下载链接](https://pan.baidu.com/s/1FOVL661If9yaJSjTpMw22g) 密码:bhu4
+- Java性能优化权威指南 [百度云下载链接](https://pan.baidu.com/s/1XCOWv6W5_rsCUM6Q4YIU9Q) 密码:054x
+
+### JavaWeb
+
+- 轻量级JavaEE企业应用实战 [百度云下载链接](https://pan.baidu.com/s/1EjBGj1z6sJ4kDokUZRG2IA) 密码:8j3c
+- 深入分析JavaWeb技术内幕 [百度云下载链接](https://pan.baidu.com/s/15Q_ZJZyOtm5gYhhp_D0OFA) 密码:31uu
+- 深入剖析Tomcat [百度云下载链接](https://pan.baidu.com/s/1YQXpaveUeRXxid1BdU-nUw) 密码:y1yt
+- Head First Servlet and JSP [百度云下载链接](https://pan.baidu.com/s/1036AnuSKhckNC_vqa5qjPw) 密码:v8b8
+- Maven实战 [百度云下载链接](https://pan.baidu.com/s/15DddRDQpR_KAOzg-HuuDvw) 密码:s0q9
+- Spring实战 [百度云下载链接](https://pan.baidu.com/s/1Y9J20oR38qVyQ4Z7Kh9KQw) 密码:40fb
+- Camel in Action [百度云下载链接](https://pan.baidu.com/s/1300e_-sgpqAzl_2H1EPlJA) 密码:plyn
+
+# 数据库
+
+- 高性能MySQL [百度云下载链接](https://pan.baidu.com/s/1_vXaan9KbIWAHEnyQnQFlg) 密码:gh5t
+- 深入浅出MySQL [百度云下载链接](https://pan.baidu.com/s/1gWJcwszv3CnjIRMzy--_rw) 密码:ju0h
+- MongoDB权威指南 [百度云下载链接](https://pan.baidu.com/s/1LO1ACpRDi7n0i9Q7nLooqg) 密码:llvx
+- MySQL必知必会 [百度云下载链接](https://pan.baidu.com/s/1IWeqx7IQGc0sY5bJ9WtyMA) 密码:f1v9
+- MySQL技术内幕InnoDB存储引擎 [百度云下载链接](https://pan.baidu.com/s/1fLL3GXn_Hp6DdEnHXcBFJQ) 密码:6g04)
+- SQL查询的艺术 [百度云下载链接](https://pan.baidu.com/s/1PfE3oLfmQN8Xtdj-08L--A) 密码:ndcv
+- SQLite 权威指南 [百度云下载链接](https://pan.baidu.com/s/1BqFp4W_I0Wwn87fKrCpB8A) 密码:ex3h
+
+# Go
+
+- 学习Go语言 [百度云下载链接](https://pan.baidu.com/s/1tNJJ-UNBk7nsZuxILFAy7w) 密码:5tri
+- Go语言实战 [百度云下载链接](https://pan.baidu.com/s/1BIGNOG3AfFAVrBnHeemPlQ) 密码:q0x3
+- Go web编程 [百度云下载链接](https://pan.baidu.com/s/1UQU7uWFSZb3ILob6b64ZeA) 密码:pyw3
+- C 程序设计语言第2版 [百度云下载链接](https://pan.baidu.com/s/14NmKpWeBQ-vg6XzyvXTaeg) 密码:3yza
+
+
+
+# 中间件
+
+* redis实战 [百度云下载链接](https://pan.baidu.com/s/13Y-Uk2HmV1Y5TLec4J20aQ) 密码:ro48
+
+
+
+# 面试相关
+
+- 阿里巴巴Java面试问题大全 [百度云下载链接](https://pan.baidu.com/s/1tbd8N88ae-O0xsm6RTJIag) 密码:8xzm
+- 程序员面试宝典 [百度云下载链接](https://pan.baidu.com/s/1LilCd-QIcVgZ1uQyFWMaWw) 密码:ko62
+- 大厂面试真题 [百度云下载链接](https://pan.baidu.com/s/1631WVa3Fhf2wOpdZX_ou2g) 密码:gu92
+- Java面试突击 [百度云下载链接](https://pan.baidu.com/s/1bAZS8KiUNF0lOt-R0UBOyg) 密码:h44t
+
+# 未分类书籍
+
+- 黑客与画家 [百度云下载链接](https://pan.baidu.com/s/1lEyXNK8W4a0vStIPHOihiA) 密码:uux2
+- 浪潮之巅 [百度云下载链接](https://pan.baidu.com/s/1NIeoGRy6s1lYB3WdlhA8lQ) 密码:xr66
+- 码农翻身 [百度云下载链接](https://pan.baidu.com/s/1zEmECfVe4rFRsQL8goN4nA) 密码:x0ik
+- 奔跑吧,程序员:从零开始打造产品、技术和团队 [百度云下载链接](https://pan.baidu.com/s/1O0QkDLuJMasimr9XZsNSmA) 密码:jxvj
+
+# Git
+
+- 快速入门Git [百度云下载链接](https://pan.baidu.com/s/1ka8s2-1h24LLX5ebeeU6WA) 密码:ofdd
+- 专业git中文 [百度云下载链接](https://pan.baidu.com/s/1pvgoGleexrvdMhnTgd0VYw) 密码:b3kx
+- Git参考手册 [百度云下载链接](https://pan.baidu.com/s/1DC8S-wnLrpanW2HRROizMQ) 密码:axou
+- 《Pro Git》中文版 [百度云下载链接](https://pan.baidu.com/s/1TLHL03vKY5gLs1tOjN5KeA) 密码:l05a
+
+
+
+# 没找到请看这里
+
+别急,我会慢慢更新完善的,可能只是暂时没有而已,,,欢迎持续关注哦
+
+
+
+
+# 免责声明
+
+书籍全部来源于网络其他人的整理,我这里只是收集整理了他们的链接,如有侵权,马上联系我,我立马删除对应链接。我的邮箱:aobing@mogu.com
+
+
+
+
+
+
diff --git "a/docs/idea/\347\237\245\350\257\206\346\230\237\347\220\203.md" "b/docs/idea/\347\237\245\350\257\206\346\230\237\347\220\203.md"
new file mode 100644
index 0000000..f9e9e89
--- /dev/null
+++ "b/docs/idea/\347\237\245\350\257\206\346\230\237\347\220\203.md"
@@ -0,0 +1,46 @@
+
+我现在微信群已经超过15个了,我开始上班了,平时太忙了大家@我我基本上会选择忽略,因此我建立了知识星球,我会在里面个人经历、分享经验、技术理财,职业规划都会涉及。
+
+有问题也可以在里面问,不敢保证及时回,但是周末或者晚上10点以后看到都会回(**大概率周末**)。
+
+建知识星球的目的主要是做知识沉淀,和问题解答,我经常在知乎上看到私我的,有时候实在会疏忽。
+
+为此,丙丙创建了这个收费最低的知识星球。
+
+先给大家看看长啥样:
+
+昨天创建的,已经加入了快1400个小伙伴了,也有小伙伴已经开始提问了。
+
+
+
+可能大家也觉得我自己这个星球没啥说服力,所以我邀请了不少重量级别的嘉宾。
+
+
+
+总的来说,加入到这个星球,你将获得:
+
+- 面试以及核心知识分享;
+
+- 学习/工作的常见问题回答和整理,问题答疑,职场问题答疑。
+
+- 分享各种不错的开源项目和工具;
+
+- 简历指导,以及大厂内推机会;
+
+- 个人经历分享;
+- ..........
+
+我希望所有人都像南橘一样,面进阿里,也可以主动问我很多问题:
+
+
+
+因为这是一个互补的过程,问到我不会的也给我扫盲了,或者像我另外一个读者一样,进蘑菇街跟我做同事。
+
+说真的,我这个人技术不咋样,面试还是有一套的哈哈,能帮大家就帮大家一下,
+
+
+
+这是优惠码,-32,还是比较便宜的,办的好,以后可是要涨价的哈哈,有问题随时提,大家有空的可以回答,我看到基本上都会解答一下。
+
+
+
diff --git "a/docs/idea/\350\265\204\346\226\231.md" "b/docs/idea/\350\265\204\346\226\231.md"
new file mode 100644
index 0000000..8b3a7f4
--- /dev/null
+++ "b/docs/idea/\350\265\204\346\226\231.md"
@@ -0,0 +1,39 @@
+## 这是我准备的一些面试资料(也欢迎大家贡献)
+
+#### 我会定期更新 星球提供模拟面试和简历修改服务 **[【点击了解详细 领取减32的优惠券】](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E7%9F%A5%E8%AF%86%E6%98%9F%E7%90%83.md)**
+
+学习路线对应文章: https://www.bilibili.com/read/cv5006822
+
+简历模板 链接: https://pan.baidu.com/s/1n-K9CKs_MAlfIIyIFyu7ng 密码:moxs
+
+概要设计模板: https://pan.baidu.com/s/1X7QUT9c7bHMEgQ4vjI9O8A 密码:3fli
+
+电子书 : 链接:https://pan.baidu.com/s/1PKO0LDspwJPNqT6qwqNorQ 密码:f654
+
+Java高级架构体系资料: https://pan.baidu.com/s/1B83Kvb9n2LTgKSmSvbt_Aw 提取码: msba
+
+天猫购物车商场项目:https://pan.baidu.com/s/1YAE6rkDw2GCXucEiAXCedw 密码:fpda
+
+Java8新特性:https://pan.baidu.com/s/1pmiGW5KcuZnzh7DuUpwPzg 密码:5mz4
+
+MySQL:链接:https://pan.baidu.com/s/1GvvsGzB1grjzpM9NQFZ9FQ 密码:aftw
+
+2019牛客网上面试题库java篇(附带解析与答案):https://pan.baidu.com/s/1HBRXiVl0w97EOr_WpRrd-w 密码:71hn
+
+面试知识点Xmind: 链接:https://pan.baidu.com/s/13g1_P9t-SWZtsbtYDiubGQ 密码:0j2g
+
+毕向东Java基础教程(适合初学者入门的Java基础视频)http://pan.baidu.com/s/1nvODtSP 密码:h52i
+
+Java快速入门教程(Java基础班全套教程)链接:https://pan.baidu.com/s/1o9yLBsu 密码:wwd0
+
+JavaWeb教程_JavaWeb入门教程 资料:http://pan.baidu.com/s/1bp02SFX 密码:2xfl
+
+Java教程|Mybatis由浅入深教程 资料:https://pan.baidu.com/s/1pKFaqTH 密码:w00x
+
+Maven教程_Maven视频教程 资料资料:http://pan.baidu.com/s/1kVsl04v 密码:j5h0
+
+大数据hadoop教程入门 资料链接:https://pan.baidu.com/s/1smCTwRj 密码:vp5v
+
+学习路线
+
+
diff --git a/docs/mq/RocketMQ.md b/docs/mq/RocketMQ.md
deleted file mode 100644
index fe56e66..0000000
--- a/docs/mq/RocketMQ.md
+++ /dev/null
@@ -1,546 +0,0 @@
->
->
-> 你知道的越多,你不知道的越多
-
-> 点赞再看,养成习惯
-
-> 本文**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已收录,有一线大厂面试点脑图、个人联系方式和技术交流群,欢迎Star和指教
-
-## 前言
-
-**消息队列**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**消息队列**的使用和原理方面对小伙伴们进行360°的刁难。
-
-作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。
-
-于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!
-
-## 捞一下
-
-消息队列系列前面两章分别讲了**消息队列**的基础知识,还有比较常见的问题和常见分布式事务解决方案,那么在实际开发过程中,我们使用频率比较高的消息队列中间件有哪些呢?
-
-帅丙我工作以来接触的消息队列中间件有**RocketMQ**、**Kafka**、**自研**,是的因为我主要接触的都是电商公司,相对而言业务体量还有场景来说都是他们比较适合,再加上杭州阿里系公司偏多,身边同事或者公司老大基本都是阿里出来创业的,那在使用技术栈的时候**阿里系的开源框架**也就成了首选。
-
-就算是自研的中间件多多少少也是借鉴RocketMQ、Kafka的优点自研的,那我后面两章就分别简单的介绍下两者,他们分别在业务场景和大数据领域各自发光发热。
-
-那到底是道德的沦丧,还是人性的泯灭,让我们跟着敖丙走进RocketMQ的内心世界。
-
-## 正文
-
-### RocketMQ简介
-
-> RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件,前身是MetaQ,是阿里参考Kafka特点研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。
-
-
-
-我们再看下阿里给他取的名字哈:**Rocket** 火箭 阿里这是希望他上天呀,不过我觉得这个名字确实挺酷的。
-
-### 我们先看看他最新的官网
-
-
-
-### 回顾一下他的心路历程
-
-**2007年**:淘宝实施了“五彩石”项目,“五彩石”用于将交易系统从单机变成分布式,也是在这个过程中产生了阿里巴巴第一代消息引擎——Notify。
-
-**2010年**:阿里巴巴B2B部门基于ActiveMQ的5.1版本也开发了自己的一款消息引擎,称为Napoli,这款消息引擎在B2B里面广泛地被使用,不仅仅是在交易领域,在很多的后台异步解耦等方面也得到了广泛的应用。
-
-**2011年**:业界出现了现在被很多大数据领域所推崇的Kafka消息引擎,阿里巴巴在研究了Kafka的整体机制和架构设计之后,基于Kafka的设计使用Java进行了完全重写并推出了**MetaQ 1.0**版本,主要是用于解决顺序消息和海量堆积的问题。
-
-**2012年**:阿里巴巴开源其自研的第三代分布式消息中间件——**RocketMQ**。
-
-经过几年的技术打磨,阿里称基于RocketMQ技术,目前双十一当天消息容量可达到万亿级。
-
-**2016年11月**:阿里将RocketMQ捐献给**Apache**软件基金会,正式成为孵化项目。
-
-阿里称会将其打造成顶级项目。**这是阿里迈出的一大步**,因为加入到开源软件基金会需要经过评审方的考核与观察。
-
-坦率而言,业界还对国人的代码开源参与度仍保持着刻板印象;而Apache基金会中的342个项目中,暂时还只有Kylin、CarbonData、Eagle 、Dubbo和 RocketMQ 共计五个中国技术人主导的项目。
-
-**2017年2月20日**:RocketMQ正式发布4.0版本,专家称新版本适用于电商领域,金融领域,大数据领域,兼有物联网领域的编程模型。
-
-以上就是RocketMQ的整体发展历史,其实在阿里巴巴内部围绕着RocketMQ内核打造了三款产品,分别是**MetaQ**、**Notify**和**Aliware MQ**。
-
-这三者分别采用了不同的模型,**MetaQ**主要使用了拉模型,解决了顺序消息和海量堆积问题;**Notify**主要使用了推模型,解决了事务消息;而云产品**Aliware MQ**则是提供了商业化的版本。
-
-### 经历多次双11洗礼的英雄
-
- 在备战2016年双十一时,**RocketMq**团队重点做了**两件事情**,优化慢请求与统一存储引擎。
-
-- **优化慢请求**:这里主要是解决在海量高并发场景下降低慢请求对整个集群带来的抖动,**毛刺问题**。这是一个极具挑战的技术活,团队同学经过长达1个多月的跟进调优,从双十一的复盘情况来看,99.996%的延迟落在了10ms以内,**而99.6%的延迟在1ms以内**。优化主要集中在**RocketMQ**存储层算法优化、JVM与操作系统调优。更多的细节大家可以参考《万亿级数据洪峰下的分布式消息引擎》。
-- **统一存储引擎**:主要解决的消息引擎的高可用,成本问题。在多代消息引擎共存的前提下,我们对Notify的存储模块进行了全面移植与替换。
-
-**RocketMQ天生为金融互联网领域而生**,追求高可靠、高可用、高并发、低延迟,是一个阿里巴巴由内而外成功孕育的典范,除了阿里集团上千个应用外,根据我们不完全统计,国内至少有上百家单位、科研教育机构在使用。
-
-**RocketMQ**在阿里集团也被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,**binglog**分发等场景。
-
-### 他所拥有的功能
-
-我们直接去**GitHub**上看**Apache**对他的描述可能会好点
-
-
-
-是的功能完整到爆炸基本上开发完全够用,什么?看不懂专业词汇的英文?
-
-帅丙是暖男来的嘛,中文功能如下 ↓
-
-- 发布/订阅消息传递模型
-- 财务级交易消息
-- 各种跨语言客户端,例如Java,C / C ++,Python,Go
-- 可插拔的传输协议,例如TCP,SSL,AIO
-- 内置的消息跟踪功能,还支持开放式跟踪
-- 多功能的大数据和流生态系统集成
-- 按时间或偏移量追溯消息
-- 可靠的FIFO和严格的有序消息传递在同一队列中
-- 高效的推拉消费模型
-- 单个队列中的百万级消息累积容量
-- 多种消息传递协议,例如JMS和OpenMessaging
-- 灵活的分布式横向扩展部署架构
-- 快如闪电的批量消息交换系统
-- 各种消息过滤器机制,例如SQL和Tag
-- 用于隔离测试和云隔离群集的Docker映像
-- 功能丰富的管理仪表板,用于配置,指标和监视
-- 认证与授权
-
-### 他的项目结构组成是怎么样子的?
-
-> GitHub地址:https://github.com/apache/rocketmq
-
-
-
-他的核心模块:
-
-- rocketmq-broker:接受生产者发来的消息并存储(通过调用rocketmq-store),消费者从这里取得消息
-- rocketmq-client:提供发送、接受消息的客户端API。
-- rocketmq-namesrv:NameServer,类似于Zookeeper,这里保存着消息的TopicName,队列等运行时的元信息。
-- rocketmq-common:通用的一些类,方法,数据结构等。
-- rocketmq-remoting:基于Netty4的client/server + fastjson序列化 + 自定义二进制协议。
-- rocketmq-store:消息、索引存储等。
-- rocketmq-filtersrv:消息过滤器Server,需要注意的是,要实现这种过滤,需要上传代码到MQ!(一般而言,我们利用Tag足以满足大部分的过滤需求,如果更灵活更复杂的过滤需求,可以考虑filtersrv组件)。
-- rocketmq-tools:命令行工具。
-
-### 他的架构组成,或者理解为为什么他这么快?这么强?这么厉害?
-
-他主要有四大核心组成部分:**NameServer**、**Broker**、**Producer**以及**Consumer**四部分。
-
-
-
-**Tip**:我们可以看到**RocketMQ**啥都是**集群**部署的,这是他**吞吐量大**,**高可用**的原因之一,集群的模式也很花哨,可以支持多master 模式、多master多slave异步复制模式、多 master多slave同步双写模式。
-
-而且这个模式好像Kafka啊!(我这里是废话,本身就是阿里基于Kafka的很多特性研发的)。
-
-### 分别介绍下各个集群组成部分吧
-
-### NameServer:
-
-> 主要负责对于源数据的管理,包括了对于**Topic**和路由信息的管理。
-
-**NameServer**是一个功能齐全的服务器,其角色类似Dubbo中的Zookeeper,但NameServer与Zookeeper相比更轻量。主要是因为每个NameServer节点互相之间是独立的,没有任何信息交互。
-
-**NameServer**压力不会太大,平时主要开销是在维持心跳和提供Topic-Broker的关系数据。
-
-但有一点需要注意,Broker向NameServer发心跳时, 会带上当前自己所负责的所有**Topic**信息,如果**Topic**个数太多(万级别),会导致一次心跳中,就Topic的数据就几十M,网络情况差的话, 网络传输失败,心跳失败,导致NameServer误认为Broker心跳失败。
-
-**NameServer** 被设计成几乎无状态的,可以横向扩展,节点之间相互之间无通信,通过部署多台机器来标记自己是一个伪集群。
-
-每个 Broker 在启动的时候会到 NameServer 注册,Producer 在发送消息前会根据 Topic 到 **NameServer** 获取到 Broker 的路由信息,Consumer 也会定时获取 Topic 的路由信息。
-
-所以从功能上看NameServer应该是和 ZooKeeper 差不多,据说 RocketMQ 的早期版本确实是使用的 ZooKeeper ,后来改为了自己实现的 NameServer 。
-
-我们看一下**Dubbo**中注册中心的角色,是不是真的一毛一样,师出同门相似点真的很多:
-
-
-
-### Producer
-
-> 消息生产者,负责产生消息,一般由业务系统负责产生消息。
-
-- **Producer**由用户进行分布式部署,消息由**Producer**通过多种负载均衡模式发送到**Broker**集群,发送低延时,支持快速失败。
-
-- **RocketMQ** 提供了三种方式发送消息:同步、异步和单向
-
- - **同步发送**:同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息,例如重要通知邮件、营销短信。
-
- - **异步发送**:异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包,一般用于可能链路耗时较长而对响应时间敏感的业务场景,例如用户视频上传后通知启动转码服务。
-
- - **单向发送**:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。
-
-### Broker
-
-> 消息中转角色,负责**存储消息**,转发消息。
-
-- **Broker**是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保持长连接及心跳,并会定时将**Topic**信息注册到NameServer,顺带一提底层的通信和连接都是**基于Netty实现**的。
-- **Broker**负责消息存储,以Topic为纬度支持轻量级的队列,单机可以支撑上万队列规模,支持消息推拉模型。
-- 官网上有数据显示:具有**上亿级消息堆积能力**,同时可**严格保证消息的有序性**。
-
-### Consumer
-
-> 消息消费者,负责消费消息,一般是后台系统负责异步消费。
-
-- **Consumer**也由用户部署,支持PUSH和PULL两种消费模式,支持**集群消费**和**广播消息**,提供**实时的消息订阅机制**。
-
- - **Pull**:拉取型消费者(Pull Consumer)主动从消息服务器拉取信息,只要批量拉取到消息,用户应用就会启动消费过程,所以 Pull 称为主动消费型。
-- **Push**:推送型消费者(Push Consumer)封装了消息的拉取、消费进度和其他的内部维护工作,将消息到达时执行的回调接口留给用户应用程序来实现。所以 Push 称为被动消费类型,但从实现上看还是从消息服务器中拉取消息,不同于 Pull 的是 Push 首先要注册消费监听器,当监听器处触发后才开始消费消息。
-
-**Tip**: **GItHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面经和面试考察点脑图,也有个人联系方式。
-
-### 消息领域模型
-
-
-
-#### Message
-
-**Message**(消息)就是要传输的信息。
-
-一条消息必须有一个主题(Topic),主题可以看做是你的信件要邮寄的地址。
-
-一条消息也可以拥有一个可选的标签(Tag)和额处的键值对,它们可以用于设置一个业务 Key 并在 Broker 上查找此消息以便在开发期间查找问题。
-
-#### Topic
-
-**Topic**(主题)可以看做消息的规类,它是消息的第一级类型。比如一个电商系统可以分为:交易消息、物流消息等,一条消息必须有一个 Topic 。
-
-**Topic** 与生产者和消费者的关系非常松散,一个 Topic 可以有0个、1个、多个生产者向其发送消息,一个生产者也可以同时向不同的 Topic 发送消息。
-
-一个 Topic 也可以被 0个、1个、多个消费者订阅。
-
-#### Tag
-
-**Tag**(标签)可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同 Topic 而不同的 **Tag** 来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,一条消息可以没有 **Tag** 。
-
-标签有助于保持您的代码干净和连贯,并且还可以为 **RocketMQ** 提供的查询系统提供帮助。
-
-#### Group
-
-分组,一个组可以订阅多个Topic。
-
-分为ProducerGroup,ConsumerGroup,代表某一类的生产者和消费者,一般来说同一个服务可以作为Group,同一个Group一般来说发送和消费的消息都是一样的
-
-#### Queue
-
- 在**Kafka**中叫Partition,每个Queue内部是有序的,在**RocketMQ**中分为读和写两种队列,一般来说读写队列数量一致,如果不一致就会出现很多问题。
-
-#### Message Queue
-
-**Message Queue**(消息队列),主题被划分为一个或多个子主题,即消息队列。
-
-一个 Topic 下可以设置多个消息队列,发送消息时执行该消息的 Topic ,RocketMQ 会轮询该 Topic 下的所有队列将消息发出去。
-
-消息的物理管理单位。一个Topic下可以有多个Queue,Queue的引入使得消息的存储可以分布式集群化,具有了水平扩展能力。
-
-#### Offset
-
-在**RocketMQ** 中,所有消息队列都是持久化,长度无限的数据结构,所谓长度无限是指队列中的每个存储单元都是定长,访问其中的存储单元使用Offset 来访问,Offset 为 java long 类型,64 位,理论上在 100年内不会溢出,所以认为是长度无限。
-
-也可以认为 Message Queue 是一个长度无限的数组,**Offset** 就是下标。
-
-#### 消息消费模式
-
-消息消费模式有两种:**Clustering**(集群消费)和**Broadcasting**(广播消费)。
-
-默认情况下就是集群消费,该模式下一个消费者集群共同消费一个主题的多个队列,一个队列只会被一个消费者消费,如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。
-
-而广播消费消息会发给消费者组中的每一个消费者进行消费。
-
-#### Message Order
-
-**Message Order**(消息顺序)有两种:**Orderly**(顺序消费)和**Concurrently**(并行消费)。
-
-顺序消费表示消息消费的顺序同生产者为每个消息队列发送的顺序一致,所以如果正在处理全局顺序是强制性的场景,需要确保使用的主题只有一个消息队列。
-
-并行消费不再保证消息顺序,消费的最大并行数量受每个消费者客户端指定的线程池限制。
-
-### 一次完整的通信流程是怎样的?
-
-Producer 与 NameServer集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 获取 **Topic** 路由信息,并向提供 Topic 服务的 **Broker Master** 建立长连接,且定时向 **Broker** 发送心跳。
-
-**Producer** 只能将消息发送到 Broker master,但是 **Consumer** 则不一样,它同时和提供 Topic 服务的 Master 和 Slave建立长连接,既可以从 Broker Master 订阅消息,也可以从 Broker Slave 订阅消息。
-
-具体如下图:
-
-
-
-我上面说过他跟**Dubbo**像不是我瞎说的,就连他的注册过程都很像**Dubbo**的服务暴露过程。
-
-是不是觉得很简单,但是你同时也产生了好奇心,每一步是怎么初始化启动的呢?
-
-帅丙呀就知道大家都是**求知欲极强的人才**,这不我都准备好了,我们一步步分析一下。
-
-主要是人才群里的仔要求我写出来。。。(文末有进群方式)
-
-#### NameService启动流程
-
-在org.apache.rocketmq.namesrv目录下的**NamesrvStartup**这个启动类基本上描述了他的启动过程我们可以看一下代码:
-
- - 第一步是初始化配置
-
- - 创建**NamesrvController**实例,并开启两个定时任务:
-
- - 每隔10s扫描一次**Broker**,移除处于不激活的**Broker**;
-
- - 每隔10s打印一次KV配置。
-
- 
-
- - 第三步注册钩子函数,启动服务器并监听Broker。
-
-**NameService**还有很多东西的哈我这里就介绍他的启动流程,大家还可以去看看代码,还是很有意思的,比如路由注册会发送心跳包,还有**心跳包的处理流程**,**路由删除**,**路由发现**等等。
-
-**Tip**:本来我想贴很多源码的,后面跟**歪歪(Java3y)**讨论了很久做出了不贴的决定,大家理解过程为主!我主要是做只是扫盲还有一些痛点分析嘛,深究还是得大家花时间,我要啥都介绍篇幅就不够了。
-
-#### Producer
-
-链路很长涉及的细节也多,我就发一下链路图。
-
-
-
-**Producer**是消息发送方,那他怎么发送的呢?
-
-通过轮训,**Producer**轮训某个**Topic**下面的所有队列实现发送方的负载均衡
-
-
-
-#### Broker
-
-**Broker**在RocketMQ中是进行处理Producer发送消息请求,Consumer消费消息的请求,并且进行消息的持久化,以及HA策略和服务端过滤,就是集群中很重的工作都是交给了**Broker**进行处理。
-
-**Broker**模块是通过BrokerStartup进行启动的,会实例化BrokerController,并且调用其初始化方法
-
-
-
-大家去看**Broker**的源码的话会发现,他的**初始化流程很冗长**,会根据配置创建很多线程池主要用来**发送消息**、**拉取消息**、**查询消息**、**客户端管理**和**消费者管理**,也有很多**定时任务**,同时也注册了很多**请求处理器**,用来发送拉取消息查询消息的。
-
-#### Consumer
-
-不说了直接怼图吧!要死了,下次我还是做扫盲,写点爽文吧555
-
-
-
-**Consumer**是消息接受,那他怎么接收消息的呢?
-
-
-
-消费端会通过**RebalanceService**线程,10秒钟做一次基于**Topic**下的所有队列负载。
-
-## 面试常见问题分析
-
-### 他的优缺点是啥
-
-RocketMQ优点:
-
-- 单机吞吐量:十万级
-
-- 可用性:非常高,分布式架构
-
-- 消息可靠性:经过参数优化配置,消息可以做到0丢失
-
-- 功能支持:MQ功能较为完善,还是分布式的,扩展性好
-
-- 支持10亿级别的消息堆积,不会因为堆积导致性能下降
-
-- 源码是java,我们可以自己阅读源码,定制自己公司的MQ,可以掌控
-
-- 天生为金融互联网领域而生,对于可靠性要求很高的场景,尤其是电商里面的订单扣款,以及业务削峰,在大量交易涌入时,后端可能无法及时处理的情况
-
-- **RoketMQ**在稳定性上可能更值得信赖,这些业务场景在阿里双11已经经历了多次考验,如果你的业务有上述并发场景,建议可以选择**RocketMQ**
-
-RocketMQ缺点:
-
-- 支持的客户端语言不多,目前是java及c++,其中c++不成熟
-
-- 社区活跃度不是特别活跃那种
-
-- 没有在 mq 核心中去实现**JMS**等接口,有些系统要迁移需要修改大量代码
-
-### 消息去重
-
-去重原则:使用业务端逻辑保持幂等性
-
-**幂等性**:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用,数据库的结果都是唯一的,不可变的。
-
-只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样,需要业务端来实现。
-
-**去重策略**:保证每条消息都有唯一编号(**比如唯一流水号)**,且保证消息处理成功与去重表的日志同时出现。
-
-建立一个消息表,拿到这个消息做数据库的insert操作。给这个消息做一个唯一主键(primary key)或者唯一约束,那么就算出现重复消费的情况,就会导致主键冲突,那么就不再处理这条消息。
-
-### 消息重复
-
-消息领域有一个对消息投递的QoS定义,分为:
-
-- 最多一次(At most once)
-- 至少一次(At least once)
-- 仅一次( Exactly once)
-
-> QoS:Quality of Service,服务质量
-
-几乎所有的MQ产品都声称自己做到了**At least once**。
-
-既然是至少一次,那避免不了消息重复,尤其是在分布式网络环境下。
-
-比如:网络原因闪断,ACK返回失败等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将该消息分发给其他的消费者。
-
-不同的消息队列发送的确认信息形式不同,例如**RabbitMQ**是发送一个ACK确认消息,**RocketMQ**是返回一个CONSUME_SUCCESS成功标志,**Kafka**实际上有个offset的概念。
-
-**RocketMQ**没有内置消息去重的解决方案,最新版本是否支持还需确认。
-
-### 消息的可用性
-
-当我们选择好了集群模式之后,那么我们需要关心的就是怎么去存储和复制这个数据,**RocketMQ**对消息的刷盘提供了同步和异步的策略来满足我们的,当我们选择同步刷盘之后,如果刷盘超时会给返回FLUSH_DISK_TIMEOUT,如果是异步刷盘不会返回刷盘相关信息,选择同步刷盘可以尽最大程度满足我们的消息不会丢失。
-
-除了存储有选择之后,我们的主从同步提供了同步和异步两种模式来进行复制,当然选择同步可以提升可用性,但是消息的发送RT时间会下降10%左右。
-
-**RocketMQ**采用的是混合型的存储结构,即为**Broker**单个实例下所有的队列共用一个日志数据文件(即为CommitLog)来存储。
-
-而**Kafka**采用的是独立型的存储结构,每个队列一个文件。
-
-这里帅丙认为,**RocketMQ**采用混合型存储结构的缺点在于,会存在较多的随机读操作,因此读的效率偏低。同时消费消息需要依赖**ConsumeQueue**,构建该逻辑消费队列需要一定开销。
-
-### RocketMQ 刷盘实现
-
- **Broker** 在消息的存取时直接操作的是内存(内存映射文件),这可以提供系统的吞吐量,但是无法避免机器掉电时数据丢失,所以需要持久化到磁盘中。
-
-刷盘的最终实现都是使用**NIO**中的 MappedByteBuffer.force() 将映射区的数据写入到磁盘,如果是同步刷盘的话,在**Broker**把消息写到**CommitLog**映射区后,就会等待写入完成。
-
-异步而言,只是唤醒对应的线程,不保证执行的时机,流程如图所示。
-
-
-
-### 顺序消息:
-
-我简单的说一下我们使用的**RocketMQ**里面的一个简单实现吧。
-
-**Tip**:为啥用**RocketMQ**举例呢,这玩意是阿里开源的,我问了下身边的朋友很多公司都有使用,所以读者大概率是这个的话我就用这个举例吧,具体的细节我后面会在**RocketMQ**和**Kafka**各自章节说到。
-
-生产者消费者一般需要保证顺序消息的话,可能就是一个业务场景下的,比如订单的创建、支付、发货、收货。
-
-那这些东西是不是一个订单号呢?一个订单的肯定是一个订单号的说,那简单了呀。
-
-**一个topic下有多个队列**,为了保证发送有序,**RocketMQ**提供了**MessageQueueSelector**队列选择机制,他有三种实现:
-
-
-
-我们可使用**Hash取模法**,让同一个订单发送到同一个队列中,再使用同步发送,只有同个订单的创建消息发送成功,再发送支付消息。这样,我们保证了发送有序。
-
-**RocketMQ**的topic内的队列机制,可以保证存储满足**FIFO**(First Input First Output 简单说就是指先进先出),剩下的只需要消费者顺序消费即可。
-
-**RocketMQ**仅保证顺序发送,顺序消费由消费者业务保证!!!
-
-这里很好理解,一个订单你发送的时候放到一个队列里面去,你同一个的订单号Hash一下是不是还是一样的结果,那肯定是一个消费者消费,那顺序是不是就保证了?
-
-真正的顺序消费不同的中间件都有自己的不同实现我这里就举个例子,大家思路理解下。
-
-### 分布式事务:
-
-#### Half Message(半消息)
-
-**是指暂不能被Consumer消费的消息**。Producer 已经把消息成功发送到了 Broker 端,但此消息被标记为`暂不能投递`状态,处于该种状态下的消息称为半消息。需要 Producer
-
-对消息的`二次确认`后,Consumer才能去消费它。
-
-#### 消息回查
-
-由于网络闪段,生产者应用重启等原因。导致 **Producer** 端一直没有对 **Half Message(半消息)** 进行 **二次确认**。这是**Brock**服务器会定时扫描`长期处于半消息的消息`,会
-
-主动询问 **Producer**端 该消息的最终状态(**Commit或者Rollback**),该消息即为 **消息回查**。
-
-
-
-1. A服务先发送个Half Message给Brock端,消息中携带 B服务 即将要+100元的信息。
-2. 当A服务知道Half Message发送成功后,那么开始第3步执行本地事务。
-3. 执行本地事务(会有三种情况1、执行成功。2、执行失败。3、网络等原因导致没有响应)
-4. 如果本地事务成功,那么Product像Brock服务器发送Commit,这样B服务就可以消费该message。
-5. 如果本地事务失败,那么Product像Brock服务器发送Rollback,那么就会直接删除上面这条半消息。
-6. 如果因为网络等原因迟迟没有返回失败还是成功,那么会执行RocketMQ的回调接口,来进行事务的回查。
-
-### 消息过滤
-
-- **Broker**端消息过滤
- 在**Broker**中,按照**Consumer**的要求做过滤,优点是减少了对于**Consumer**无用消息的网络传输。缺点是增加了Broker的负担,实现相对复杂。
-- **Consumer**端消息过滤
- 这种过滤方式可由应用完全自定义实现,但是缺点是很多无用的消息要传输到**Consumer**端。
-
-### Broker的Buffer问题
-
-Broker的**Buffer**通常指的是Broker中一个队列的内存Buffer大小,这类**Buffer**通常大小有限。
-
-另外,RocketMQ没有内存**Buffer**概念,RocketMQ的队列都是持久化磁盘,数据定期清除。
-
-RocketMQ同其他MQ有非常显著的区别,RocketMQ的内存**Buffer**抽象成一个无限长度的队列,不管有多少数据进来都能装得下,这个无限是有前提的,Broker会定期删除过期的数据。
-
-例如Broker只保存3天的消息,那么这个**Buffer**虽然长度无限,但是3天前的数据会被从队尾删除。
-
-### 回溯消费
-
-回溯消费是指Consumer已经消费成功的消息,由于业务上的需求需要重新消费,要支持此功能,Broker在向Consumer投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度。
-
-例如由于Consumer系统故障,恢复后需要重新消费1小时前的数据,那么Broker要提供一种机制,可以按照时间维度来回退消费进度。
-
-**RocketMQ**支持按照时间回溯消费,时间维度精确到毫秒,可以向前回溯,也可以向后回溯。
-
-### 消息堆积
-
-消息中间件的主要功能是异步解耦,还有个重要功能是挡住前端的数据洪峰,保证后端系统的稳定性,这就要求消息中间件具有一定的消息堆积能力,消息堆积分以下两种情况:
-
-- 消息堆积在内存**Buffer**,一旦超过内存**Buffer**,可以根据一定的丢弃策略来丢弃消息,如CORBA Notification规范中描述。适合能容忍丢弃消息的业务,这种情况消息的堆积能力主要在于内存**Buffer**大小,而且消息堆积后,性能下降不会太大,因为内存中数据多少对于对外提供的访问能力影响有限。
-- 消息堆积到持久化存储系统中,例如DB,KV存储,文件记录形式。 当消息不能在内存Cache命中时,要不可避免的访问磁盘,会产生大量读IO,读IO的吞吐量直接决定了消息堆积后的访问能力。
-- 评估消息堆积能力主要有以下四点:
- - 消息能堆积多少条,多少字节?即消息的堆积容量。
- - 消息堆积后,发消息的吞吐量大小,是否会受堆积影响?
- - 消息堆积后,正常消费的Consumer是否会受影响?
- - 消息堆积后,访问堆积在磁盘的消息时,吞吐量有多大?
-
-### 定时消息
-
-定时消息是指消息发到**Broker**后,不能立刻被**Consumer**消费,要到特定的时间点或者等待特定的时间后才能被消费。
-
-如果要支持任意的时间精度,在**Broker**层面,必须要做消息排序,如果再涉及到持久化,那么消息排序要不可避免的产生巨大性能开销。
-
-**RocketMQ**支持定时消息,但是不支持任意时间精度,支持特定的level,例如定时5s,10s,1m等。
-
-## 总结
-
-写这种单纯介绍中间件的枯燥乏味,大家看起来估计也累,目前已经破一万个字了,以后我这种类型的少写,大家老是让我写点深度的,我说真的很多东西我源码一贴,看都没人看。
-
-**Kafka**我就不发博客了,大家可以去**GItHub**上第一时间阅读,后面会出怎么搭建项目在服务器的教程,还有一些大牛个人经历和个人书单的东西,今年应该先这么写,主要是真心太忙了,望理解。
-
-## 絮叨
-
-
-
-
-
-我也不过多描述了,反正嘛网络上重拳出击嘛,现实中唯唯诺诺,让他说理由也说不出来,不回我。
-
-他说的是下面这个场景多线程的情况,就是第一个线程还没走完,第二个现在进来,也判断没处理过那不就两个都继续加了么?
-
-
-
-**订单号+业务场景**,组成一个唯一主键,你插入数据库只能成功第一个,后续的都会报错的,报违反唯一主键的错误。
-
-还有就是有人疑惑为啥不直接就不判断就等他插入的时候报错,丢掉后续的就好了?
-
-你要知道**报错有很多种**,你哪里知道不是数据库挂了的错?或者别的运行时异常?
-
-不过你如果可以做到抛特定的异常也可以,反正我们要**减少数据库的报错**,如果并发大,像我现在负责的系统都是10W+QPS,那日志会打满疯狂报警的。(就是正常情况我们都经常报警)
-
-解决问题的思路有很多,喷我可以,讲清楚问题,讲清楚你的理由。
-
-很多大家都只是单方面的知识摄入,就这样还要喷我,还有一上来就问我为啥今天没发文章,我欠你的?我工作日上班,周六周日都怼上去了,时间有限啊,哥哥。
-
-大家都有自己的事情,写文章也耗时耗脑,难免出错,还望理解。
-
-## 日常求赞
-
-好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
-
-我后面会每周都更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
-
-创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
-
-敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 !
-
-------
-
-> 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已收录,有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有技术交流群,我们一起有点东西。
-
-
\ No newline at end of file
diff --git "a/docs/mq/\346\266\210\346\201\257\351\230\237\345\210\227\345\237\272\347\241\200.md" "b/docs/mq/\346\266\210\346\201\257\351\230\237\345\210\227\345\237\272\347\241\200.md"
deleted file mode 100644
index 87e737c..0000000
--- "a/docs/mq/\346\266\210\346\201\257\351\230\237\345\210\227\345\237\272\347\241\200.md"
+++ /dev/null
@@ -1,278 +0,0 @@
-> 你知道的越多,你不知道的越多
-
-> 点赞再看,养成习惯
-
-> **GitHub**上已经开源 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善
-
-## 前言
-
-**消息队列**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**消息队列**的使用和原理方面对小伙伴们进行360°的刁难。
-
-作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。
-
-于是在一个寂寞难耐的夜晚,**暖男**我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!
-
-## 絮叨
-
-这期本来是准备大家投票出来的哈,然后在**Java基础**和**消息队列**选一个写的,但是我一想,Java基础光是集合每种集合我都可以写好几篇了,基础都得写几个月了,那是不是可以先把短的这个消息队列写了?
-
-我脑子**灵光一闪**,拍了下桌子,那就这么决定了吧!
-
-所以就有这期了哈哈。
-
-**重要!**在开始之前我想问一下,大家是喜欢我直接怼知识点用自己的语言组织的方式讲,还是这样面试场景的方式讲?
-
-因为我发现一个很严肃的问题,我的开场和结尾要是几百篇都差不多,最后你们会不会厌倦呀?
-
-总之这个建议对我很有用,或者你有什么写作的建议都可以去**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上面有我的联系方式,可以加我微信**悄悄**跟我说。
-
-
-
-## 面试开始
-
->一个风度翩翩,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着铮亮的头,心想着肯定是尼玛顶级架构师吧!但是我们看过暖男敖丙的系列,腹有诗书气自华,虚都不虚。
-
-
-
-### 小伙子之前问了你这么多Redis的知识,你不仅对答如流,你还能把各自场景的解决方案,优缺点说得这么流畅,说你是不是看过敖丙写的《吊打面试官》系列呀?
-
-惊!!!老师你怎么知道的,我看了他的系列根本停不下来啊。
-
-### 呵呵,Redis没难住你,但是我问个新的技术栈我还怕难不住你?我问问你你项目中用过消息队列么?你为啥用消息队列?
-
-噗此,这也叫问题?别人用了我能不用么?别人用了我就用了呗,我就是为了用而用。
-
-**你心里嘀咕就好了,千万别说出来哈,说出来了没拿到Offer别到时候就在那说,敖丙那个渣男教我说的!**
-
-
-
-面试官你好:我们公司本身的业务体量很小,所以直接**单机一把梭**啥都能搞定了,但是后面业务体量不断扩大,采用**微服务的设计思想**,**分布式的部署方式**,所以拆分了很多的服务,随着体量的增加以及业务场景越来越复杂了,很多场景单机的技术栈和中间件以及不够用了,而且对系统的友好性也下降了,最后做了很多技术选型的工作,我们决定引入**消息队列中间件**。
-
-### 哦?你说到业务场景越来越复杂,你那说一下你都在什么场景用到了消息队列?
-
-嗯,我从三个方面去说一下我使用的场景吧。
-
-**Tip**:这三个场景也是消息队列的经典场景,大家基本上要烂熟于心那种,就是一说到消息队列你脑子就要想到**异步、削峰、解耦**,条件反射那种。
-
-#### 异步:
-
-我们之前的场景里面有很多步骤都是在一个流程里面需要做完的,就比如说我的下单系统吧,本来我们业务简单,下单了付了钱就好了,流程就走完了。
-
-但是后面来了个产品经理,搞了个**优惠券系统**,OK问题不大,流程里面多100ms去扣减优惠券。
-
-后来产品经理灵光一闪说我们可以搞个**积分系统**啊,也行吧,流程里面多了200ms去增减积分。
-
-再后来后来隔壁的产品老王说:下单成功后我们要给用户发短信,也将就吧,100ms去发个短信。
-
-再后来。。。(敖丙你有完没完!!!)
-
-
-
-反正就流程有点像这样 ↓
-
-
-
-你们可以看到这才加了三个,我可以**斩钉截铁**的告诉你真正的下单流程涉及的系统绝对在10个以上(主流电商),越大的越多。
-
-这个链路这样下去,**时间长得一批**,用户发现我买个东西你特么要花几十秒,垃圾电商我不在你这里买了,不过要是都像**并夕夕**这么便宜,**真香**!
-
-但是我们公司没有夕夕的那个经济实力啊,那只能优化系统了。
-
-Tip:我之前在的电商老东家要求所有接口的**Rt**(**ResponseTime响应时间**)在200ms内,超出的全部优化,我现在所负责的系统QPS也是**9W+**就是抖动一下**网络集群都可能炸锅**那种,**RT**基本上都要求在50ms以内。
-
-
-
-**大家感受一下这个QPS。**
-
-### 嗯不错,链路长了就慢了,那你怎么解决的?
-
-那链路长了就慢了,但是我们发现上面的流程其实可以**同时做**的呀,你支付成功后,我去校验优惠券的同时我可以去增减积分啊,还可以同时发个短信啊。
-
-那正常的流程我们是没办法实现的呀,怎么办,**异步**。
-
-你对比一下是不是发现,这样子最多只用100毫秒用户知道下单成功了,至于短信你迟几秒发给他他根本不在意是吧。
-
-
-
-### 小伙子我打断你一下,你说了异步,那我用线程,线程池去做不是一样的么?
-
-诶呀,面试官你**不要急嘛**,我后面还会说到的,骚等。
-
-#### 解耦:
-
-既然面试官这么问了,我就说一下为啥我们不能用线程去做,因为用线程去做,你是不是要写代码?
-
-你一个订单流程,你扣积分,扣优惠券,发短信,扣库存。。。等等这么多业务要调用这么多的接口,**每次加一个你要调用一个接口然后还要重新发布系统**,写一次两次还好,写多了你就说:老子不干了!
-
-而且真的全部都写在一起的话,不单单是耦合这一个问题,你出问题排查也麻烦,流程里面随便一个地方出问题搞不好会影响到其他的点,小伙伴说我每个流程都**try catch**不就行了,相信我别这么做,这样的代码就像个**定时炸弹💣**,你不知道什么时候爆炸,平时不炸偏偏在你做活动的时候炸,你就领个**P0故障**收拾书包**提前回家过年**吧。
-
-Tip:P0—PN 是互联网大厂经常用来判定事故等级的机制,P0是最高等级了。
-
-但是你用了**消息队列**,耦合这个问题就迎刃而解了呀。
-
-### 哦,帅丙怎么说?
-
-且听我娓娓道来:
-
-你下单了,你就把你**支付成功的消息告诉别的系统**,他们收到了去处理就好了,你只用走完自己的流程,把自己的消息发出去,那后面要接入什么系统简单,直接订阅你发送的支付成功消息,你支付成功了我**监听就好了**。
-
-
-
-### 那你的流程走完了,你不用管别人是否成功么?比如你下单了积分没加,优惠券没扣怎么办?
-
-问题是个好问题,但是没必要考虑,业务系统本身就是自己的开发人员维护的,你积分扣失败关我下单的什么事情?你管好自己下单系统的就好了。
-
-**Tip**:话是这么说,但是这其实是用了消息队列的一个缺点,涉及到**分布式事务**的知识点,我下面会提到。
-
-#### 削峰:
-
-就拿我上一期写的秒杀来说(暗示新同学看我上一期),你平时流量很低,但是你要做秒杀活动00 :00的时候流量疯狂怼进来,你的服务器,**Redis**,**MySQL**各自的承受能力都不一样,你直接**全部流量照单全收**肯定有问题啊,直接就打挂了。
-
-### 那怎么办?
-
-简单,把请求放到队列里面,然后至于每秒消费多少请求,就看自己的**服务器处理能力**,你能处理5000QPS你就消费这么多,可能会比正常的慢一点,但是**不至于打挂服务器**,等流量高峰下去了,你的服务也就没压力了。
-
-你看阿里双十一12:00的时候这么多流量瞬间涌进去,他有时候是不是会慢一点,但是人家没挂啊,或者降级给你个友好的提示页面,等高峰过去了又是一条好汉了。
-
-
-
-
-### 听你说了辣么多,怎么都是好处,那我问你使用了消息队列有啥问题么?
-
-诶,看过前面我写的文章的**人才**都知道,我经常说的就是,**技术是把双刃剑**!
-
-没错面试官,我使用他是因为他带给我们很多好处,但是使用之后问题也是**接踵而至**。
-
-同样的暖男我呀,也从三个点介绍他主要的缺点:
-
-#### 系统复杂性
-
-本来蛮简单的一个系统,我代码随便写都没事,现在你凭空接入一个中间件在那,我是不是要考虑去维护他,而且使用的过程中是不是要考虑各种问题,比如消息**重复消费**、**消息丢失**、**消息的顺序消费**等等,反正用了之后就是贼烦。
-
-### 我插一句嘴,上面的问题(重复消费、消息丢失、顺序消费)你能分别介绍一下,并且说一下分别是怎么解决的么?
-
-**不要!**我都说了敖丙下一章写啥?
-
-其实不是**暖男**我不想在这里写,这三个问题我想了下,统统都是**MQ**的**重点问题**,单独拿一个出来就是一篇文章了,**篇幅实在太长了**,我会在下一章挨个介绍一遍的。
-
-#### 数据一致性
-
-这个其实是分布式服务本身就存在的一个问题,**不仅仅是消息队列的问题**,但是放在这里说是因为用了消息队列这个问题会暴露得比较严重一点。
-
-就像我开头说的,你下单的服务自己保证自己的逻辑成功处理了,你成功发了消息,但是优惠券系统,积分系统等等这么多系统,**他们成功还是失败你就不管了?**
-
-我说了保证自己的业务数据对的就好了,其实还是比较不负责任的一种说法,这样就**像个渣男,没有格局**,**这样呀你的路会越走越窄的**。
-
-
-
-**所有的服务都成功才能算这一次下单是成功的**,那怎么才能保证数据一致性呢?
-
-**分布式事务**:把下单,优惠券,积分。。。都放在一个事务里面一样,要成功一起成功,要失败一起失败。
-
-
-
-Tip:**分布式事务**在互联网公司里面实在常见,我也不在这里大篇幅介绍了,后面都会专门说的。
-
-#### 可用性
-
-你搞个系统本身没啥问题,你现在突然接入一个中间件在那放着,万一挂了怎么办?我下个单**MQ挂了**,优惠券不扣了,积分不减了,这不是杀一个程序员能搞定的吧,感觉得杀一片。
-
-至于怎么保证高可用,还是那句话也不在这里展开讨论了,我后面一样会写,像写**Redis**那样写出来的。
-
-**放心敖丙我不是渣男来的,我肯定会对你们负责的。点赞!**
-
-### 看不出来啊,你有点东西呀,那我问一下你,你们是怎么做技术选型的?
-
-目前在市面上比较主流的消息队列中间件主要有,**Kafka、ActiveMQ、RabbitMQ、RocketMQ** 等这几种。
-
-不过敖丙我想说的是,**ActiveMQ**和**RabbitMQ**这两着因为吞吐量还有**GitHub**的社区活跃度的原因,在各大互联网公司都已经基本上绝迹了,业务体量一般的公司会是有在用的,但是越来越多的公司更青睐**RocketMQ**这样的消息中间件了。
-
-**Kafka**和**RocketMQ**一直在各自擅长的领域发光发亮,不过写这篇文章的时候我问了蚂蚁金服,字节跳动和美团的朋友,好像大家用的都有点不一样,应该都是各自的中间件,可能做过修改,也可能是**自研**的,大多**没有开源**。
-
-就像我们公司就是是基于**Kafka**和**RocketMQ**两者的优点自研的消息队列中间件,吞吐量、可靠性、时效性等都很可观。
-
-我们回归正题,我这里用网上找的对比图让大家看看差距到底在哪里:
-
-
-
-大家其实一下子就能看到差距了,就拿**吞吐量**来说,早期比较活跃的**ActiveMQ** 和**RabbitMQ**基本上不是后两者的对手了,在现在这样大数据的年代**吞吐量是真的很重要**。
-
-比如现在突然爆发了一个超级热点新闻,你的APP注册用户高达亿数,你要想办法第一时间把突发全部推送到每个人手上,你没有**大吞吐量的消息队列**中间件用啥去推?
-
-再说这些用户大量涌进来看了你的新闻产生了一系列的附带流量,你怎么应对这些数据,**很多场景离开消息队列基本上难以为继**。
-
-就**部署方式**而言前两者也是大不如后面两个**天然分布式架构的哥哥**,都是高可用的分布式架构,而且数据多个副本的数据也能做到0丢失。
-
-我们再聊一下**RabbitMQ**这个中间件其实还行,但是这玩意开发语言居然是**erlang**,我敢说绝大部分工程师肯定不会为了一个中间件去刻意学习一门语言的,开发维护成本你想都想不到,出个问题查都查半天。
-
-至于**RocketMQ**(阿里开源的),git活跃度还可以。基本上你push了自己的bug确认了有问题都有阿里大佬跟你试试解答并修复的,我个人推荐的也是这个,他的架构设计部分跟同样是阿里开源的一个**RPC**框架是真的很像(**Dubbo**)可能是因为师出同门的原因吧。
-
-Tip:**Dubbo**等我写到**RPC**我会详细介绍的。
-
-**Kafka**我放到最后说,你们也应该知道了,压轴的这是个大哥,大数据领域,公司的日志采集,实时计算等场景,都离不开他的身影,他基本上算得上是**世界范围级别的消息队列标杆**了。
-
-以上这些都只是一些我自己的**个人意见**,真正的选型还是要去**深入研究**的,不然那你公司一天UV就1000你告诉我你要去用**Kafka**我只能说你吃饱撑的。
-
-**记住,没有最好的技术,只有最适合的技术,不要为了用而用**。
-
-## 面试结束
-
-### 嗯,小伙子不错不错,分析得很到位,那你记得下期来说一下消息队列的高可用,重复消费、消息丢失、消息顺序、分布式事务等问题?
-
-嗯嗯好的面试官,不过不确定能不能一口气说完,毕竟敖丙还没开始写,而且读者还有可能白嫖,动力不一定够。
-
-### 嗯嗯这倒是个问题,不过啊在看的都是人才肯定会给你点赞👍的!
-
-我也这么认为。
-
-##总结
-
-
-
-**消息队列的基础知识**我就先介绍这么多,消息队列在面试里面基本上也是跟我前面写的**Redis**一样必问的。
-
-面试的思路还是一样,**要知其然,也要知其所以然,就是要知道为啥用,用了有啥好处,有啥坑。**
-
-面试官不喜欢**只知道用**的,你只会用那哪天线上出问题怎么办?你难道在旁边拜佛?
-
-
-
-后面我会写到很多**实际开发过程中比较复杂**的情况,在面试里面基本上是必考题,我希望你们拿起小本本记下来,**不要去背,要去理解,**我在人才交流群里面有仔问我,我怎么背住这些知识点的?
-
-**Tip**:**GItHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上有进群方式和个人联系方式
-
-
-
-
-
-你确定没逗我?你全靠背,你通过了面试,你开发写代码的时候怎么办?难道也还是背代码?别逗了兄弟,理解是最重要的。
-
-而且一般你背还是有实际开发经验的面试官一般一问就知道了,有啥坑他肯定比你清楚,会就是会,不会就不会老实回答就好了。
-
-记住,**腹有诗书气自华**,我们一起学习一起进步哟。
-
-## 鸣谢
-
-之前的文章写了很多人加我,然后有个人才说是他**蚂蚁金服**的Leader推荐的我,我突然意识到我文章的受众好像慢慢变广了,之后不严谨的点要杜绝掉。
-
-所以之后我的文章**经常会有**大厂的小伙伴Review,也希望帮助我更好的监督自己的文章吧。
-
-这次是 某阿里系电商跟我一起做过活动小组的 **佩恩** 帮我**Review**的文章,感谢!
-
-
-
-## 日常求赞
-
-好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
-
-我后面会每周都更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
-
-创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
-
-敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 !
-
-------
-
-> 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。
-
-
\ No newline at end of file
diff --git "a/docs/redis/\345\210\206\345\270\203\345\274\217\351\224\201\343\200\201\345\271\266\345\217\221\347\253\236\344\272\211\343\200\201\345\217\214\345\206\231\344\270\200\350\207\264\346\200\247.md" "b/docs/redis/\345\210\206\345\270\203\345\274\217\351\224\201\343\200\201\345\271\266\345\217\221\347\253\236\344\272\211\343\200\201\345\217\214\345\206\231\344\270\200\350\207\264\346\200\247.md"
deleted file mode 100644
index c0ab28a..0000000
--- "a/docs/redis/\345\210\206\345\270\203\345\274\217\351\224\201\343\200\201\345\271\266\345\217\221\347\253\236\344\272\211\343\200\201\345\217\214\345\206\231\344\270\200\350\207\264\346\200\247.md"
+++ /dev/null
@@ -1,286 +0,0 @@
-> 你知道的越多,你不知道的越多
-
-> 点赞再看,养成习惯
-
-## 前言
-
-**Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(**请允许我使用一下夸张的修辞手法**),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂offer!
-
-## 絮叨
-
-**男儿何不带吴钩,收取关山五十州 FPX 🐂B,LPL两年连冠🏆 🐂B!**
-
-看着金色的雨落下,我到窗边,发现天有点蓝,风有点绵,我的眼角又湿了!
-
-
-
-最近双十一讲道理有点忙的说,直接肝爆,就是这样作为**暖男**的我,还是给你们挤出时间搞出终章,忍不住给自己**点赞**👍
-
-放个双十一照片证明真的忙,希望别取关!!!
-
-
-
-现在你们在看的时候,我应该还在睡觉哈哈。困🛌
-
-之前跟你们说的,**限流**,**降级**,是不是在双十一又应验了,下单接口其实没挂,牺牲部分用户体验,保住服务器,你多点几下是可以成功的,等流量高峰过去了,所有的用户全部都恢复正常访问,服务器也没啥事。
-
-
-
-去年退款接口被打崩了,今年阿里明显也聪明了很多。
-
-
-
-## 正文
-
-上几期吊打系列我们提到了Redis的很多知识,还没看的小伙伴可以回顾一下
-
-- **[《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833)**
-- **[《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2)**
-- **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)**
-
-那提到**Redis**我相信各位在面试,或者实际开发过程中对基本类型的使用场景,并发竞争带来的问题,以及缓存数据库双写入一致性的问题等,我们有请下一位受害者。
-
-## 面试开始
-
-> 一个大腹便便,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!但是我们腹有诗书气自华,虚都不虚。(这不是第一篇文章的面试官么?)
-
-
-
-### 小伙子,你还记得我在第一章里面问过你,Redis有几种基础数据类型么?
-
-嗯嗯,帅气的面试官,我肯定记得,没齿难忘!!!
-
-我特么谢谢你,都四面了还不给Offer!
-
-
-
-### 那你能说一下他们的特性,还有分别的使用场景么?
-
-行吧,那我先从String说起。
-
-**String:**
-
-这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。
-
-但是真实的开发环境中,很多仔可能会把很多比较复杂的结构也统一转成**String**去存储使用,比如有的仔他就喜欢把对象或者**List**转换为**JSONString**进行存储,拿出来再反序列话啥的。
-
-我在这里就不讨论这样做的对错了,但是我还是希望大家能在最合适的场景使用最合适的数据结构,对象找不到最合适的但是类型可以选最合适的嘛,之后别人接手你的代码一看这么**规范**,诶这小伙子**有点东西**呀,看到你啥都是用的**String**,**垃圾!**
-
-
-
-好了这些都是题外话了,道理还是希望大家记在心里,习惯成自然嘛,小习惯成就你。
-
-**String**的实际应用场景比较广泛的有:
-
-- **缓存功能:String**字符串是最常用的数据类型,不仅仅是**Redis**,各个语言都是最基本类型,因此,利用**Redis**作为缓存,配合其它数据库作为存储层,利用**Redis**支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。
-
-- **计数器:**许多系统都会使用**Redis**作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。
-
-- **共享用户Session:**用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存**Cookie**,但是可以利用**Redis**将用户的**Session**集中管理,在这种模式只需要保证**Redis**的高可用,每次用户**Session**的更新和获取都可以快速完成。大大提高效率。
-
-**Hash:**
-
-这个是类似 **Map** 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是**这个对象没嵌套其他的对象**)给缓存在 **Redis** 里,然后每次读写缓存的时候,可以就操作 **Hash** 里的**某个字段**。
-
-但是这个的场景其实还是多少单一了一些,因为现在很多对象都是比较复杂的,比如你的商品对象可能里面就包含了很多属性,其中也有对象。我自己使用的场景用得不是那么多。
-
-**List:**
-
-**List** 是有序列表,这个还是可以玩儿出很多花样的。
-
-比如可以通过 **List** 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。
-
-比如可以通过 **lrange** 命令,读取某个闭区间内的元素,可以基于 **List** 实现分页查询,这个是很棒的一个功能,基于 **Redis** 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。
-
-比如可以搞个简单的消息队列,从 **List** 头怼进去,从 **List** 屁股那里弄出来。
-
-**List**本身就是我们在开发过程中比较常用的数据结构了,热点数据更不用说了。
-
-- **消息队列:Redis**的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过**Lpush**命令从左边插入数据,多个数据消费者,可以使用**BRpop**命令阻塞的“抢”列表尾部的数据。
-
-- 文章列表或者数据分页展示的应用。
-
- 比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用**Redis**的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。
-
-**Set:**
-
-**Set** 是无序集合,会自动去重的那种。
-
-直接基于 **Set** 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 **JVM** 内存里的 **HashSet** 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于**Redis**进行全局的 **Set** 去重。
-
-可以基于 **Set** 玩儿交集、并集、差集的操作,比如交集吧,我们可以把两个人的好友列表整一个交集,看看俩人的共同好友是谁?对吧。
-
-反正这些场景比较多,因为对比很快,操作也简单,两个查询一个**Set**搞定。
-
-**Sorted Set:**
-
-**Sorted set** 是排序的 **Set**,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。
-
-有序集合的使用场景与集合类似,但是set集合不是自动有序的,而**Sorted set**可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择**Sorted set**数据结构作为选择方案。
-
-- 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。
-
-- 用**Sorted Sets**来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
-
- 微博热搜榜,就是有个后面的热度值,前面就是名称
-
- 
-
-## 小结
-
-**Redis**基础类型有五种,这个我在基础里面也有提到了,这个问题其实一般都是对P6以下,也就是1-3年左右的小伙伴可能是会问得比较多的问题。
-
-能回答出来五种我想大家都可以,但是不知道大家是否知道,五种类型具体的使用场景,以及什么时候用什么类型最合适呢?
-
-要是你回答的不好,没说出几种数据类型,也没说什么场景,你完了,面试官对你印象肯定不好,觉得你平时就是做个简单的 set 和 get。所以看似很简单的面试题实则最容易看出你的深浅了,大家都要注意**打好基础**。
-
-###你有没有考虑过,如果你多个系统同时操作(并发)Redis带来的数据问题?
-
-嗯嗯这个问题我以前开发的时候遇到过,其实并发过程中确实会有这样的问题,比如下面这样的情况
-
-
-
-系统A、B、C三个系统,分别去操作**Redis**的同一个Key,本来顺序是1,2,3是正常的,但是因为系统A网络突然抖动了一下,B,C在他前面操作了**Redis**,这样数据不就错了么。
-
-就好比下单,支付,退款三个顺序你变了,你先退款,再下单,再支付,那流程就会失败,那数据不就乱了?你订单还没生成你却支付,退款了?明显走不通了,这在线上是很恐怖的事情。
-
-### 那这种情况怎么解决呢?
-
-我们可以找个管家帮我们管理好数据的嘛!
-
-
-
-某个时刻,多个系统实例都去更新某个 key。可以基于 **Zookeeper** 实现分布式锁。每个系统通过 **Zookeeper** 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 Key,别人都不允许读和写。
-
-你要写入缓存的数据,都是从 **MySQL** 里查出来的,都得写入 **MySQL** 中,写入 **MySQL** 中的时候必须保存一个时间戳,从 **MySQL** 查出来的时候,时间戳也查出来。
-
-每次要**写之前,先判断**一下当前这个 Value 的时间戳是否比缓存里的 Value 的时间戳要新。如果是的话,那么可以写,否则,就不能用旧的数据覆盖新的数据。
-
-### 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?
-
-一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统**不是严格要求** “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:**读请求和写请求串行化**,串到一个**内存队列**里去。
-
-串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。
-
-把一些列的操作都放到队列里面,顺序肯定不会乱,但是并发高了,这队列很容易阻塞,反而会成为整个系统的弱点,瓶颈
-
-
-
-### 你了解最经典的KV、DB读写模式么?
-
-最经典的缓存+数据库读写的模式,就是 **Cache Aside Pattern**
-
-- 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
-- 更新的时候,**先更新数据库,然后再删除缓存**。
-
-###为什么是删除缓存,而不是更新缓存?
-
-原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。
-
-比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。
-
-另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于**比较复杂的缓存数据计算的场景**,就不是这样了。如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,**这个缓存到底会不会被频繁访问到?**
-
-举个栗子:一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次、100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有**大量的冷数据**。
-
-实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。**用到缓存才去算缓存。**
-
-其实删除缓存,而不是更新缓存,就是一个 Lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。
-
-像 **Mybatis**,**Hibernate**,都有懒加载思想。查询一个部门,部门带了一个员工的 **List**,没有必要说每次查询部门,都里面的 1000 个员工的数据也同时查出来啊。80% 的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询 1000 个员工。
-
-###Redis 和 Memcached 有啥区别,为啥选择用Redis作为你们的缓存中间件?
-
-**Redis** 支持复杂的数据结构:
-
-**Redis** 相比 **Memcached** 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, **Redis** 会是不错的选择。
-
-**Redis** 原生支持集群模式:
-
-在 redis3.x 版本中,便能支持 **Cluster** 模式,而 **Memcached** 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
-
-性能对比:
-
-由于 **Redis** 只使用单核,而 **Memcached** 可以使用多核,所以平均每一个核上 **Redis** 在存储小数据时比 **Memcached** 性能更高。而在 100k 以上的数据中,**Memcached** 性能要高于 **Redis**,虽然 **Redis** 最近也在存储大数据的性能上进行优化,但是比起 **Remcached**,还是稍有逊色。
-
-Tip:其实面试官这么问,是想看你知道为啥用这个技术栈么?你为啥选这个技术栈,你是否做过技术选型的对比,优缺点你是否了解,你啥都不知道,只是为了用而用,那你可能就**差点意思**了。
-
-### Redis 的线程模型了解么?
-
-**Redis** 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 **Redis** 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 **Socket**,根据 **Socket** 上的事件来选择对应的事件处理器进行处理。
-
-文件事件处理器的结构包含 4 个部分:
-
-- 多个 **Socket**
-- IO 多路复用程序
-- 文件事件分派器
-- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
-
-多个 **Socket** 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 **Socket**,会将 **Socket** 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
-
-## 面试结束
-
-### 小伙子对你面试了四轮,你说话有理有据,逻辑清晰,来公司后肯定是一把好手,我想要不你来当我的Leader吧,哈哈?
-
-面试官别跟我开玩笑了,我跟您这样日积月累的技术专家还是有很多差距的,您的经验和技术上的深度,没有很长时间的磨练是无法达到的,我还得多跟您学习。
-
-### 好的,小伙子有点东西,你年少有为不自卑,知道什么是珍贵,就是你了来上班吧。
-
-好的面试官,不过我想我在Java基础,MQ,Dubbo等等领域还有好多知识点您没问我,要不下次继续面我?
-
-强行,为吊打下一期埋伏笔哈哈,下期写啥你们定!!!
-
-能撑到最后,你自己都忍不住自己给自己点个赞了!
-
-(**暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢**)。
-
-----
-
-**《吊打面试官》Redis系列 ---- 全剧终**
-
-----
-
-## 总结
-
-既然都说了是**Redis**的终章我最后也做个**Redis**方面常见面试题,题目的总结,答案大家要去思考我前面的文章基本上都提到了,结果可以去我公众号回复【答案】获取,不过我还是希望大家能看到题目就能想到答案,并且记在心中,教大家怎么回答只是帮大家组织下语言,真正的场景解决方案还是要大家理解的。
-
-(周三以后出答案,我先睡会)
-
-- 0、在集群模式下,Redis 的 Key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 Hash 算法吗?
-- 1、使用Redis有哪些好处?
-- 2、Redis相比Memcached有哪些优势?
-- 3、Redis常见性能问题和解决方案
-- 4、MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
-- 5、Memcache与Redis的区别都有哪些?
-- 6、Redis 常见的性能问题都有哪些?如何解决?
-- 7、在什么样的场景下可以充分的利用Redis的特性,大大提高Redis的效率?
-- 8、Redis的缓存雪崩、穿透、击穿了解么?有什么异同点?分别怎么解决?
-- 9、Redis的基本类型有哪些?他们的使用场景了解么?比较高级的用法你使用过么?
-- 10、Redis主从怎么同步数据的?集群的高可用怎么保证?持久化机制了解么?
-- 11、为什么 redis 单线程却能支撑高并发?
-- 12、如何保证缓存和数据库数据的一致性?
-- 13、项目中是怎么用缓存的,用了缓存之后会带来什么问题?
-
-## 絮叨+
-
-最后我想说的就是,我这四章只是介绍到了一些**Redis**面试比较常见的问题,其实还有很多点我都没回答到,大家如果为了对付面试**可能**是够用了,但是我们技术人员还是要保持对技术的**敬畏心**,你不能**浅尝即止**,还是要深究的。
-
-你永远只会用,不去考虑用了会带来的问题,以及出现问题之后的解决方案,我觉得你大概率会**停滞不前**,既然入都入了这行了,为啥不武装一下自己。
-
-其实学习技术是个**反哺**的过程,学习的时候可能你只是感觉知识广度、深度上去了,一个知识点你这样,两个、三个知识点你都这样,最后你发现你的技术已经跟身边一样P6的仔不一样了,这样你可能在团队重大项目的贡献都上去了,那P7的晋升几率是不是大了,钱是不是上去了,女朋友是不是好看了,房子是不是大了。
-
-## End
-
-好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**,我后面会每周都更新几篇《**吊打面试官**》系列和**Java技术栈**相关的文章。如果你有什么想知道的,也可以留言给我,或者去公众号加我微信,我一有时间就会写出来,我们共同进步。
-
-非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得**「敖丙」**我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** **求留言💬** 对暖男我来说**非常有用**。
-
-各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
-
-敖丙 | 文 【原创】【转载请联系本人】
-
-------
-
-> **《吊打面试官》**系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第时间阅读和催更(公众号比博客早一到两天哟),里面也有我个人微信有什么问题也可以直接滴滴我,我也是个新人,不过不影响我们一起进步,作为渣男,我给不了你幸福,还给不了你温暖嘛?
-
-
\ No newline at end of file
diff --git "a/docs/redis/\347\247\222\346\235\200\347\263\273\347\273\237\350\256\276\350\256\241.md" "b/docs/redis/\347\247\222\346\235\200\347\263\273\347\273\237\350\256\276\350\256\241.md"
deleted file mode 100644
index 6f2e552..0000000
--- "a/docs/redis/\347\247\222\346\235\200\347\263\273\347\273\237\350\256\276\350\256\241.md"
+++ /dev/null
@@ -1,288 +0,0 @@
-> 你知道的越多,你不知道的越多
-
-> 点赞再看,养成习惯
-
-> **GitHub**上已经开源 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教
-
-## 前言
-
-**Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。
-
-作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。
-
-于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer!
-
-## 絮叨
-
-之前写了很多**Redis**相关的知识点,我又大概回头看了下,除了比较底层的东西没写很深之外,我基本上的点都提到过了,我相信如果只是为了应付面试应该是够了的,但是如果你想把它们真正的吸收纳为己用,还是需要**大量的知识积累**,和**很多实际操作**的。
-
-就我自己而言**Redis**在开发过程中实在用得太普遍了,热点数据的存储啊,整体性能的提升啊都会用到,但是就像我说的**技术就是一把双刃剑**,使用它们随之而来的问题也会很多的,我在老东家双十二就遇到**缓存雪崩**问题让整体服务宕机3分钟,相必大家都知道阿里今年的双十一数据了,那三分钟在这种时候到底值多少钱?真的不敢想象。
-
-**Redis**的普遍我就拿掘金我自己的认知举例,不知道对不对,但是目测是对的。
-
-
-
-**大家看到问题所在了么?**是的热门的赞的数据不是最新的,我盲猜一波上面的热门文章是缓存。失效时间应该是几十分钟的,为啥这么做呢?
-
-热门文章是大家共同都会看到的,也就是**热点数据**,在那做缓存,他是不需要那么高的**实时性**的,那下面的文章列表是最新发布的文章,有高实时性的特点,大家访问多的放在缓存还可以给DB减少压力,我也不知道掘金是不是这么做的哈,反正道理是这么个道理了。
-
-那什么场景是使用**Redis比较复杂的场景**,而且需要**大量中间件**和**业务逻辑**去配合的呢?
-
-**秒杀**!是的就是今天的主题秒杀,我就用我自己的思路带大家一起看一下,设计一个秒杀从前到后,从内到外到底要技术人员做多少准备。
-
-## 捞一下
-
-上一期吊打系列我们提到了**Redis**相关的一些知识,还没看的小伙伴可以回顾一下 ,这**对于这期的阅读很有帮助**,涉及到主从同步、读写分离、持久化这样的知识点。
-
-- **[《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833)**
-- **[《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2)**
-- **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)**
-- **[《吊打面试官》系列-Redis终章凛冬将至、FPX新王登基](https://juejin.im/post/5dc850b4e51d452c2308ee27)**
-- **[《吊打面试官》系列-Redis常见面试题(带答案)](https://juejin.im/post/5dcaebea518825571f5c4ab0)**
-
-打好基础才可以写出更好的代码哟!不然就等着产品测试怼你吧。
-
-## 正文
-
-首先设计一个系统之前,我们需要先确认我们的业务场景是怎么样子的,我就**带着大家一起假设一个场景**好吧。
-
-### 场景
-
-我们现场要卖100件下面这个**婴儿纸尿裤**,然后我们根据以往这样秒杀活动的数据经验来看,目测来抢这100件纸尿裤的人足足有10万人。(南极人打钱!)
-
-
-
-你一听,完了呀,这我们的服务器哪里顶得住啊!说真的直接打DB肯定挂。但是别急嘛,有**暖男**敖丙在,我们在开始之前应该先思考下**会出现哪些问题**?
-
-### 问题
-
-#### 高并发:
-
-是的**高并发**这个是我们想都不用想的一个点,一瞬间这么多人进来这不是高并发什么时候是呢?
-
-是吧,秒杀的特点就是这样**时间极短**、 **瞬间用户量大**。
-
-正常的店铺营销都是用极低的价格配合上短信、APP的精准推送,吸引特别多的用户来参与这场秒杀,**爽了商家苦了开发呀**。
-
-秒杀大家都知道如果真的营销到位,价格诱人,几十万的流量我觉得完全不是问题,那单机的**Redis**我感觉3-4W的QPS还是能顶得住的,但是再高了就没办法了,那这个数据随便搞个热销商品的秒杀可能都不止了。
-
-大量的请求进来,我们需要考虑的点就很多了,**缓存雪崩**,**缓存击穿**,**缓存穿透**这些我之前提到的点都是有可能发生的,出现问题打挂DB那就很难受了,活动失败用户体验差,活动人气没了,最后背锅的还是**开发**。
-
-
-
-#### 超卖:
-
-但凡是个秒杀,都怕**超卖**,我这里举例的只是尿不湿,要是换成100个华为MatePro30,商家的预算经费卖100个可以赚点还可以造势,结果你写错程序多卖出去200个,你不发货用户**投诉你**,平台**封你店**,你发货就**血亏**,你怎么办?
-(没事看了敖丙的文章直接不怕)
-
-那最后只能**杀个开发祭天**解气了,秒杀的价格本来就低了,基本上都是不怎么赚钱的,超卖了就恐怖了呀,所以超卖也是很关键的一个点。
-
-
-
-#### 恶意请求:
-
-你这么低的价格,假如我抢到了,我转手卖掉我不是**血赚**?就算我不卖我也不亏啊,那用户知道,你知道,别的别有用心的人(黑客、黄牛...)肯定也知道的。
-
-那简单啊,我知道你什么时候抢,我搞个几十台机器搞点脚本,我也模拟出来十几万个人左右的请求,那我是不是意味着我基本上有80%的成功率了。
-
-真实情况可能远远不止,因为机器请求的速度比人的手速往往快太多了,在贵州的敖丙我每年回家抢高铁票都是**秒光**的,我也不知道有没有黄牛的功劳,我要Diss你,黄牛。杰伦演唱会门票抢不到,我也Diss你。
-
-Tip:科普下,小道消息了解到的,黄牛的抢票系统,比国内很多小公司的系统还吊很多,架构设计都是顶级的,我用**顶配的服务**加上**顶配的架构设计**,你还想看演唱会?还想回家?
-
-不过不用黄牛我回家都难,我们云贵川跟我一样要回家过年的仔太多了555!
-
-#### 链接暴露:
-
-前面几个问题大家可能都很好理解,一看到这个有的小伙伴可能会比较疑惑,啥是**链接暴露**呀?
-
-
-
-相信是个开发同学都对这个画面一点都不陌生吧,懂点行的仔都可以打开谷歌的**开发者模式**,然后看看你的网页代码,有的就有URL,但是我写VUE的时候是事件触发然后去调用文件里面的接口看源码看不到,但是我可以点击一下**查看你的请求地址**啊,不过你好像可以对按钮在秒杀前置灰。
-
-不管怎么样子都有危险,撇开外面的所有的东西你都挡住了,你卖这个东西实在便宜得过分,有诱惑力,你能保证**开发不动心**?开发知道地址,在秒杀的时候自己提前请求。。。(开发:怎么TM又是我)
-
-
-
-
-#### 数据库:
-
-每秒上万甚至十几万的**QPS**(每秒请求数)直接打到**数据库**,基本上都要把库打挂掉,而且你服务不单单是做秒杀的还涉及其他的业务,你没做**降级、限流、熔断**啥的,别的一起挂,小公司的话可能**全站崩溃404**。
-
-反正不管你秒杀怎么挂,你别把别的搞挂了对吧,搞挂了就不是杀一个程序员能搞定的。
-
-程序员:我TM好难啊!
-
-### 问题都列出来了,那怎么设计,怎么解决这些问题就是接下去要考虑的了,我们对症下药。
-
-#### 服务单一职责:
-
-设计个能抗住高并发的系统,我觉得还是得**单一职责**。
-
-什么意思呢,大家都知道现在设计都是**微服务的设计思想**,然后再用**分布式的部署方式**
-
-也就是我们下单是有个订单服务,用户登录管理等有个用户服务等等,那为啥我们不给秒杀也开个服务,我们把秒杀的代码业务逻辑放一起。
-
-单独给他建立一个数据库,现在的互联网架构部署都是**分库**的,一样的就是订单服务对应订单库,秒杀我们也给他建立自己的秒杀库。
-
-至于表就看大家怎么设计了,该设置索引的地方还是要设置索引的,建完后记得用**explain**看看**SQL**的执行计划。(不了解的小伙伴也没事,MySQL章节我会说的)
-
-单一职责的好处就是就算秒杀没抗住,秒杀库崩了,服务挂了,也不会影响到其他的服务。(强行高可用)
-
-#### 秒杀链接加盐:
-
-我们上面说了链接要是提前暴露出去可能有人直接访问url就提前秒杀了,那又有小伙伴要说了我做个时间的校验就好了呀,那我告诉你,知道链接的地址比起页面人工点击的还是有**很大优势**。
-
-我知道url了,那我通过程序不断获取最新的北京时间,可以达到**毫秒级别**的,我就在00毫秒的时候请求,我敢说绝对比你人工点的成功率大太多了,而且我可以一毫秒发送N次请求,搞不好你卖100个产品我全拿了。
-
-
-
-**那这种情况怎么避免?**
-
-简单,把**URL动态化**,就连写代码的人都不知道,你就通过MD5之类的加密算法加密随机的字符串去做url,然后通过前端代码获取url后台校验才能通过。
-
-暖男我呢,又准备了一个简单的url加密给大家尝尝鲜,还不**点个赞**?
-
-
-
-#### Redis集群:
-
-之前不是说单机的**Redis**顶不住嘛,那简单多找几个兄弟啊,秒杀本来就是读多写少,那你们是不是瞬间想起来我之前跟你们提到过的,**Redis集群**,**主从同步**、**读写分离**,我们还搞点**哨兵**,开启**持久化**直接无敌高可用!
-
-
-
-#### Nginx:
-
-**Nginx**大家想必都不陌生了吧,这玩意是**高性能的web服务器**,并发也随便顶几万不是梦,但是我们的**Tomcat**只能顶几百的并发呀,那简单呀**负载均衡**嘛,一台服务几百,那就多搞点,在秒杀的时候多租点**流量机**。
-
-Tip:据我所知国内某大厂就是在去年春节活动期间租光了亚洲所有的服务器,小公司也很喜欢在双十一期间买流量机来顶住压力。
-
-
-
-**这样一对比是不是觉得你的集群能顶很多了。**
-
-**恶意请求拦截**也需要用到它,一般单个用户请求次数太夸张,不像人为的请求在网关那一层就得拦截掉了,不然请求多了他抢不抢得到是一回事,服务器压力上去了,可能占用网络带宽或者把**服务器打崩、缓存击穿**等等。
-
-#### 资源静态化:
-
-秒杀一般都是特定的商品还有页面模板,现在一般都是前后端分离的,所以页面一般都是不会经过后端的,但是前端也要自己的服务器啊,那就把能提前放入**cdn服务器**的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力。
-
-#### 按钮控制:
-
-大家有没有发现没到秒杀前,一般按钮都是**置灰**的,只有时间到了,才能点击。
-
-这是因为怕大家在时间快到的最后几秒秒疯狂请求服务器,然后还没到秒杀的时候基本上服务器就挂了。
-
-这个时候就需要前端的配合,定时去请求你的后端服务器,获取最新的北京时间,到时间点再给按钮可用状态。
-
-按钮可以点击之后也得给他置灰几秒,不然他一样在开始之后一直点的。**你敢说你们秒杀的时候不是这样的?**
-
-
-
-#### 限流:
-
-限流这里我觉得应该分为**前端限流**和**后端限流**。
-
-**前端限流**:这个很简单,一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段。
-
-**后端限流**:秒杀的时候肯定是涉及到后续的订单生成和支付等操作,但是都只是成功的幸运儿才会走到那一步,那一旦100个产品卖光了,return了一个false,前端直接秒杀结束,然后你后端也关闭后续无效请求的介入了。
-
-Tip:真正的限流还会有限流组件的加入例如:阿里的Sentinel、Hystrix等。我这里就不展开了,就说一下物理的限流。
-
-#### 库存预热:
-
-**秒杀的本质,就是对库存的抢夺**,每个秒杀的用户来你都去数据库查询库存校验库存,然后扣减库存,撇开性能因数,你不觉得这样好繁琐,对业务开发人员都不友好,而且数据库顶不住啊。
-
-**开发:你tm总算为我着想一次了。**
-
-
-
-#### 那怎么办?
-
-我们都知道数据库顶不住但是他的兄弟非关系型的数据库**Redis**能顶啊!
-
-那不简单了,我们要开始秒杀前你通过定时任务或者运维同学**提前把商品的库存加载到Redis中**去,让整个流程都在Redis里面去做,然后等秒杀介绍了,再异步的去修改库存就好了。
-
-但是用了Redis就有一个问题了,我们上面说了我们采用**主从**,就是我们会去读取库存然后再判断然后有库存才去减库存,正常情况没问题,但是高并发的情况问题就很大了。
-
-这里我就不画图了,我本来想画图的,想了半天我觉得语言可能更好表达一点。
-
-**多品几遍!!!**就比如现在库存只剩下1个了,我们高并发嘛,4个服务器一起查询了发现都是还有1个,那大家都觉得是自己抢到了,就都去扣库存,那结果就变成了-3,是的只有一个是真的抢到了,别的都是超卖的。咋办?
-
-### Lua:
-
-之前的文章就简单的提到了他,我今天就多一定点篇幅说一下吧。
-
-> **Lua** 脚本功能是 Reids在 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 **CAS** (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。
-
-**Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作。**这点是关键。
-
-知道原理了,我们就写一个脚本把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,那到0了后面的都Return False了是吧,一个失败了你修改一个开关,直接挡住所有的请求,然后再做后面的事情嘛。
-
-#### 限流&降级&熔断&隔离:
-
-这个为啥要做呢,不怕一万就怕万一,万一你真的顶不住了,**限流**,顶不住就挡一部分出去但是不能说不行,**降级**,降级了还是被打挂了,**熔断**,至少不要影响别的系统,**隔离**,你本身就独立的,但是你会调用其他的系统嘛,你快不行了你别拖累兄弟们啊。
-
-
-
-#### 削峰填谷:
-
-一说到这个名词,很多小伙伴就知道了,对的**MQ**,你买东西少了你直接100个请求改库我觉得没问题,但是万一秒杀一万个,10万个呢?服务器挂了,**程序员又要背锅的**。
-
-Tip:**可能小伙伴说我们业务达不到这个量级,没必要。但是我想说我们写代码,就不应该写出有逻辑漏洞的代码,至少以后公司体量上去了,别人一看居然不用改代码,一看代码作者是敖丙?有点东西!**
-
-你可以把它放消息队列,然后一点点消费去改库存就好了嘛,不过单个商品其实一次修改就够了,我这里说的是**某个点多个商品**一起秒杀的场景,像极了双十一零点。
-
-## 总结
-
-到这里我想我已经基本上把该考虑的点还有对应的解决方案也都说了一下,不知道还有没有没考虑到的,但是就算没考虑到我想我这个设计,应该也能撑住一个完整的秒杀流程。
-
-(有大佬的话给敖丙点多的思路,去GitHub [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上给我提,也有我的联系)
-
-最后我就画个完整的流程图给大家收个尾吧!
-
-
-Tip:这个链路还是比较简单的,很多细节的点全部画出来就太复杂了,我上面已经提到了所有的注意点了,大家都看看,真正的秒杀有比我这个简单的,也有比我这个复杂N倍的,之前的电商老东家就做的很高级,有机会也可以跟你们探讨,不过是面试嘛,我就给思路,让你理解比较关键的点。
-
-秒杀这章我脑细胞死了很多,考虑了很多个点,最后还是出来了,忍不住给自己**点赞**!
-
-(**这章是真的不要白嫖,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我好喜欢**)
-
-## 总结
-
-我们玩归玩,闹归闹,别拿面试开玩笑。
-
-秒杀不一定是每个同学都会问到的,至少肯定没**Redis基础**那样常问,但是一旦问到,大家一定要回答到点上。
-
-至少你得说出**可能出现的情况**,**需要注意的情况**,以及对于的**解决思路和方案**。
-
-最后就是需要对整个链路比较熟悉,注意是一个完整的链路,前端怎么设计的呀,网关的作用呀,怎么**解决Redis的并发竞争**啊,**数据的同步方式**呀,**MQ的作用**啊。
-
-(提到MQ又是一整条的知识链路,什么异步、削峰、解耦等等,所以面试,我们还是不打没有把握的胜仗)
-
-### 流着泪说再见
-
-**Redis系列**到此是真的要跟大家说再见了,写了7篇文章,其实很多大佬的思路和片段真心赞,其实大家看出来了我的文章个人风格色彩特别浓厚,我个人在生活中就是这么说话的,也希望用这种风格把原本枯燥乏味的知识点让大家都像看小说一样津津有味的看下去,不知道大家什么感受,好的不好的都请给我留言。
-
-我这个系列的我会写到我**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 图中所有的知识点,以后就麻烦大家多多关照了,我写作的时间都是业余时间,基本上周末和晚上的时间都贡献出来了,我也是个新人很多点也没接触到,也要看书看资料才能写出来,所以有时候还是希望大家多多包涵。
-
-那我们下期见!
-
-下期写________________?
-
-不告诉你,哈哈!
-
-## 日常求赞
-
-好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
-
-我后面会每周都更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
-
-创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
-
-敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 !
-
-------
-
-> 《吊打面试官》系列每周持续更新,可以关注我的公众号「**JavaFamily**」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。
-
-
\ No newline at end of file
diff --git "a/docs/redis/\350\257\276\344\273\243\350\241\250\346\200\273\347\273\223.md" "b/docs/redis/\350\257\276\344\273\243\350\241\250\346\200\273\347\273\223.md"
deleted file mode 100644
index 278dd85..0000000
--- "a/docs/redis/\350\257\276\344\273\243\350\241\250\346\200\273\347\273\223.md"
+++ /dev/null
@@ -1,63 +0,0 @@
->
->
-> 你知道的越多,你不知道的越多
-
-> 点赞再看,养成习惯
-
-> **GitHub**上已经开源 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和指教
-
-## 絮叨
-
-本来是没这期的,按道理更新也应该是在周一更新**消息队列**的幂等,分布式事务相关的文章,但是这篇**暖男**我**实在忍不住了**,不是发自己的文章,是帮**课代表**发一下,她本科是**北京交通大学**,也是**电子科技大学**的研究生。
-
-**她**看了我的系列,做了个**笔记**📒,我一看,**偶买噶 !**。
-
-**这是什么仙女啊**,这是我**第一次**有这种感觉,这笔记有着前**所未有的新鲜感**,细节的勾勒,让整个笔记更显出**奥妙.**...有些**不太成熟的话语**,跟我文章的**骚气**十分搭配,将**Redis**的性能衬托的更为出色,这才呈现出完美的**课代表笔记**。
-
-这也是我第一次看到看个渣男的文章都做笔记的,这笔记让我有了初恋的味道,这我以后可得好好写了,不然**辜负**了**课代表这样认真的妹子**,到时候到杭州来找我:敖丙你个**渣男**乱写,害我没拿Offer! **我要杀了你**!
-
-我也不多BB了不影响大家食用了,**课代表**说了以后我写的**其他技术栈的笔记**一样会贡献出来,代价就是要嫁给我,呸呸呸,代价就是我以后帮他介绍大厂朋友内推下,看看简历呀,解答下职场问题啊什么的。(根本就是举手之劳啊,我血赚?)
-
-我一听我不能忍啊,我**气得拍桌子**,不行你以后不懂的知识点我包了,我也不懂的咳咳我看完书再包?
-
-哈哈开玩笑的,总之**课代表的精神**大家包括我都应该好好学学,这种人活该她拿**SSP**的Offer。
-
-**Tip**:SSP (Special Offer 优秀生源Offer渠道 )
-
-
-
-能总结得这么全面连我都忍不住**点赞**了!
-
-## 总结
-
-里面很多细节的点还是需要完善的,课代表最近上课很忙帅丙我呢除了周末也没时间,不过会不断完善到GIt的,大家也可以去公众号回复「**课代表**」获取思维导图原稿。
-
-其实我真的很欣赏课代表这样的精神的,她这样的举动**触动了我**,想想自己大学时候的样子,我忍不住给了自己两嘴巴子,我但凡有课代表一半的努力都不至于沦落到今天这样,等我冷静下来,走到了窗边,眺望头上若影若现的月亮,**我的眼角又湿了**!
-
-## 花絮
-
-人才群里的人才真的都是**人才**,一周两更**高产似母猪**了我都,还天天**催更**不过我也认了,**课代表**进去差点把人家吓走,**这么好的课代表**吓走了我哪里找第二个?
-
-**GitHub**上有我联系方式和入群方式 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily)
-
-
-
-
-
-## 日常求赞
-
-这期本来不想求赞的,但是我一想是**课代表**写的大家是给她赞,不是给我赞呀。
-
-好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。
-
-我后面会每周都更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「课代表」**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!!
-
-创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
-
-敖丙&**课代表** | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 !
-
-------
-
-> 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。
-
-
\ No newline at end of file