Skip to content

Commit 06b5f18

Browse files
authored
Merge pull request Snailclimb#7 from Snailclimb/master
更新
2 parents dd60d8e + 5345b5d commit 06b5f18

36 files changed

+1069
-138
lines changed

README.md

+50-26
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。
22

3-
作者的其他开源项目推荐:
4-
5-
1. [springboot-guide](https://github.com/Snailclimb/springboot-guide) : 适合新手入门以及有经验的开发人员查阅的 Spring Boot 教程(业余时间维护中,欢迎一起维护)。
6-
2. [programmer-advancement](https://github.com/Snailclimb/programmer-advancement) : 我觉得技术人员应该有的一些好习惯!
7-
3. [spring-security-jwt-guide](https://github.com/Snailclimb/spring-security-jwt-guide) :从零入门 !Spring Security With JWT(含权限验证)后端部分代码。
3+
**[推荐一下阿里云双11的活动:云服务器1折起,仅86元/年,限量抢购!](https://www.aliyun.com/1111/2019/group-buying-share?ptCode=32AE103FC8249634736194795A3477C4647C88CF896EF535&userCode=hf47liqn&share_source=copy_link)** (仅限新人,老用户可以考虑使用家人或者朋友账号购买,推荐799/3年 2核4G 这个性价比和适用面更广。不懂怎么使用云服务器的朋友可以看这篇[阿里云服务器使用经验](docs/tools/阿里云服务器使用经验.md))。
84

95
<p align="center">
106
<a href="https://github.com/Snailclimb/JavaGuide" target="_blank">
@@ -23,9 +19,9 @@
2319

2420
<h3 align="center">Sponsor</h3>
2521
<p align="center">
26-
<a href="https://study.163.com/topics/JavaGuide/" >
22+
<a href="https://url.163.com/hXm" >
2723
<img src="https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/WechatIMG1.png"width="" style="margin: 0 auto;"/>
28-
</a>
24+
</a >
2925
</p>
3026

3127
推荐使用 https://snailclimb.top/JavaGuide/ 在线阅读(访问速度慢的话,请使用 https://snailclimb.gitee.io/javaguide ),在线阅读内容本仓库同步一致。这种方式阅读的优势在于:有侧边栏阅读体验更好,Gitee pages 的访问速度相对来说也比较快。
@@ -39,7 +35,7 @@
3935
- [JVM](#jvm)
4036
- [I/O](#io)
4137
- [Java 8](#java-8)
42-
- [编程规范](#编程规范)
38+
- [优雅 Java 代码必备实践(Java编程规范)](#优雅-java-代码必备实践java编程规范)
4339
- [网络](#网络)
4440
- [操作系统](#操作系统)
4541
- [Linux相关](#linux相关)
@@ -51,14 +47,15 @@
5147
- [Redis](#redis)
5248
- [系统设计](#系统设计)
5349
- [常用框架(Spring/SpringBoot、Zookeeper ... )](#常用框架)
50+
- [数据通信(消息队列、Dubbo ... )](#数据通信)
5451
- [权限认证](#权限认证)
5552
- [设计模式(工厂模式、单例模式 ... )](#设计模式)
56-
- [数据通信(消息队列、Dubbo ... )](#数据通信)
57-
- [网站架构](#网站架构)
53+
- [架构](#架构)
5854
- [面试指南](#面试指南)
5955
- [备战面试](#备战面试)
6056
- [常见面试题总结](#常见面试题总结)
6157
- [面经](#面经)
58+
- [Java学习常见问题汇总](#java学习常见问题汇总)
6259
- [工具](#工具)
6360
- [Git](#git)
6461
- [Docker](#Docker)
@@ -113,9 +110,9 @@
113110
* [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md)
114111
* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md)
115112

116-
### 编程规范
113+
### 优雅 Java 代码必备实践(Java编程规范)
117114

118-
- [Java 编程规范](docs/java/Java编程规范.md)
115+
* [Java 编程规范以及优雅Java代码实践总结](docs/java/Java编程规范.md)
119116

120117
## 网络
121118

@@ -161,7 +158,8 @@
161158

162159
* [Redis 总结](docs/database/Redis/Redis.md)
163160
* [Redlock分布式锁](docs/database/Redis/Redlock分布式锁.md)
164-
* [如何做可靠的分布式锁,Redlock真的可行么](docs/database/Redis/如何做可靠的分布式锁,Redlock真的可行么.md)
161+
* [如何做可靠的分布式锁,Redlock真的可行么]()
162+
* [几种常见的 Redis 集群以及使用场景](docs/database/Redis/redis集群以及应用场景.md)
165163

166164
## 系统设计
167165

@@ -181,31 +179,38 @@
181179
- [ZooKeeper 相关概念总结](docs/system-design/framework/ZooKeeper.md)
182180
- [ZooKeeper 数据模型和常见命令](docs/system-design/framework/ZooKeeper数据模型和常见命令.md)
183181

184-
### 权限认证
182+
### 数据通信
185183

186-
- **[权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md)**
187-
- **[JWT 优缺点分析以及常见问题解决方案](docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md)**
188-
- **[适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)**
184+
- [数据通信(RESTful、RPC、消息队列)相关知识点总结](docs/system-design/data-communication/summary.md)
185+
- [服务之间的调用为啥不直接用 HTTP 而用 RPC?](docs/system-design/data-communication/why-use-rpc.md)
189186

190-
### 设计模式
187+
#### Dubbo
191188

192-
- [设计模式系列文章](docs/system-design/设计模式.md)
189+
- [Dubbo 总结:关于 Dubbo 的重要知识点](docs/system-design/data-communication/dubbo.md)
193190

194-
### 数据通信
191+
#### 消息中间件
195192

196-
- [数据通信(RESTful、RPC、消息队列)相关知识点总结](docs/system-design/data-communication/summary.md)
197-
- [Dubbo 总结:关于 Dubbo 的重要知识点](docs/system-design/data-communication/dubbo.md)
198193
- [消息队列总结](docs/system-design/data-communication/message-queue.md)
199194
- [RabbitMQ 入门](docs/system-design/data-communication/rabbitmq.md)
200195
- [RocketMQ的几个简单问题与答案](docs/system-design/data-communication/RocketMQ-Questions.md)
201196
- [Kafka入门看这一篇就够了](docs/system-design/data-communication/Kafka入门看这一篇就够了.md)
202197
- [Kafka系统设计开篇-面试看这篇就够了](docs/system-design/data-communication/Kafka系统设计开篇-面试看这篇就够了.md)
203198

204-
### 网站架构
199+
### 权限认证
200+
201+
- **[权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md)**
202+
- **[JWT 优缺点分析以及常见问题解决方案](docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md)**
203+
- **[适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)**
204+
205+
### 设计模式
206+
207+
- [设计模式系列文章](docs/system-design/设计模式.md)
208+
209+
### 架构
205210

206211
- [一文读懂分布式应该学什么](docs/system-design/website-architecture/分布式.md)
207212
- [8 张图读懂大型网站技术架构](docs/system-design/website-architecture/8%20张图读懂大型网站技术架构.md)
208-
- [【面试精选】关于大型网站系统架构你不得不懂的10个问题](docs/system-design/website-architecture/【面试精选】关于大型网站系统架构你不得不懂的10个问题.md)
213+
- [【面试精选】关于大型网站系统架构你不得不懂的10个问题](docs/system-design/website-architecture/关于大型网站系统架构你不得不懂的10个问题.md)
209214

210215
## 面试指南
211216

@@ -232,6 +237,11 @@
232237
- [蚂蚁金服2019实习生面经总结(已拿口头offer)](docs/essential-content-for-interview/BATJrealInterviewExperience/蚂蚁金服实习生面经总结(已拿口头offer).md)
233238
- [2019年蚂蚁金服、头条、拼多多的面试总结](docs/essential-content-for-interview/BATJrealInterviewExperience/2019alipay-pinduoduo-toutiao.md)
234239

240+
## Java学习常见问题汇总
241+
242+
- [Java学习路线和方法推荐](docs/questions/java-learning-path-and-methods.md)
243+
- [Java培训四个月能学会吗?](docs/questions/java-training-4-month.md)
244+
235245
## 工具
236246

237247
### Git
@@ -240,9 +250,13 @@
240250

241251
### Docker
242252

243-
* [Docker 入门](docs/tools/Docker.md)
253+
* [Docker 基本概念解读](docs/tools/Docker.md)
244254
* [一文搞懂 Docker 镜像的常用操作!](docs/tools/Docker-Image.md)
245255

256+
### 其他
257+
258+
- [阿里云服务器使用经验](docs/tools/阿里云服务器使用经验.md)
259+
246260
## 资源
247261

248262
### 书单
@@ -267,7 +281,7 @@
267281

268282
## 说明
269283

270-
### 介绍
284+
### JavaGuide介绍
271285

272286
* **对于 Java 初学者来说:** 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一个初步认识。另外,本文的一些文章
273287
也是你学习和复习 Java 知识不错的实践;
@@ -277,6 +291,12 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur
277291

278292
利用 docsify 生成文档部署在 Github pages: [docsify 官网介绍](https://docsify.js.org/#/)
279293

294+
### 作者的其他开源项目推荐
295+
296+
1. [springboot-guide](https://github.com/Snailclimb/springboot-guide) : 适合新手入门以及有经验的开发人员查阅的 Spring Boot 教程(业余时间维护中,欢迎一起维护)。
297+
2. [programmer-advancement](https://github.com/Snailclimb/programmer-advancement) : 我觉得技术人员应该有的一些好习惯!
298+
3. [spring-security-jwt-guide](https://github.com/Snailclimb/spring-security-jwt-guide) :从零入门 !Spring Security With JWT(含权限验证)后端部分代码。
299+
280300
### 关于转载
281301

282302
如果你需要转载本仓库的一些文章到自己的博客的话,记得注明原文地址就可以了。
@@ -310,6 +330,10 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur
310330
<a href="https://github.com/fanchenggang">
311331
<img src="https://avatars2.githubusercontent.com/u/8225921?s=460&v=4" width="45px">
312332
</a>
333+
<a href="https://github.com/Rustin-Liu">
334+
<img src="https://avatars2.githubusercontent.com/u/29879298?s=400&v=4" width="45px">
335+
</a>
336+
313337
<a href="https://github.com/ipofss">
314338
<img src="https://avatars1.githubusercontent.com/u/5917359?s=460&v=4" width="45px"></a>
315339
<a href="https://github.com/Gene1994">

docs/data/java-recommended-books.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,9 @@
8282

8383
### 设计模式
8484

85-
- [《设计模式 : 可复用面向对象软件的基础》 ](https://book.douban.com/subject/1052241/) (推荐,豆瓣评分 9.1):设计模式的经典!
85+
- [《设计模式 : 可复用面向对象软件的基础》](https://book.douban.com/subject/1052241/) (推荐,豆瓣评分 9.1):设计模式的经典!
8686
- [《Head First 设计模式(中文版)》](https://book.douban.com/subject/2243615/) (推荐,豆瓣评分 9.2):相当赞的一本设计模式入门书籍。用实际的编程案例讲解算法设计中会遇到的各种问题和需求变更(对的,连需求变更都考虑到了!),并以此逐步推导出良好的设计模式解决办法。
87+
- [《大话设计模式》](https://book.douban.com/subject/2334288/) (推荐,豆瓣评分 8.3):本书通篇都是以情景对话的形式,用多个小故事或编程示例来组织讲解GOF(即《设计模式 : 可复用面向对象软件的基础》这本书)),但是不像《设计模式 : 可复用面向对象软件的基础》难懂。但是设计模式只看书是不够的,还是需要在实际项目中运用,结合[设计模式](docs/system-design/设计模式.md)更佳!
8788

8889
### 常用框架
8990

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
相关阅读:
2+
3+
- [史上最全Redis高可用技术解决方案大全](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484850&idx=1&sn=3238360bfa8105cf758dcf7354af2814&chksm=cea24a79f9d5c36fb2399aafa91d7fb2699b5006d8d037fe8aaf2e5577ff20ae322868b04a87&token=1082669959&lang=zh_CN&scene=21#wechat_redirect)
4+
5+
# Redis 集群以及应用
6+
7+
## 集群
8+
### 主从复制
9+
#### 主从链(拓扑结构)
10+
![主从](https://user-images.githubusercontent.com/26766909/67539461-d1a26c00-f714-11e9-81ae-61fa89faf156.png)
11+
12+
![主从](https://user-images.githubusercontent.com/26766909/67539485-e0891e80-f714-11e9-8980-d253239fcd8b.png)
13+
14+
#### 复制模式
15+
- 全量复制:master 全部同步到 slave
16+
- 部分复制:slave 数据丢失进行备份
17+
18+
#### 问题点
19+
- 同步故障
20+
- 复制数据延迟(不一致)
21+
- 读取过期数据(Slave 不能删除数据)
22+
- 从节点故障
23+
- 主节点故障
24+
- 配置不一致
25+
- maxmemory 不一致:丢失数据
26+
- 优化参数不一致:内存不一致.
27+
- 避免全量复制
28+
- 选择小主节点(分片)、低峰期间操作.
29+
- 如果节点运行 id 不匹配(如主节点重启、运行 id 发送变化),此时要执行全量复制,应该配合哨兵和集群解决.
30+
- 主从复制挤压缓冲区不足产生的问题(网络中断,部分复制无法满足),可增大复制缓冲区( rel_backlog_size 参数).
31+
- 复制风暴
32+
33+
### 哨兵机制
34+
#### 拓扑图
35+
![image](https://user-images.githubusercontent.com/26766909/67539495-f0086780-f714-11e9-9eab-c11a163ac6c0.png)
36+
37+
#### 节点下线
38+
- 客观下线
39+
- 所有 Sentinel 节点对 Redis 节点失败要达成共识,即超过 quorum 个统一.
40+
- 主管下线
41+
- 即 Sentinel 节点对 Redis 节点失败的偏见,超出超时时间认为 Master 已经宕机.
42+
#### leader选举
43+
- 选举出一个 Sentinel 作为 Leader:集群中至少有三个 Sentinel 节点,但只有其中一个节点可完成故障转移.通过以下命令可以进行失败判定或领导者选举.
44+
- 选举流程
45+
1. 每个主观下线的 Sentinel 节点向其他 Sentinel 节点发送命令,要求设置它为领导者.
46+
1. 收到命令的 Sentinel 节点如果没有同意通过其他 Sentinel 节点发送的命令,则同意该请求,否则拒绝.
47+
1. 如果该 Sentinel 节点发现自己的票数已经超过 Sentinel 集合半数且超过 quorum,则它成为领导者.
48+
1. 如果此过程有多个 Sentinel 节点成为领导者,则等待一段时间再重新进行选举.
49+
#### 故障转移
50+
- 转移流程
51+
1. Sentinel 选出一个合适的 Slave 作为新的 Master(slaveof no one 命令).
52+
1. 向其余 Slave 发出通知,让它们成为新 Master 的 Slave( parallel-syncs 参数).
53+
1. 等待旧 Master 复活,并使之称为新 Master 的 Slave.
54+
1. 向客户端通知 Master 变化.
55+
- 从 Slave 中选择新 Master 节点的规则(slave 升级成 master 之后)
56+
1. 选择 slave-priority 最高的节点.
57+
1. 选择复制偏移量最大的节点(同步数据最多).
58+
1. 选择 runId 最小的节点.
59+
#### 读写分离
60+
#### 定时任务
61+
- 每 1s 每个 Sentinel 对其他 Sentinel 和 Redis 执行 ping,进行心跳检测.
62+
- 每 2s 每个 Sentinel 通过 Master 的 Channel 交换信息(pub - sub).
63+
- 每 10s 每个 Sentinel 对 Master 和 Slave 执行 info,目的是发现 Slave 节点、确定主从关系.
64+
65+
### 分布式集群(Cluster)
66+
#### 拓扑图
67+
68+
![image](https://user-images.githubusercontent.com/26766909/67539510-f8f93900-f714-11e9-9d8d-08afdecff95a.png)
69+
70+
#### 通讯
71+
##### 集中式
72+
> 将集群元数据(节点信息、故障等等)几种存储在某个节点上.
73+
- 优势
74+
1. 元数据的更新读取具有很强的时效性,元数据修改立即更新
75+
- 劣势
76+
1. 数据集中存储
77+
##### Gossip
78+
![image](https://user-images.githubusercontent.com/26766909/67539546-16c69e00-f715-11e9-9891-1e81b6af624c.png)
79+
80+
- [Gossip 协议](https://www.jianshu.com/p/8279d6fd65bb)
81+
82+
#### 寻址分片
83+
##### hash取模
84+
- hash(key)%机器数量
85+
- 问题
86+
1. 机器宕机,造成数据丢失,数据读取失败
87+
1. 伸缩性
88+
##### 一致性hash
89+
- ![image](https://user-images.githubusercontent.com/26766909/67539595-352c9980-f715-11e9-8e4a-9d9c04027785.png)
90+
91+
- 问题
92+
1. 一致性哈希算法在节点太少时,容易因为节点分布不均匀而造成缓存热点的问题。
93+
- 解决方案
94+
- 可以通过引入虚拟节点机制解决:即对每一个节点计算多个 hash,每个计算结果位置都放置一个虚拟节点。这样就实现了数据的均匀分布,负载均衡。
95+
##### hash槽
96+
- CRC16(key)%16384
97+
-
98+
![image](https://user-images.githubusercontent.com/26766909/67539610-3fe72e80-f715-11e9-8e0d-ea58bc965795.png)
99+
100+
101+
102+
103+
104+
105+
## 使用场景
106+
### 热点数据
107+
### 会话维持 session
108+
### 分布式锁 SETNX
109+
### 表缓存
110+
### 消息队列 list
111+
### 计数器 string
112+
113+
114+
115+
116+
117+
## 缓存设计
118+
### 更新策略
119+
- LRU、LFU、FIFO 算法自动清除:一致性最差,维护成本低.
120+
- 超时自动清除(key expire):一致性较差,维护成本低.
121+
- 主动更新:代码层面控制生命周期,一致性最好,维护成本高.
122+
### 更新一致性
123+
- 读请求:先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应.
124+
- 写请求:先删除缓存,然后再更新数据库(避免大量地写、却又不经常读的数据导致缓存频繁更新).
125+
### 缓存粒度
126+
- 通用性:全量属性更好.
127+
- 占用空间:部分属性更好.
128+
- 代码维护成本.
129+
130+
### 缓存穿透
131+
> 当大量的请求无命中缓存、直接请求到后端数据库(业务代码的 bug、或恶意攻击),同时后端数据库也没有查询到相应的记录、无法添加缓存.
132+
这种状态会一直维持,流量一直打到存储层上,无法利用缓存、还会给存储层带来巨大压力.
133+
>
134+
#### 解决方案
135+
1. 请求无法命中缓存、同时数据库记录为空时在缓存添加该 key 的空对象(设置过期时间),缺点是可能会在缓存中添加大量的空值键(比如遭到恶意攻击或爬虫),而且缓存层和存储层数据短期内不一致;
136+
1. 使用布隆过滤器在缓存层前拦截非法请求、自动为空值添加黑名单(同时可能要为误判的记录添加白名单).但需要考虑布隆过滤器的维护(离线生成/ 实时生成).
137+
### 缓存雪崩
138+
> 缓存崩溃时请求会直接落到数据库上,很可能由于无法承受大量的并发请求而崩溃,此时如果只重启数据库,或因为缓存重启后没有数据,新的流量进来很快又会把数据库击倒
139+
>
140+
#### 出现后应对
141+
- 事前:Redis 高可用,主从 + 哨兵,Redis Cluster,避免全盘崩溃.
142+
- 事中:本地 ehcache 缓存 + hystrix 限流 & 降级,避免数据库承受太多压力.
143+
- 事后:Redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据.
144+
#### 请求过程
145+
1. 用户请求先访问本地缓存,无命中后再访问 Redis,如果本地缓存和 Redis 都没有再查数据库,并把数据添加到本地缓存和 Redis;
146+
1. 由于设置了限流,一段时间范围内超出的请求走降级处理(返回默认值,或给出友情提示).
147+
148+
149+

docs/database/数据库连接池.md

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
- 公众号和Github待发文章:[数据库:数据库连接池原理详解与自定义连接池实现](https://www.fangzhipeng.com/javainterview/2019/07/15/mysql-connector-pool.html)
2+
- [基于JDBC的数据库连接池技术研究与应用](http://blog.itpub.net/9403012/viewspace-111794/)
3+
- [数据库连接池技术详解](https://juejin.im/post/5b7944c6e51d4538c86cf195)
4+
5+
数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存
6+
7+
连接池是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。**在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。**连接池还减少了用户必须等待建立与数据库的连接的时间。
8+
9+
操作过数据库的朋友应该都知道数据库连接池这个概念,它几乎每天都在和我们打交道,但是你真的了解 **数据库连接池** 吗?
10+
11+
### 没有数据库连接池之前
12+
13+
我相信你一定听过这样一句话:**Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁**
14+
15+
16+
17+
18+
19+
20+
21+

0 commit comments

Comments
 (0)