1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-10 00:41:37 +08:00

Compare commits

...

42 Commits

Author SHA1 Message Date
Guide
9d9b55a2ae Merge branch 'main' of github.com:Snailclimb/JavaGuide 2023-04-28 21:38:36 +08:00
Guide
818ccbca79 [docs add]程序员简历编写指南 2023-04-28 21:38:12 +08:00
Guide
fcdbe12190
Merge pull request #2001 from Erzbir/main
[docs fix]修正 hashCode() 方法的描述错误
2023-04-28 21:19:55 +08:00
Erzbir
f3754a92d4 [docs fix]修正 hashCode() 方法的描述错误 2023-04-28 20:44:18 +08:00
Guide
72019c2b09 [docs fix]url error 2023-04-28 20:32:33 +08:00
Guide
a19b2744b0
Merge pull request #1999 from Snailclimb/dependabot/npm_and_yarn/d3-color-3.1.0
Bump d3-color from 1.4.1 to 3.1.0
2023-04-28 19:31:11 +08:00
Guide
19cb0cd775
Merge pull request #1998 from Snailclimb/dependabot/npm_and_yarn/json5-2.2.3
Bump json5 from 2.2.1 to 2.2.3
2023-04-28 19:31:00 +08:00
Guide
372cb240ca [docs update]exact small-advertisement.snippet.md 2023-04-28 19:27:56 +08:00
dependabot[bot]
954364882e
Bump d3-color from 1.4.1 to 3.1.0
Bumps [d3-color](https://github.com/d3/d3-color) from 1.4.1 to 3.1.0.
- [Release notes](https://github.com/d3/d3-color/releases)
- [Commits](https://github.com/d3/d3-color/compare/v1.4.1...v3.1.0)

---
updated-dependencies:
- dependency-name: d3-color
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-28 10:44:55 +00:00
dependabot[bot]
3f2471340c
Bump json5 from 2.2.1 to 2.2.3
Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3.
- [Release notes](https://github.com/json5/json5/releases)
- [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md)
- [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3)

---
updated-dependencies:
- dependency-name: json5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-28 10:44:55 +00:00
Guide
0d8c0c0fb3
Merge pull request #1997 from Mister-Hope/ci
ci: add test workflow
2023-04-28 18:43:57 +08:00
Guide
f3c36f2916
Merge pull request #1996 from Mister-Hope/font-size
docs: update font-size
2023-04-28 18:43:17 +08:00
Guide
5678155022
Merge pull request #1995 from Mister-Hope/docs
docs: update docs
2023-04-28 18:42:56 +08:00
Mr.Hope
ef93bec410 ci: add test workflow 2023-04-28 18:00:51 +08:00
Mr.Hope
d993af3421 feat: add @ alias for include 2023-04-28 17:56:30 +08:00
Mr.Hope
76b220540b chore: pin deps 2023-04-28 17:53:18 +08:00
Mr.Hope
a13c531f35 chore: add husky and nano-staged 2023-04-28 17:52:53 +08:00
Mr.Hope
881bc5c591 Merge branch 'main' into docs 2023-04-28 17:50:47 +08:00
Mr.Hope
22e3ef1efc docs: add planet snippet 2023-04-28 17:48:34 +08:00
Mr.Hope
9153648dba chore: tweaks 2023-04-28 17:37:42 +08:00
Mr.Hope
4df51f86e9 docs: add linter 2023-04-28 17:35:43 +08:00
Mr.Hope
6bdc809e2f docs: add linter 2023-04-28 17:31:44 +08:00
Mr.Hope
72c52dba3e docs: update font-size 2023-04-28 17:21:21 +08:00
Mr.Hope
893c673f1c chore: update 2023-04-28 17:18:52 +08:00
Mr.Hope
2975f2f244 chore: update 2023-04-28 17:15:49 +08:00
Guide
a788fc300d [docs feat]format specification 2023-04-28 17:15:47 +08:00
Mr.Hope
7f877f8e5f docs: update docs 2023-04-28 17:12:53 +08:00
Guide
8f8d7c102a
Merge pull request #1994 from Mister-Hope/docs
chore: tweaks
2023-04-28 17:09:34 +08:00
Mr.Hope
cf9e96aa6c chore: tweaks 2023-04-28 17:02:11 +08:00
Guide
566c75d5a4
Merge pull request #1993 from Mister-Hope/update
feat: update deps and switch to pnpm
2023-04-28 16:27:35 +08:00
Guide
675d97ce1b
Merge pull request #1990 from Mister-Hope/readme
docs: update readme
2023-04-28 16:27:13 +08:00
Mr.Hope
fac0c7698d feat: add atom and rss feed 2023-04-28 16:22:41 +08:00
Mr.Hope
be1b2f46ce chore: remove iconfont 2023-04-28 16:19:18 +08:00
Mr.Hope
be6c1faa03 chore: update scripts 2023-04-28 16:18:11 +08:00
Mr.Hope
7703240ba3 feat: update deps and use pnpm 2023-04-28 16:17:44 +08:00
Mr.Hope
638181bf70 chore: rm en readme 2023-04-28 16:05:59 +08:00
Mr.Hope
44e5cfa5d2 docs: fix readme align 2023-04-28 16:05:09 +08:00
Mr.Hope
e5d5c357b3 docs: fix broken links in en readme 2023-04-28 16:04:04 +08:00
Guide
db776f0fd2 Delete README.en.md 2023-04-28 16:03:28 +08:00
Guide
dff5130082
Merge pull request #1989 from Mister-Hope/readme
docs: update readme
2023-04-28 15:59:15 +08:00
Mr.Hope
8f2cc4b8b2 docs: update readme 2023-04-28 15:56:23 +08:00
Guide
bc083f989c [docs update]完善Java基础常见面试题总结(上),添加一些代码示例 2023-04-28 15:44:41 +08:00
265 changed files with 35352 additions and 3255 deletions

29
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,29 @@
name: Docs Test
on:
- push
- pull_request
jobs:
test-docs:
name: Test docs
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
run_install: true
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: 18
cache: pnpm
- name: Build test
env:
NODE_OPTIONS: --max_old_space_size=4096
run: pnpm docs:build

13
.gitignore vendored
View File

@ -1,15 +1,14 @@
/node_modules
/package-lock.json
node_modules/
# *.drawio
*.drawio.bkp
.DS_Store
# VS Code Config file
.vscode/
# Vuepress Cache
.cache/
# Vuepress Temp
.temp/
# Vuepress Output
# VuePress Cache
**/.vuepress/.cache/
# VuePress Temp
**/.vuepress/.temp/
# VuePress Output
dist/
# Build files
packages/*/lib/

4
.husky/pre-commit Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm nano-staged

20
.markdownlint.json Normal file
View File

@ -0,0 +1,20 @@
{
"default": true,
"MD003": {
"style": "atx"
},
"MD004": {
"style": "dash"
},
"MD013": false,
"MD024": {
"allow_different_nesting": true
},
"MD035": {
"style": "---"
},
"MD040": false,
"MD045": false,
"MD046": false,
"MD049": false
}

4
.markdownlintignore Normal file
View File

@ -0,0 +1,4 @@
**/node_modules/**
# markdown snippets
*.snippet.md

15
.prettierignore Normal file
View File

@ -0,0 +1,15 @@
# Vuepress Cache
**/.vuepress/.cache/**
# Vuepress Temp
**/.vuepress/.temp/**
# Vuepress Output
dist/
# Node modules
node_modules/
# pnpm lock file
pnpm-lock.yaml
index.html
sw.js

View File

@ -1,375 +0,0 @@
<p style="text-align:center">
<a href="https://github.com/Snailclimb/JavaGuide" target="_blank">
<img src="https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png" width=""/>
</a>
</p>
<p style="text-align:center">
<a href="https://javaguide.cn/"><img src="https://img.shields.io/badge/阅读-read-brightgreen.svg" alt="阅读"></a>
<img src="https://img.shields.io/github/stars/Snailclimb/JavaGuide" alt="stars"/>
<img src="https://img.shields.io/github/forks/Snailclimb/JavaGuide" alt="forks"/>
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues"/>
</p>
<h3 style="text-align:center">Recommended</h3>
<table>
<tbody>
<tr>
<td style="text-align:center" valign="middle">
<a href="https://sourl.cn/e7ee87">
<img src="https://oss.javaguide.cn/xingqiu/xingqiu.png" style="margin: 0 auto;width:850px" /></a>
</td>
</tr>
</tbody>
</table>
## Java
### Basis
**Knowledge points/interview questions**: (Must see:+1: ):
- [Java Basics Knowledge Points/Interview Questions Summary(1)](docs/java/basis/java-basic-questions-01.md)
- [Java Basics Knowledge Points/Interview Questions Summary(2)](docs/java/basis/java-basic-questions-01.md)
- [Java Basics Knowledge Points/Interview Questions Summary(3)](docs/java/basis/java-basic-questions-01.md)
**Important Knowledge Points Explained:**
- [Why only value passing in Java?](docs/java/basis/why-thereis-only-value-passing-in-java.md)
- [What is the reflection mechanism? What are the application scenarios of reflection mechanism?](docs/java/basis/反射机制详解.md)
- (docs/java/basis/proxy-model-detail.md) [proxy-model-detail: static proxy + JDK/CGLIB dynamic proxy practice](docs/java/basis/代理模式详解.md)
- [What are the common IO models and what is the difference between BIO, NIO, AIO in Java?](docs/java/basis/io模型详解.md)
- [BigDecimal solve floating point problem](docs/java/basis/bigdecimal.md)
### Collection
1. **[Java collection FAQ summary](docs/java/collection/java集合框架基础知识&面试题总结.md)** (must see :+1:)
2. [Summary of considerations for using Java containers](docs/java/collection/java集合使用注意事项.md)
3. **source code analysis** : [ArrayList source code + expansion mechanism analysis](docs/java/collection/arraylist-source-code.md),
[HashMap(JDK1.8) source code + underlying data structure analysis](docs/java/collection/ hashmap-source-code.md),
[ConcurrentHashMap source code + underlying data structure analysis](docs/java/collection/concurrent-hash-map-source-code.md)
### Concurrency
**Knowledge/Interview Questions:** (Must see :+1:)
1. **[Java concurrency basic common interview questions summary](docs/java/concurrent/java并发基础常见面试题总结.md)**
2. **[Java concurrency advanced common interview questions summary](docs/java/concurrent/java并发进阶常见面试题总结.md)**
**Important Knowledge Points Explained:**
1. **Thread pool**: [Java thread pool learning summary](./docs/java/concurrent/java-thread-pool-summary.md), [Java thread pooling best practices](./docs/java/concurrent/java-thread-pool-best-practices.md)
2. [ThreadLocal keyword resolution](docs/java/concurrent/threadlocal.md)
3. [Java concurrency container summary](docs/java/concurrent/java-concurrent-collections.md)
4. [Atomic atomic class summary](docs/java/concurrent/atomic-classes.md)
5. [AQS principle and AQS synchronization component summary](docs/java/concurrent/aqs.md)
6. [Getting Started with CompletableFuture](docs/java/concurrent/completablefuture-intro.md)
### JVM (must see :+1:)
This part of JVM mainly refers to [JVM Virtual Machine Specification-Java8 ](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) and Mr. Zhou's [In-depth Understanding of Java Virtual Machine (3rd Edition)](https://book.douban.com/subject/34907497/) (Highly recommended to read more than once!) .
1. **[Java Memory Regions](https://javaguide.cn/java/jvm/jvm-garbage-collection/)**
2. **[JVM Garbage Collection](https://javaguide.cn/java/jvm/jvm-garbage-collection/)**
3. [JDK monitoring and troubleshooting tools](https://javaguide.cn/java/jvm/jdk-monitoring-and-troubleshooting-tools/)
4. [Class file structure](https://javaguide.cn/java/jvm/class-file-structure/)
5. **[Class loading process](https://javaguide.cn/java/jvm/class-loading-process/)**
6. [Class loader](https://javaguide.cn/java/jvm/classloader/)
7. **[[To be completed] Summary of the most important JVM parameters (half of the translation is perfected)](https://javaguide.cn/java/jvm/jvm-parameters-intro/)**
8. **[[Extra Meal] The Big White Word takes you through the JVM](https://javaguide.cn/java/jvm/jvm-intro/)**
### New features
1. **Java 8**: [Java 8 new features summary](docs/java/new-features/Java8新特性总结.md), [Java8 common new features summary](docs/java/new-features/java8-common-new-features.md)
2. **Java9~Java15** : [An article to take you through the important new features of JDK9~15!](./docs/java/new-features/java新特性总结.md)
### Tips
1. [JAD decompile](docs/java/tips/JAD反编译tricks.md)
2. [Handy for locating common Java performance problems](./docs/java/tips/locate-performance-problems/手把手教你定位常见Java性能问题.md)
## Computer Basics
👉 **[Illustrated Computer Fundamentals PDF Download](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100021725&idx=1&sn=2db9664ca25363139a81691043e9fd8f&chksm=4ea19a1679d61300d8990f7e43bfc7f476577a81b712cf0f9c6f6552a8b219bc081efddb5c54#rd)** .
### Operating system
1. [OS FAQ summary!](docs/cs-basics/operating-system/操作系统常见面试题&知识点总结.md)
2. [Backend programmer essential Linux basics summary](docs/cs-basics/operating-system/linux-intro.md)
3. [Introduction to Shell Programming](docs/cs-basics/operating-system/shell-intro.md)
### Networking
1. [Computer Network Common Interview Questions](docs/cs-basics/network/计算机网络常见面试题.md)
2. [Xie Xiren teacher's "computer network" content summary](docs/cs-basics/network/谢希仁老师的《计算机网络》内容总结.md)
### Data Structures
**Diagrammatic Data Structures :**
1. [Linear data structure :array, chain table, stack, queue](docs/cs-basics/data-structure/线性数据结构.md)
2. [diagram](docs/cs-basics/data-structure/图.md)
3. [heap](docs/cs-basics/data-structure/堆.md)
4. [tree](docs/cs-basics/data-structure/树.md) : focus on [red-black-tree](docs/cs-basics/data-structure/红黑树.md), B-, B+, B* tree, LSM tree
Other common data structures : 1.
1. [Bloom filter](docs/cs-basics/data-structure/bloom-filter.md)
### Algorithm
This part of the algorithm is very important, if you do not know how to learn the algorithm, you can look at what I wrote.
- [Recommended Algorithm Learning Books + Resources](https://www.zhihu.com/question/323359308/answer/1545320858) 。
- [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
**Summary of common algorithm problems** :
- [Several Common String Algorithm Questions Summarized ](docs/cs-basics/algorithms/几道常见的字符串算法题.md)
- [Summary of several common algorithm problems of the chain table ](docs/cs-basics/algorithms/几道常见的链表算法题.md)
- [Link offer some programming questions](docs/cs-basics/algorithms/剑指offer部分编程题.md)
In addition[GeeksforGeeks]( https://www.geeksforgeeks.org/fundamentals-of-algorithms/) This site summarizes the common algorithms, which are more comprehensive and systematic.
## Database
### MySQL
**Summary:**
1. [Database Basics Summary](docs/database/数据库基础知识.md)
2. **[MySQL Knowledge Summary](docs/database/mysql/mysql知识点&面试题总结.md)** (Must see:+1:)
5. [MySQL High Performance Optimization Specification Recommendations](docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md)
**Important knowledge points:**
1. [Transaction isolation level (graphic detail)](docs/database/mysql/transaction-isolation-level.md)
2. [MySQL's Three Major Logs (binlog, redo log and undo log) Explained](docs/database/mysql/mysql-logs.md)
3. [InnoDB storage engine implementation of MVCC](docs/database/mysql/innodb-implementation-of-mvcc.md)
4. [How does a SQL statement get executed in MySQL?](docs/database/mysql/how-sql-executed-in-mysql.md)
5. [Character set details: Why is it not recommended to use utf8 in MySQL?](docs/database/字符集.md)
6. [A little thought on how to store time in the database](docs/database/mysql/some-thoughts-on-database-storage-time.md)
### Redis
1. [Redis FAQ Summary](docs/database/redis/redis-questions-01.md)
2. [3 common cache read and write strategies](docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md)
## Search Engine
It is used to improve search efficiency and functions similarly to browser search engines. The more common search engines are Elasticsearch (recommended) and Solr.
## System design
### System design essential foundation
#### RESTful API
When we do back-end development, our main job is to provide APIs for front-end or other back-end services such as APIs for querying user data. a RESTful API is an API built on REST, and it is an API designed to be better used.
Related reading: [RestFul API Brief Tutorial](docs/system-design/basis/RESTfulAPI.md)
#### Name
During programming, you must pay attention to naming. Because a good naming is a comment, others will know what your variable, method or class does as soon as they see your naming!
Read more about: [Java Naming](docs/system-design/naming.md) 。
### Common frameworks
If you have not touched Java Web development, you can first look at my summary of [J2EE Basics](docs/system-design/J2EE基础知识.md). Although much of the content in this article is now obsolete, it will give you a deeper understanding of Java backend technology development.
#### Spring/SpringBoot (must see :+1:)
**Knowledge/Interview Questions:**
1. **[Spring FAQ Summary](docs/system-design/framework/spring/Spring常见问题总结.md)**
2. **[SpringBoot Getting Started Guide](https://github.com/Snailclimb/springboot-guide)**
**Important Knowledge Points Explained:** 1.
1. **[Spring/Spring Boot common annotations summary! Arrangement!](./docs/system-design/framework/spring/Spring&SpringBoot常用注解总结.md)**
2. **[Spring Transaction Summary](docs/system-design/framework/spring/Spring事务总结.md)**
3. [What design patterns are used in Spring?](docs/system-design/framework/spring/Spring设计模式总结.md)
4. **[SpringBoot auto-assembly principle?"](docs/system-design/framework/spring/SpringBoot自动装配原理.md)**
#### MyBatis
[MyBatis Common Interview Questions Summary](docs/system-design/framework/mybatis/mybatis-interview.md)
### Security
#### Certification Authorization
**[Fundamentals of Certification Authorization](docs/system-design/security/basis-of-authority-certification.md)** In this article I will introduce the common concepts of authentication and authorization: **Authentication**, **Authorization** and **Cookie**, **Session**, Token, **OAuth 2**, **SSO**. If you are not clear about these concepts, we suggest you read this article properly.
- **JWT** : JWT (JSON Web Token) is a form of authentication, where a JWT is essentially a signed piece of data in JSON format. Since it is signed, the recipient can verify its authenticity. Related reading.
- [JWT Pros and Cons Analysis and Solutions to Common Problems](docs/system-design/security/jwt优缺点分析以及常见问题解决方案.md)
- [Demo for beginners to get started with Spring Security With JWT](https://github.com/Snailclimb/spring-security-jwt-guide)
- **SSO(Single Sign On)**: **SSO(Single Sign On)** that is, single sign on means that a user has the right to access other systems related to him/her by logging into one of the multiple subsystems. For example, after we logged into Jingdong Finance, we also successfully logged into Jingdong Supermarket, Jingdong Home Appliances and other subsystems of Jingdong. Related reading: [**SSO Single Sign-On is enough to read this article! **](docs/system-design/security/sso-intro.md)
#### Data Desensitization
Data desensitization means that we deform sensitive information data according to specific rules, for example, we replace certain digits of cell phone numbers and ID numbers with *.
### Timed tasks
Recently, some friends asked about timing task related issues. So, I simply wrote an article to summarize some concepts of timed tasks and some common timed task technology options: ["Java Timed Tasks Revealed"].(./docs/system-design/定时任务.md)
## Distributed
### CAP theory and BASE theory
CAP is also the combination of the initials Consistency, Availability, and Partition Tolerance.
**BASE** is an acronym for **Basically Available**, **Soft-state**, and **Eventually Consistent**. The BASE theory is the result of a trade-off between consistency and availability in the CAP, and is derived from a summary of distributed practices for large-scale Internet systems, evolving from the CAP theorem, which significantly reduces our system requirements.
Related reading: [CAP Theory and BASE Theory Explained](docs/distributed-system/theorem&algorithm&protocol/cap&base-theorem.md)
### Paxos algorithm and Raft algorithm
The **Paxos algorithm** was born in 1990 as a classical algorithm for solving the consistency of distributed systems. However, since the Paxos algorithm was very difficult to understand and implement, there were continuous attempts to simplify it. Only in 2013 was a distributed consistency algorithm born that is easier to understand and implement than the Paxos algorithm - the **Raft algorithm**.
### RPC
RPC makes calling remote service calls as easy as calling local methods.
Dubbo is a home-grown RPC framework , open source by Ali . Related reading.
- [Dubbo FAQ Summary](docs/distributed-system/rpc/dubbo.md)
### API gateway
Gateways are mainly used for request forwarding, security authentication, protocol conversion, and disaster recovery.
Related reading.
- [Why gateways? What common gateway systems do you know of?](docs/distributed-system/api-gateway.md)
- [Design and Implementation of Shepherd, a 10 Billion Dollar API Gateway Service](https://tech.meituan.com/2021/05/20/shepherd-api-gateway.html)
### Distributed IDs
In complex distributed systems, a large amount of data and messages often need to be uniquely identified. For example, after the data volume is too large, it is often necessary to split the data into libraries and tables, and after the splitting of the libraries and tables, a unique ID is needed to identify a piece of data or a message, and the self-incrementing ID of the database obviously cannot meet the demand. Related reading: [Why distributed id? What are the distributed id generation solutions?](docs/distributed-system/distributed-id.md)
### Distributed transactions
** A distributed transaction is one in which the participants of the transaction, the server supporting the transaction, the resource server, and the transaction manager are located on different nodes of different distributed systems. **
Simply put, a large operation consists of different small operations that are distributed across different servers and belong to different applications, and the distributed transaction needs to guarantee that all of these small operations either succeed or fail. Essentially, distributed transactions are about ensuring data consistency across different databases.
### Distributed Orchestration
**ZooKeeper**.
> The first two articles may have content overlapping parts, we recommend reading them both.
1. [[Getting Started] Summary of ZooKeeper-related concepts](docs/distributed-system/分布式协调/zookeeper/zookeeper-intro.md)
2. [[Advanced] Summary of ZooKeeper Related Concepts](docs/distributed-system/分布式协调/zookeeper/zookeeper-plus.md)
3. [[Hands-on] ZooKeeper hands-on](docs/distributed-system/分布式协调/zookeeper/zookeeper-in-action.md)
## High performance
### Message Queues
Message queues are used in distributed systems primarily for decoupling and peak shaving. Related reading: [Message Queues FAQ Summary](docs/high-performance/message-queue/message-queue.md)。
1. **RabbitMQ** : [Getting Started with RabbitMQ](docs/high-performance/message-queue/rabbitmq-intro.md)
2. **RocketMQ** : [Getting Started with RocketMQ](docs/high-performance/message-queue/rocketmq-intro)、[A few simple questions and answers for RocketMQ](docs/high-performance/message-queue/rocketmq-questions.md)
3. **Kafka** : [Kafka FAQ Summary](docs/high-performance/message-queue/kafka知识点&面试题总结.md)
### Read-write separation & split database and split table
Read-write separation is mainly to separate the database read and write operations on different database nodes. The master server is responsible for writes and the slave server is responsible for reads. Alternatively, one master and one slave or one master and multiple slaves can be used.
Read-write separation can substantially improve read performance and marginally improve write performance. Therefore, read-write separation is more suitable for scenarios where there are more concurrent read requests from a single machine.
Library and table separation is to solve the problem of continuous database performance degradation due to the excessive amount of library and table data.
Common library and table splitting tools are: `sharding-jdbc` (Dangdang), `TSharding` (Mushroom Street), `MyCAT` (based on Cobar), `Cobar` (Alibaba).... We recommend using `sharding-jdbc`. Because, `sharding-jdbc` is a lightweight `Java` framework, served as a `jar` package, no extra O&M work for us, and good compatibility.
Related reading: [read-write separation & sharding summary of common problems](docs/high-performance/读写分离&分库分表.md)
### Load Balancing
Load balancing systems are often used to distribute tasks such as user request processing to multiple servers to improve the performance and reliability of a website, application or database.
Common load balancing systems include 3 types.
1. **DNS load balancing**: generally used to achieve geographic level balancing.
2. **Hardware Load Balancing**: Load balancing is achieved through a separate hardware device such as F5 (hardware is usually expensive).
3. **Software load balancing**: Load balancing is achieved by load balancing software such as Nginx.
## High Availability
Highly available describes a system that is available most of the time and can provide services to us. High availability means that the system is available even in the event of a hardware failure or system upgrade.
Related reading: **"[How to design a highly available system? What are the areas to consider?](docs/high-availability/高可用系统设计.md)》** 。
### Flow limiting
Flow limiting considers how to respond to system failures from the perspective of user access pressure.
The purpose of flow limiting is to limit the frequency of requests received by the server-side interface to prevent the service from hanging. For example, if an interface is limited to 100 requests per second, requests that exceed the limit are either dropped or placed in a queue for processing. Limiting the flow can effectively deal with the excessive number of burst requests. Related reading: [What is flow limiting? What are the flow limiting algorithms?](docs/high-availability/limit-request.md)
### Downgrading
Downgrading is the consideration of how to respond to system failures from the perspective of system functional priorities.
Service degradation refers to the strategic downgrading of some services and pages based on the current business situation and traffic when the server is under pressure, in order to free up server resources to ensure the normal operation of core tasks.
### Meltdown
Meltdown and degradation are two concepts that are easily confused and do not have the same meaning.
Downgrades are intended to deal with failures of the system itself, while meltdowns are intended to deal with failures of external systems or third-party systems on which the current system depends.
### Queuing
An alternative type of flow limitation, analogous to real-world queuing. If you've played League of Legends, you'll know that every time there's an event, you have to go through a queue to get into the game.
### Clustering
Deploy multiple copies of the same service to avoid single points of failure.
### Timeout and retry mechanism
** Once a user's request goes beyond a certain time without a response, the request is ended and an exception is thrown. ** Failure to set a timeout may result in slow response times, or even a buildup of requests that prevents the system from processing them.
In addition, the number of retries is generally set to 3. More retries will not be beneficial, but will add pressure to the server (some scenarios may not be suitable to use the failure retry mechanism).
### Disaster recovery design and offsite multi-live
**Disaster recovery** = disaster recovery + backup.
- **Backup** : Backup several copies of all important data generated by the system.
- **Disaster Tolerant** : Create two identical systems in offsite locations. When the system in one place suddenly hangs, the whole application system can be switched to the other one so that the system can provide services normally.
**Offsite Multi-Live** describes the deployment of services offsite and the simultaneous provisioning of services to the outside world. The main difference from traditional disaster recovery design is "multi-live", i.e., all sites are providing services to the public at the same time. Off-site multiplication is designed to deal with unexpected situations such as fires, earthquakes, and other natural or perceived disasters.
Related reading.
- [Read this article to understand off-site multi-live](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q)
- [Four steps to build offsite multi-live](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg)
- ["Learning Architecture from Scratch" - 28 | Guarantees for Highly Available Business: Offsite Multi-Live Architecture](http://gk.link/a/10pKZ)
## About the Author
- [Personal Introduction Q & A](https://javaguide.cn/about-the-author/)
- [I used to be an Internet addict too](https://javaguide.cn/about-the-author/internet-addiction-teenager/)
- [Feelings after one month of onboarding](https://javaguide.cn/about-the-author/feelings-after-one-month-of-induction-training/)
- [Feelings from graduation to six months of employment](https://javaguide.cn/about-the-author/feelings-of-half-a-year-from-graduation-to-entry/)
- [A training institution stole my article into a video also on the B station popular](https://javaguide.cn/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular/)
## Public
If you want to follow my updated articles and the dry goods I share in real time, you can follow my public number.
**《Java Interview Blitz》:** A PDF version of "Java Interview Blitz" derived from this document specifically for interviews [Public](#公众号) Reply back to **"Interview Blitz "** and get it for free!
<div align="center">
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
</div>
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3a2d826918a44bcbaa8d9272db3ad7d2~tplv-k3u1fbpfcp-watermark.image)

116
README.md
View File

@ -1,46 +1,39 @@
推荐你通过在线阅读网站进行阅读,体验更好,速度更快!
* **[JavaGuide 在线阅读网站(新版,推荐👍)](https://javaguide.cn/)**
* [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/)
- **[JavaGuide 在线阅读网站(新版,推荐 👍)](https://javaguide.cn/)**
- [JavaGuide 在线阅读版(老版)](https://snailclimb.gitee.io/javaguide/#/)
[<img src="https://oss.javaguide.cn/xingqiu/xingqiu.png" style="width:850px;margin: 0 auto" />](https://sourl.cn/e7ee87)
<div align="center">
<p>
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiu.png" style="margin: 0 auto; width: 850px;" />
</a>
</p>
<p>
<a href="https://github.com/Snailclimb/JavaGuide" target="_blank">
<img src="https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png" width="" />
</a>
</p>
<p>
<a href="https://javaguide.cn/"><img src="https://img.shields.io/badge/阅读-read-brightgreen.svg" alt="阅读" /></a>
<img src="https://img.shields.io/github/stars/Snailclimb/JavaGuide" alt="stars" />
<img src="https://img.shields.io/github/forks/Snailclimb/JavaGuide" alt="forks" />
<img src="https://img.shields.io/github/issues/Snailclimb/JavaGuide" alt="issues" />
</p>
<p>
<a href="https://github.com/Snailclimb/JavaGuide">Github</a> |
<a href="https://gitee.com/SnailClimb/JavaGuide">Gitee</a>
</p>
</div>
[![logo](https://oss.javaguide.cn/github/javaguide/csdn/1c00413c65d1995993bf2b0daf7b4f03.png)](https://github.com/Snailclimb/JavaGuide)
[![阅读](https://img.shields.io/badge/阅读-read-brightgreen.svg)](https://javaguide.cn/)
![Stars](https://img.shields.io/github/stars/Snailclimb/JavaGuide)
![forks](https://img.shields.io/github/forks/Snailclimb/JavaGuide)
![issues](https://img.shields.io/github/issues/Snailclimb/JavaGuide)
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
</div>
> 1. **面试专版** :准备面试的小伙伴可以考虑面试专版:[《Java 面试指北 》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html) (质量很高,专为面试打造,配合 JavaGuide 食用)。
> 1. **知识星球** :专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。
> 2. **转载须知** 以下所有文章如非文首说明为转载皆为我Guide 哥)的原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
> 1. **转载须知** 以下所有文章如非文首说明为转载皆为我Guide的原创转载在文首注明出处如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
<div align="center">
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
</div>
<!-- #region home -->
## 项目相关
* [项目介绍](./docs/javaguide/intro.md)
* [贡献指南](./docs/javaguide/contribution-guideline.md)
* [常见问题](./docs/javaguide/faq.md)
* [项目待办](./docs/javaguide/todo.md)
- [项目介绍](./docs/javaguide/intro.md)
- [贡献指南](./docs/javaguide/contribution-guideline.md)
- [常见问题](./docs/javaguide/faq.md)
- [项目待办](./docs/javaguide/todo.md)
## Java
@ -74,15 +67,15 @@
**源码分析**
* [ArrayList 源码+扩容机制分析](./docs/java/collection/arraylist-source-code.md)
* [HashMap(JDK1.8)源码+底层数据结构分析](./docs/java/collection/hashmap-source-code.md)
* [ConcurrentHashMap 源码+底层数据结构分析](./docs/java/collection/concurrent-hash-map-source-code.md)
- [ArrayList 源码+扩容机制分析](./docs/java/collection/arraylist-source-code.md)
- [HashMap(JDK1.8)源码+底层数据结构分析](./docs/java/collection/hashmap-source-code.md)
- [ConcurrentHashMap 源码+底层数据结构分析](./docs/java/collection/concurrent-hash-map-source-code.md)
### IO
* [IO 基础知识总结](./docs/java/io/io-basis.md)
* [IO 设计模式总结](./docs/java/io/io-design-patterns.md)
* [IO 模型详解](./docs/java/io/io-model.md)
- [IO 基础知识总结](./docs/java/io/io-basis.md)
- [IO 设计模式总结](./docs/java/io/io-design-patterns.md)
- [IO 模型详解](./docs/java/io/io-model.md)
### 并发
@ -148,10 +141,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
**重要知识点详解**
- [OSI 和 TCP/IP 网络分层模型详解(基础)](./docs/cs-basics/network/osi&tcp-ip-model.md)
- [OSI 和 TCP/IP 网络分层模型详解(基础)](./docs/cs-basics/network/osi-and-tcp-ip-model.md)
- [应用层常见协议总结(应用层)](./docs/cs-basics/network/application-layer-protocol.md)
- [HTTP vs HTTPS应用层](./docs/cs-basics/network/http&https.md)
- [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0&http1.1.md)
- [HTTP vs HTTPS应用层](./docs/cs-basics/network/http-vs-https.md)
- [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0-vs-http1.1.md)
- [HTTP 常见状态码(应用层)](./docs/cs-basics/network/http-status-codes.md)
- [DNS 域名系统详解(应用层)](./docs/cs-basics/network/dns.md)
- [TCP 三次握手和四次挥手(传输层)](./docs/cs-basics/network/tcp-connection-and-disconnection.md)
@ -166,7 +159,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
- [线性数据结构 :数组、链表、栈、队列](./docs/cs-basics/data-structure/linear-data-structure.md)
- [](./docs/cs-basics/data-structure/graph.md)
- [](./docs/cs-basics/data-structure/heap.md)
- [](./docs/cs-basics/data-structure/tree.md) :重点关注[红黑树](./docs/cs-basics/data-structure/red-black-tree.md)、B-B+B*树、LSM树
- [](./docs/cs-basics/data-structure/tree.md) :重点关注[红黑树](./docs/cs-basics/data-structure/red-black-tree.md)、B-B+B\*树、LSM
其他常用数据结构
@ -176,15 +169,15 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
* [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
* [如何刷Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
- [如何刷 Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
**常见算法问题总结**
* [几道常见的字符串算法题总结 ](./docs/cs-basics/algorithms/string-algorithm-problems.md)
* [几道常见的链表算法题总结 ](./docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
* [剑指 offer 部分编程题](./docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
* [十大经典排序算法](./docs/cs-basics/algorithms/10-classical-sorting-algorithms.md)
- [几道常见的字符串算法题总结 ](./docs/cs-basics/algorithms/string-algorithm-problems.md)
- [几道常见的链表算法题总结 ](./docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
- [剑指 offer 部分编程题](./docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
- [十大经典排序算法](./docs/cs-basics/algorithms/10-classical-sorting-algorithms.md)
另外,[GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。
@ -199,7 +192,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
- [SQL 语法基础知识总结](./docs/database/sql/sql-syntax-summary.md)
- [SQL 常见面试题总结](./docs/database/sql/sql-questions-01.md)
### MySQL
**知识点/面试题总结:**
@ -260,13 +252,13 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
### Docker
* [Docker 核心概念总结](./docs/tools/docker/docker-intro.md)
* [Docker 实战](./docs/tools/docker/docker-in-action.md)
- [Docker 核心概念总结](./docs/tools/docker/docker-intro.md)
- [Docker 实战](./docs/tools/docker/docker-in-action.md)
### Git
* [Git 核心概念总结](./docs/tools/git/git-intro.md)
* [Github 实用小技巧总结](./docs/tools/git/github-tips.md)
- [Git 核心概念总结](./docs/tools/git/git-intro.md)
- [Github 实用小技巧总结](./docs/tools/git/github-tips.md)
## 系统设计
@ -308,14 +300,13 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
- [认证授权基础概念详解](./docs/system-design/security/basis-of-authority-certification.md)
- [JWT 基础概念详解](./docs/system-design/security/jwt-intro.md)
- [JWT 优缺点分析以及常见问题解决方案](./docs/system-design/security/advantages&disadvantages-of-jwt.md)
- [JWT 优缺点分析以及常见问题解决方案](./docs/system-design/security/advantages-and-disadvantages-of-jwt.md)
- [SSO 单点登录详解](./docs/system-design/security/sso-intro.md)
- [权限系统设计详解](./docs/system-design/security/design-of-authority-system.md)
#### 数据脱敏
数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。
数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 \* 来代替。
#### 敏感词过滤
@ -333,10 +324,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
### 理论&算法&协议
- [CAP 理论和 BASE 理论详解](./docs/distributed-system/theorem&algorithm&protocol/cap&base-theorem.md)
- [Paxos 算法详解](./docs/distributed-system/theorem&algorithm&protocol/paxos-algorithm.md)
- [Raft 算法详解](./docs/distributed-system/theorem&algorithm&protocol/raft-algorithm.md)
- [Gossip 协议详解](./docs/distributed-system/theorem&algorithm&protocol/gossip-protocl.md)
- [CAP 理论和 BASE 理论详解](./docs/distributed-system/protocol/cap-and-base-theorem.md)
- [Paxos 算法详解](./docs/distributed-system/protocol/paxos-algorithm.md)
- [Raft 算法详解](./docs/distributed-system/protocol/raft-algorithm.md)
- [Gossip 协议详解](./docs/distributed-system/protocol/gossip-protocl.md)
### API 网关
@ -360,8 +351,8 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
### RPC
* [RPC 基础常见知识点&面试题总结](./docs/distributed-system/rpc/rpc-intro.md)
* [Dubbo 常见知识点&面试题总结](./docs/distributed-system/rpc/dubbo.md)
- [RPC 基础常见知识点&面试题总结](./docs/distributed-system/rpc/rpc-intro.md)
- [Dubbo 常见知识点&面试题总结](./docs/distributed-system/rpc/dubbo.md)
### ZooKeeper
@ -411,7 +402,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
### 降级&熔断
[降级&熔断详解](./docs/high-availability/fallback&circuit-breaker.md)
[降级&熔断详解](./docs/high-availability/fallback-and-circuit-breaker.md)
### 超时&重试
@ -425,14 +416,14 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
**灾备** = 容灾+备份。
* **备份** 将系统所产生的的所有重要数据多备份几份。
* **容灾** 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
- **备份** 将系统所产生的的所有重要数据多备份几份。
- **容灾** 在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
**异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。
## Star 趋势
![](https://api.star-history.com/svg?repos=Snailclimb/JavaGuide&type=Date)
![Stars](https://api.star-history.com/svg?repos=Snailclimb/JavaGuide&type=Date)
## 公众号
@ -440,3 +431,4 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
![JavaGuide 官方公众号](https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png)
<!-- #endregion home -->

View File

@ -1,14 +1,15 @@
import { defineUserConfig } from "vuepress";
import { themeConfig } from "./themeConfig";
import { searchPlugin } from "@vuepress/plugin-search";
import { searchProPlugin } from "vuepress-plugin-search-pro";
import theme from "./theme.js";
export default defineUserConfig({
dest: "./dist",
theme: themeConfig,
shouldPrefetch: false,
title: "JavaGuide(Java面试+学习指南)",
description:
"「Java学习指北+Java面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,复习 Java 知识点,首选 JavaGuide ",
head: [
// meta
["meta", { name: "robots", content: "all" }],
@ -43,28 +44,20 @@ export default defineUserConfig({
s.parentNode.insertBefore(hm, s);
})();`,
],
["link", { rel: "stylesheet", href: "/iconfont/iconfont.css" }],
["link", { rel: "icon", href: "/favicon.ico" }],
],
locales: {
"/": {
lang: "zh-CN",
},
},
plugins: [
searchPlugin({
// https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html
// 排除首页
isSearchable: (page) => page.path !== "/",
maxSuggestions: 10,
hotKeys: ["s", "/"],
// 用于在页面的搜索索引中添加额外字段
getExtraFields: () => [],
locales: {
"/": {
placeholder: "搜索",
},
},
}),
],
theme,
plugins: [searchProPlugin({ indexContent: true })],
pagePatterns: ["**/*.md", "!*.snippet.md", "!.vuepress", "!node_modules"],
shouldPrefetch: false,
});

View File

@ -1,10 +1,19 @@
import { navbar } from "vuepress-theme-hope";
export const navbarConfig = navbar([
export default navbar([
{ text: "面试指南", icon: "java", link: "/home.md" },
{
text: "知识星球",
icon: "code",
link: "/about-the-author/zhishixingqiu-two-years.md",
},
{ text: "开源项目", icon: "github", link: "/open-source-project/" },
{ text: "技术书籍", icon: "book", link: "/books/" },
{ text: "程序人生", icon: "article", link: "/high-quality-technical-articles/" },
{
text: "程序人生",
icon: "article",
link: "/high-quality-technical-articles/",
},
{
text: "网站相关",
icon: "about",

View File

@ -1,223 +0,0 @@
@font-face {
font-family: "iconfont"; /* Project id 2922463 */
src: url('iconfont.woff2?t=1660530571134') format('woff2'),
url('iconfont.woff?t=1660530571134') format('woff'),
url('iconfont.ttf?t=1660530571134') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-history:before {
content: "\e752";
}
.icon-experience:before {
content: "\e72b";
}
.icon-code:before {
content: "\e7fc";
}
.icon-interview:before {
content: "\e65d";
}
.icon-about:before {
content: "\e6e5";
}
.icon-search:before {
content: "\e7de";
}
.icon-featured:before {
content: "\e633";
}
.icon-codelibrary-fill:before {
content: "\e84b";
}
.icon-tool:before {
content: "\e70c";
}
.icon-highavailable:before {
content: "\ea23";
}
.icon-big-data:before {
content: "\e632";
}
.icon-work:before {
content: "\e8d7";
}
.icon-project:before {
content: "\e702";
}
.icon-article:before {
content: "\e672";
}
.icon-a-MachineLearning:before {
content: "\e617";
}
.icon-github:before {
content: "\e673";
}
.icon-rss:before {
content: "\e768";
}
.icon-mianshi:before {
content: "\e614";
}
.icon-et-performance:before {
content: "\e623";
}
.icon-virtual_machine:before {
content: "\e73f";
}
.icon-basic:before {
content: "\e67b";
}
.icon-container:before {
content: "\e641";
}
.icon-MQ:before {
content: "\e684";
}
.icon-redis:before {
content: "\e619";
}
.icon-mysql:before {
content: "\e613";
}
.icon-recommend:before {
content: "\e639";
}
.icon-chat:before {
content: "\e66a";
}
.icon-tips:before {
content: "\e62a";
}
.icon-chajian1:before {
content: "\e69d";
}
.icon-star:before {
content: "\e61d";
}
.icon-docker1:before {
content: "\e659";
}
.icon-zuozhe:before {
content: "\e688";
}
.icon-pdf:before {
content: "\e740";
}
.icon-suanfaku:before {
content: "\e63a";
}
.icon-jichushuju:before {
content: "\e60c";
}
.icon-people-network-full:before {
content: "\e865";
}
.icon-git:before {
content: "\e708";
}
.icon-luxianchaxun:before {
content: "\e622";
}
.icon-computer:before {
content: "\e601";
}
.icon-framework:before {
content: "\e69e";
}
.icon-Tools:before {
content: "\ed5f";
}
.icon-xitongsheji:before {
content: "\e63e";
}
.icon-database:before {
content: "\e8e4";
}
.icon-security-fill:before {
content: "\e78b";
}
.icon-docker:before {
content: "\e616";
}
.icon-java:before {
content: "\e6e0";
}
.icon-book:before {
content: "\e7c7";
}
.icon-network:before {
content: "\e67a";
}
.icon-caozuoxitong:before {
content: "\e686";
}
.icon-gaojixiaozuzhibeifen:before {
content: "\e756";
}
.icon-distributed-network:before {
content: "\e8d5";
}
.icon-intellijidea:before {
content: "\ebd1";
}

View File

@ -1,8 +1,10 @@
export const aboutTheAuthor = [
import { arraySidebar } from "vuepress-theme-hope";
export const aboutTheAuthor = arraySidebar([
{
text: "个人经历",
icon: "zuozhe",
collapsable: false,
collapsible: false,
children: [
"internet-addiction-teenager",
"my-college-life",
@ -14,7 +16,7 @@ export const aboutTheAuthor = [
{
text: "杂谈",
icon: "chat",
collapsable: false,
collapsible: false,
children: [
"writing-technology-blog-six-years",
"my-article-was-stolen-and-made-into-video-and-it-became-popular",
@ -22,4 +24,4 @@ export const aboutTheAuthor = [
"zhishixingqiu-two-years",
],
},
];
]);

View File

@ -1,4 +1,6 @@
export const books = [
import { arraySidebar } from "vuepress-theme-hope";
export const books = arraySidebar([
{
text: "计算机基础",
link: "cs-basics",
@ -30,4 +32,4 @@ export const books = [
link: "distributed-system",
icon: "distributed-network",
},
];
]);

View File

@ -1,9 +1,11 @@
export const highQualityTechnicalArticles = [
import { arraySidebar } from "vuepress-theme-hope";
export const highQualityTechnicalArticles = arraySidebar([
{
text: "练级攻略",
icon: "et-performance",
prefix: "advanced-programmer/",
collapsable: false,
collapsible: false,
children: [
"the-growth-strategy-of-the-technological-giant",
"seven-tips-for-becoming-an-advanced-programmer",
@ -14,10 +16,10 @@ export const highQualityTechnicalArticles = [
text: "个人经历",
icon: "experience",
prefix: "personal-experience/",
collapsable: false,
collapsible: false,
children: [
"four-year-work-in-tencent-summary",
"two-years-of-back-end-develop--experience-in-didi&toutiao",
"two-years-of-back-end-develop--experience-in-didi-and-toutiao",
"8-years-programmer-work-summary",
"huawei-od-275-days",
],
@ -26,7 +28,7 @@ export const highQualityTechnicalArticles = [
text: "程序员",
icon: "code",
prefix: "programmer/",
collapsable: false,
collapsible: false,
children: [
"how-do-programmers-publish-a-technical-book",
"efficient-book-publishing-and-practice-guide",
@ -36,7 +38,7 @@ export const highQualityTechnicalArticles = [
text: "面试",
icon: "interview",
prefix: "interview/",
collapsable: false,
collapsible: false,
children: [
"the-experience-of-get-offer-from-over-20-big-companies",
"the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer",
@ -52,10 +54,10 @@ export const highQualityTechnicalArticles = [
text: "工作",
icon: "work",
prefix: "work/",
collapsable: false,
collapsible: false,
children: [
"get-into-work-mode-quickly-when-you-join-a-company",
"employee-performance",
],
},
];
]);

View File

@ -1,10 +1,11 @@
import { sidebar } from "vuepress-theme-hope";
import { highQualityTechnicalArticles } from "./sidebar/high-quality-technical-articles";
import { aboutTheAuthor } from "./sidebar/about-the-author";
import { books } from "./sidebar/books";
import { openSourceProject } from "./sidebar/open-source-project";
export const sidebarConfig = sidebar({
import { aboutTheAuthor } from "./about-the-author.js";
import { books } from "./books.js";
import { highQualityTechnicalArticles } from "./high-quality-technical-articles.js";
import { openSourceProject } from "./open-source-project.js";
export default sidebar({
// 应该把更精确的路径放置在前边
"/open-source-project/": openSourceProject,
"/books/": books,
@ -25,6 +26,7 @@ export const sidebarConfig = sidebar({
prefix: "interview-preparation/",
children: [
"teach-you-how-to-prepare-for-the-interview-hand-in-hand",
"resume-guide",
"key-points-of-interview",
"project-experience-guide",
"interview-experience",
@ -173,10 +175,10 @@ export const sidebarConfig = sidebar({
icon: "star",
collapsible: true,
children: [
"osi&tcp-ip-model",
"osi-and-tcp-ip-model",
"application-layer-protocol",
"http&https",
"http1.0&http1.1",
"http-vs-https",
"http1.0-vs-http1.1",
"http-status-codes",
"dns",
"tcp-connection-and-disconnection",
@ -198,10 +200,7 @@ export const sidebarConfig = sidebar({
text: "Linux",
collapsible: true,
icon: "linux",
children: [
"linux-intro",
"shell-intro",
],
children: ["linux-intro", "shell-intro"],
},
],
},
@ -420,7 +419,7 @@ export const sidebarConfig = sidebar({
children: [
"basis-of-authority-certification",
"jwt-intro",
"advantages&disadvantages-of-jwt",
"advantages-and-disadvantages-of-jwt",
"sso-intro",
"design-of-authority-system",
"sentive-words-filter",
@ -442,9 +441,9 @@ export const sidebarConfig = sidebar({
{
text: "理论&算法&协议",
icon: "suanfaku",
prefix: "theorem&algorithm&protocol/",
prefix: "protocol/",
children: [
"cap&base-theorem",
"cap-and-base-theorem",
"paxos-algorithm",
"raft-algorithm",
"gossip-protocl",
@ -510,7 +509,7 @@ export const sidebarConfig = sidebar({
"high-availability-system-design",
"redundancy",
"limit-request",
"fallback&circuit-breaker",
"fallback-and-circuit-breaker",
"timeout-and-retry",
"performance-test",
],

View File

@ -1,4 +1,6 @@
export const openSourceProject = [
import { arraySidebar } from "vuepress-theme-hope";
export const openSourceProject = arraySidebar([
{
text: "技术教程",
link: "tutorial",
@ -34,4 +36,4 @@ export const openSourceProject = [
link: "big-data",
icon: "big-data",
},
];
]);

View File

@ -0,0 +1,5 @@
body {
@media (min-width: 1440px) {
font-size: 16px;
}
}

View File

@ -1,4 +1,3 @@
$theme-color: #2980B9;
$sidebar-width: 20rem;
$sidebar-mobile-width: 16rem;
$content-width: 60em;
$theme-color: #2980b9;
// $sidebar-width: 20rem;
// $sidebar-mobile-width: 16rem;

View File

@ -1,19 +1,31 @@
import { getDirname, path } from "@vuepress/utils";
import { hopeTheme } from "vuepress-theme-hope";
import { navbarConfig } from "./navbar";
import { sidebarConfig } from "./sidebar";
export const themeConfig = hopeTheme({
import navbar from "./navbar.js";
import sidebar from "./sidebar/index.js";
const __dirname = getDirname(import.meta.url);
export default hopeTheme({
logo: "/logo.png",
hostname: "https://javaguide.cn/",
iconAssets: "//at.alicdn.com/t/c/font_2922463_9aayheyb3v7.css",
author: {
name: "Guide",
url: "https://javaguide.cn/article/",
},
repo: "https://github.com/Snailclimb/JavaGuide",
docsDir: "docs",
iconAssets: "//at.alicdn.com/t/c/font_2922463_9aayheyb3v7.css",
navbar: navbarConfig,
sidebar: sidebarConfig,
navbar,
sidebar,
footer:
'<a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2020015769号-1</a>',
displayFooter: true,
pageInfo: [
"Author",
"Category",
@ -23,6 +35,7 @@ export const themeConfig = hopeTheme({
"Word",
"ReadingTime",
],
blog: {
intro: "/about-the-author/",
sidebarDisplay: "mobile",
@ -32,19 +45,33 @@ export const themeConfig = hopeTheme({
Gitee: "https://gitee.com/SnailClimb",
},
},
footer:
'<a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2020015769号-1</a>',
displayFooter: true,
plugins: {
blog: true,
copyright: true,
mdEnhance: {
align: true,
codetabs: true,
container: true,
figure: true,
include: {
resolvePath: (file, cwd) => {
if (file.startsWith("@"))
return path.resolve(
__dirname,
"../snippets",
file.replace("@", "./")
);
return path.resolve(cwd, file);
},
},
tasklist: true,
},
feed: {
atom: true,
json: true,
rss: true,
},
},
});

View File

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

View File

@ -3,6 +3,8 @@ title: 个人介绍 Q&A
category: 走近作者
---
<!-- @include: @small-advertisement.snippet.md -->
这篇文章我会通过 Q&A 的形式简单介绍一下我自己。
## 我是什么时候毕业的?
@ -45,11 +47,11 @@ category: 走近作者
![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2020-8/1d38ea3b-da2a-41df-9ac4-087356e9b5b4-20200802185910087.png)
## 为什么自称 Guide
## 为什么自称 Guide
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide哥**
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide**。
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide**。
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思给大家拆解一下就清楚了。SnailClimb=Snail蜗牛+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁

View File

@ -122,7 +122,7 @@ tag:
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
Markdown 规范请参考:**https://javaguide.cn/javaguide/contribution-guideline.html** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
Markdown 规范请参考:**<https://javaguide.cn/javaguide/contribution-guideline.html>** (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
## 有没有什么写作技巧分享?

View File

@ -4,6 +4,8 @@ category: 知识星球
star: 2
---
<!-- @include: @small-advertisement.snippet.md -->
时间过的真快,知识星球我已经平稳运行了 3 年有余了!
在 2019 年 12 月 29 号,经过了大概一年左右的犹豫期,我正式确定要开始做一个自己的星球。
@ -121,14 +123,18 @@ star: 2
## 如何加入?
![](https://oss.javaguide.cn/xingqiu/image-20220311203414600.png)
![知识星球](https://oss.javaguide.cn/xingqiu/image-20220311203414600.png)
如果你想要进知识星球的话建议你添加我的微信guidege666领取一个星球专属优惠券一定要备注“优惠卷”可以优惠 **30** 元,无任何套路,无任何潜在收费项。收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
你可以扫描上方的二维码原价加入(续费半价)。不过,我更建议你添加我的个人微信领取一个 **30** 元的星球专属优惠券(一定要备注“优惠卷”)。
**无任何套路,无任何潜在收费项。收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。用心做内容,不割韭菜!**
**一定要备注“优惠卷”**,不然通过不了。
![个人微信](https://oss.javaguide.cn/xingqiu/weixin-guidege666.jpeg)
进入星球之后,记得查看[星球使用指南](https://t.zsxq.com/0d18KSarv)(一定要看!) 。
随着时间推移,星球积累的干货资源越来越多,我花在星球上的时间也越来越多,星球的价格会逐步向上调整,想要加入的同学一定要尽早。
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款**

View File

@ -16,8 +16,6 @@ head:
![](https://oscimg.oschina.net/oscnet/up-e113c726a41874ef5fb19f7ac14e38e16ce.png)
如果你比较喜欢动手,对于理论知识比较抵触的话,推荐你看看[《如何开发一个简单的数据库》](https://cstack.github.io/db_tutorial/) ,这个 project 会手把手教你编写一个简单的数据库。
![](https://oscimg.oschina.net/oscnet/up-11de8cb239aa7201cc8d78fa28928b9ec7d.png)

View File

@ -18,9 +18,9 @@ icon: "distributed-network"
![](https://oss.javaguide.cn/github/javaguide/books/image-20220706121952258.png)
作者专门写了一篇文章来介绍这本书的背后的故事感兴趣的小伙伴可以自行查阅https://zhuanlan.zhihu.com/p/487534882 。
作者专门写了一篇文章来介绍这本书的背后的故事,感兴趣的小伙伴可以自行查阅:<https://zhuanlan.zhihu.com/p/487534882>
最后放上这本书的代码仓库和勘误地址https://github.com/tangwz/DistSysDeepDive 。
最后,放上这本书的代码仓库和勘误地址:<https://github.com/tangwz/DistSysDeepDive>
## 《数据密集型应用系统设计》

View File

@ -3,11 +3,7 @@ title: 技术书籍精选
category: 计算机书籍
---
::: tip 这是一则或许对你有用的小广告
👉 欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](./../about-the-author/zhishixingqiu-two-years.md),干货很多!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
👉 [《Java 面试指北》](./../zhuanlan/java-mian-shi-zhi-bei.md)持续更新完善中!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。
:::
<!-- @include: @small-advertisement.snippet.md -->
精选优质计算机书籍。

View File

@ -127,5 +127,5 @@ Bob 大叔将自己对整洁代码的理解浓缩在了这本书中,真可谓
最后再推荐两个相关的文档:
- **阿里巴巴 Java 开发手册** https://github.com/alibaba/p3c
- **Google Java 编程风格指南** http://www.hawstein.com/posts/google-java-style.html
- **阿里巴巴 Java 开发手册** <https://github.com/alibaba/p3c>
- **Google Java 编程风格指南** <http://www.hawstein.com/posts/google-java-style.html>

View File

@ -76,8 +76,8 @@ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
## 2. 翻转链表
### 题目描述
> 剑指 offer:输入一个链表,反转链表后,输出链表的所有元素。
![翻转链表](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-20/81431871.jpg)
@ -88,7 +88,6 @@ public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
### Solution
```java
public class ListNode {
int val;
@ -174,7 +173,6 @@ public class Solution {
首先两个节点/指针,一个节点 node1 先开始跑,指针 node1 跑到 k-1 个节点后,另一个节点 node2 开始跑,当 node1 跑到最后时node2 所指的节点就是倒数第 k 个节点也就是正数第(L-K+1)个节点。
### Solution
```java
@ -221,10 +219,8 @@ public class Solution {
}
```
## 4. 删除链表的倒数第 N 个节点
> Leetcode:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
**示例:**
@ -248,7 +244,6 @@ public class Solution {
### 问题分析
我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L - n + 1)个结点,其中 L 是列表的长度。只要我们找到列表的长度 L这个问题就很容易解决。
![图 1. 删除列表中的第 L - n + 1 个元素](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-20/94354387.jpg)
@ -301,11 +296,8 @@ public class Solution {
- **时间复杂度 O(L)** :该算法对列表进行了两次遍历,首先计算了列表的长度 LL 其次找到第 (L - n)(Ln) 个结点。 操作执行了 2L-n2Ln 步,时间复杂度为 O(L)O(L)。
- **空间复杂度 O(1)** :我们只用了常量级的额外空间。
**进阶——一次遍历法:**
> 链表中倒数第 N 个节点也就是正数第(L-N+1)个节点。
其实这种方法就和我们上面第四题找“链表中倒数第 k 个节点”所用的思想是一样的。**基本思路就是:** 定义两个节点 node1、node2;node1 节点先跑node1 节点 跑到第 n+1 个节点的时候,node2 节点开始跑.当 node1 节点跑到最后一个节点时node2 节点所在的位置就是第 L-n 个节点L 代表总链表长度,也就是倒数第 n+1 个节点)
@ -345,10 +337,6 @@ public class Solution {
}
```
## 5. 合并两个排序的链表
### 题目描述
@ -400,4 +388,3 @@ public ListNode Merge(ListNode list1,ListNode list2) {
}
}
```

View File

@ -116,7 +116,7 @@ int jumpFloor(int number) {
所以在 n>=2 的情况下:
f(n)=f(n-1)+f(n-2)+...+f(1)
因为 f(n-1)=f(n-2)+f(n-3)+...+f(1)
所以f(n)=2*f(n-1) 又f(1)=1,所以可得**f(n)=2^(number-1)**
所以 f(n)=2\*f(n-1) 又 f(1)=1,所以可得**f(n)=2^(number-1)**
**示例代码:**
@ -140,7 +140,6 @@ int b = a << 2;//左移2等同于16 * 2的2次方也就是16 * 4
int c = a >> 2;//右移2等同于16 / 2的2次方也就是16 / 4
```
## 二维数组查找
**题目描述:**
@ -228,12 +227,9 @@ public String replaceSpace(StringBuffer str) {
**问题解析:**
这道题算是比较麻烦和难一点的一个了。我这里采用的是**二分幂**思想,当然也可以采用**快速幂**。
更具剑指offer书中细节该题的解题思路如下
1.当底数为0且指数<0时会出现对0求倒数的情况需进行错误处理设置一个全局变量
2.判断底数是否等于0由于base为double型所以不能直接用==判断
3.优化求幂函数(二分幂)。
当n为偶数a^n =a^n/2*a^n/2
当n为奇数a^n = a^[(n-1)/2] * a^[(n-1)/2] * a。时间复杂度O(logn)
更具剑指 offer 书中细节,该题的解题思路如下: 1.当底数为 0 且指数<0 会出现对 0 求倒数的情况需进行错误处理设置一个全局变量 2.判断底数是否等于 0由于 base double 所以不能直接用==判断 3.优化求幂函数二分幂
当 n 为偶数a^n =a^n/2_a^n/2
当 n 为奇数a^n = a^[(n-1)/2] _ a^[(n-1)/2] \* a。时间复杂度 O(logn)
**时间复杂度**O(logn)

View File

@ -57,7 +57,6 @@ tag:
1. 判断给定数据是否存在比如判断一个数字是否存在于包含大量数字的数字集中数字集很大5 亿以上!)、 防止缓存穿透(判断请求的数据是否有效避免直接绕过缓存请求数据库)等等、邮箱的垃圾邮件过滤、黑名单功能等等。
2. 去重:比如爬给定网址的时候对已经爬取过的 URL 去重。
## 编码实战
### 通过 Java 编程手动实现布隆过滤器
@ -245,9 +244,9 @@ Redis v4.0 之后有了 Module模块/插件) 功能Redis Modules 让 Red
另外,官网推荐了一个 RedisBloom 作为 Redis 布隆过滤器的 Module地址https://github.com/RedisBloom/RedisBloom
其他还有:
* redis-lua-scaling-bloom-filterlua 脚本实现https://github.com/erikdubbelboer/redis-lua-scaling-bloom-filter
* pyreBloomPython 中的快速 Redis 布隆过滤器) https://github.com/seomoz/pyreBloom
* ......
- redis-lua-scaling-bloom-filterlua 脚本实现https://github.com/erikdubbelboer/redis-lua-scaling-bloom-filter
- pyreBloomPython 中的快速 Redis 布隆过滤器) https://github.com/seomoz/pyreBloom
- ......
RedisBloom 提供了多种语言的客户端支持包括Python、Java、JavaScript 和 PHP。
@ -287,7 +286,7 @@ root@21396d02c252:/data# redis-cli
可选参数:
* expansion如果创建了一个新的子过滤器则其大小将是当前过滤器的大小乘以`expansion`。默认扩展值为 2。这意味着每个后续子过滤器将是前一个子过滤器的两倍。
- expansion如果创建了一个新的子过滤器则其大小将是当前过滤器的大小乘以`expansion`。默认扩展值为 2。这意味着每个后续子过滤器将是前一个子过滤器的两倍。
### 实际使用

View File

@ -25,21 +25,25 @@ tag:
## 图的基本概念
### 顶点
图中的数据元素,我们称之为顶点,图至少有一个顶点(非空有穷集合)
对应到好友关系图,每一个用户就代表一个顶点。
### 边
顶点之间的关系用边表示。
对应到好友关系图,两个用户是好友的话,那两者之间就存在一条边。
### 度
度表示一个顶点包含多少条边,在有向图中,还分为出度和入度,出度表示从该顶点出去的边的条数,入度表示进入该顶点的边的条数。
对应到好友关系图,度就代表了某个人的好友数量。
### 无向图和有向图
边表示的是顶点之间的关系有的关系是双向的比如同学关系A 是 B 的同学,那么 B 也肯定是 A 的同学,那么在表示 A 和 B 的关系时,就不用关注方向,用不带箭头的边表示,这样的图就是无向图。
有的关系是有方向的比如父子关系师生关系微博的关注关系A 是 B 的爸爸,但 B 肯定不是 A 的爸爸A 关注 BB 不一定关注 A。在这种情况下我们就用带箭头的边表示二者的关系这样的图就是有向图。
@ -55,7 +59,9 @@ tag:
![带权有向图](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/weighted-directed-graph.png)
## 图的存储
### 邻接矩阵存储
邻接矩阵将图用二维矩阵存储,是一种较为直观的表示方式。
如果第 i 个顶点和第 j 个顶点之间有关系,且关系权值为 n`A[i][j]=n`
@ -86,7 +92,9 @@ tag:
- 在有向图中,邻接表元素个数等于边的条数,如右图所示的有向图中,边的条数为 8邻接表存储的元素个数为 8。
## 图的搜索
### 广度优先搜索
广度优先搜索就像水面上的波纹一样一层一层向外扩展,如下图所示:
![广度优先搜索图示](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/breadth-first-search.png)
@ -123,7 +131,6 @@ tag:
![深度优先搜索图示](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/depth-first-search.png)
**和广度优先搜索类似,深度优先搜索的具体实现用到了另一种线性数据结构——栈** 。具体过程如下图所示:
**第 1 步:**
@ -149,4 +156,3 @@ tag:
**第 6 步:**
![深度优先搜索6](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/depth-first-search6.png)

View File

@ -28,6 +28,7 @@ tag:
第 3 个不是,第三个中,根结点 1 比 2 和 15 小,而 15 却比 3 大19 比 5 大,不满足堆的性质。
## 堆的用途
当我们只关心所有数据中的最大值或者最小值,存在多次获取最大值或者最小值,多次插入或删除数据时,就可以使用堆。
有小伙伴可能会想到用有序数组,初始化一个有序数组时间复杂度是 `O(nlog(n))`,查找最大值或者最小值时间复杂度都是 `O(1)`,但是,涉及到更新(插入或删除)数据时,时间复杂度为 `O(n)`,即使是使用复杂度为 `O(log(n))` 的二分法找到要插入或者删除的数据,在移动数据时也需要 `O(n)` 的时间复杂度。
@ -39,6 +40,7 @@ tag:
## 堆的分类
堆分为 **最大堆****最小堆**。二者的区别在于节点的排序方式。
- **最大堆** :堆中的每一个节点的值都大于等于子树中所有节点的值
- **最小堆** :堆中的每一个节点的值都小于等于子树中所有节点的值
@ -46,8 +48,8 @@ tag:
![](./pictures/堆/堆2.png)
## 堆的存储
之前介绍树的时候说过,由于完全二叉树的优秀性质,利用数组存储二叉树即节省空间,又方便索引(若根结点的序号为 1那么对于树中任意节点 i其左子节点序号为 `2*i`,右子节点序号为 `2*i+1`)。
为了方便存储和索引,(二叉)堆可以用完全二叉树的形式进行存储。存储的方式如下图所示:
@ -55,9 +57,13 @@ tag:
![堆的存储](./pictures/堆/堆的存储.png)
## 堆的操作
堆的更新操作主要包括两种 : **插入元素****删除堆顶元素**。操作过程需要着重掌握和理解。
> 在进入正题之前,再重申一遍,堆是一个公平的公司,有能力的人自然会走到与他能力所匹配的位置
### 插入元素
> 插入元素,作为一个新入职的员工,初来乍到,这个员工需要从基层做起
**1.将要插入的元素放到最后**
@ -87,18 +93,14 @@ tag:
首先删除堆顶元素,使得数组中下标为 1 的位置空出。
![删除堆顶元素1](./pictures/堆/删除堆顶元素1.png)
> 那么他的位置由谁来接替呢,当然是他的直接下属了,谁能力强就让谁上呗
比较根结点的左子节点和右子节点,也就是下标为 2,3 的数组元素,将较大的元素填充到根结点(下标为 1)的位置。
![删除堆顶元素2](./pictures/堆/删除堆顶元素2.png)
> 这个时候又空出一个位置了,老规矩,谁有能力谁上
一直循环比较空出位置的左右子节点,并将较大者移至空位,直到堆的最底部
@ -108,6 +110,7 @@ tag:
这个时候已经完成了自底向上的堆化,没有元素可以填补空缺了,但是,我们可以看到数组中出现了“气泡”,这会导致存储空间的浪费。接下来我们试试自顶向下堆化。
#### 自顶向下堆化
自顶向下的堆化用一个词形容就是“石沉大海”,那么第一件事情,就是把石头抬起来,从海面扔下去。这个石头就是堆的最后一个元素,我们将最后一个元素移动到堆顶。
![删除堆顶元素4](./pictures/堆/删除堆顶元素4.png)
@ -118,14 +121,11 @@ tag:
![删除堆顶元素6](./pictures/堆/删除堆顶元素6.png)
### 堆的操作总结
- **插入元素** :先将元素放至数组末尾,再自底向上堆化,将末尾元素上浮
- **删除堆顶元素** :删除堆顶元素,将末尾元素放至堆顶,再自顶向下堆化,将堆顶元素下沉。也可以自底向上堆化,只是会产生“气泡”,浪费存储空间。最好采用自顶向下堆化的方式。
## 堆排序
堆排序的过程分为两步:

View File

@ -19,4 +19,3 @@ tag:
**为什么要用红黑树?** 简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。详细了解可以查看 [漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)
**相关阅读** [《红黑树深入剖析及 Java 实现》](https://zhuanlan.zhihu.com/p/24367771)(美团点评技术团队)

View File

@ -38,7 +38,7 @@ tag:
**二叉树** 的分支通常被称作“**左子树**”或“**右子树**”。并且,**二叉树** 的分支具有左右次序,不能随意颠倒。
**二叉树** 的第 i 层至多拥有 `2^(i-1)` 个节点,深度为 k 的二叉树至多总共有 `2^(k+1)-1` 个节点(满二叉树的情况),至少有 2^(k) 个节点(关于节点的深度的定义国内争议比较多,我个人比较认可维基百科对[节点深度的定义](https://zh.wikipedia.org/wiki/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)#/%E6%9C%AF%E8%AF%AD))。
**二叉树** 的第 i 层至多拥有 `2^(i-1)` 个节点,深度为 k 的二叉树至多总共有 `2^(k+1)-1` 个节点(满二叉树的情况),至少有 2^(k) 个节点(关于节点的深度的定义国内争议比较多,我个人比较认可维基百科对[节点深度的定义](<https://zh.wikipedia.org/wiki/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)#/%E6%9C%AF%E8%AF%AD>))。
![危机百科对节点深度的定义](https://oss.javaguide.cn/github/javaguide/image-20220119112736158.png)
@ -48,8 +48,6 @@ tag:
![满二叉树](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/full-binary-tree.png)
### 完全二叉树
除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则这个二叉树就是 **完全二叉树**

View File

@ -5,8 +5,6 @@ tag:
- 计算机网络
---
## HTTP:超文本传输协议
**超文本传输协议HTTPHyperText Transfer Protocol)** 是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。

View File

@ -5,7 +5,6 @@ tag:
- 计算机网络
---
本文是我在大二学习计算机网络期间整理, 大部分内容都来自于谢希仁老师的[《计算机网络》第七版 ](https://www.elias.ltd/usr/local/etc/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%EF%BC%88%E7%AC%AC7%E7%89%88%EF%BC%89%E8%B0%A2%E5%B8%8C%E4%BB%81.pdf)这本书。为了内容更容易理解,我对之前的整理进行了一波重构,并配上了一些相关的示意图便于理解。
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fb5d8645cd55484ab0177f25a13e97db~tplv-k3u1fbpfcp-zoom-1.image)

View File

@ -68,4 +68,3 @@ HTTP 状态码用于描述 HTTP 请求的结果比如2xx 就代表请求被
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
- https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
- https://segmentfault.com/a/1190000018264501

View File

@ -61,7 +61,7 @@ SSL/TLS 的核心要素是**非对称加密**。非对称加密采用两个密
>
> 这样,通信信息就不会被其他人截获了,这依赖于私钥的保密性。
![](./images/http&https/public-key-cryptography.png)
![](./images/http-vs-https/public-key-cryptography.png)
非对称加密的公钥和私钥需要采用一种复杂的数学机制生成(密码学认为,为了较高的安全性,尽量不要自己创造加密方案)。公私钥对的生成算法依赖于单向陷门函数。
@ -69,7 +69,7 @@ SSL/TLS 的核心要素是**非对称加密**。非对称加密采用两个密
>
> 单向陷门函数:一个较弱的单向函数。已知单向陷门函数 f陷门 h给定任意一个输入 x易计算出输出 y=f(x;h);而给定一个输出 y假设存在 f(x;h)=y很难根据 f 来计算出 x但可以根据 f 和 h 来推导出 x。
![单向函数](./images/http&https/OWF.png)
![单向函数](./images/http-vs-https/OWF.png)
上图就是一个单向函数(不是单项陷门函数),假设有一个绝世秘籍,任何知道了这个秘籍的人都可以把苹果汁榨成苹果,那么这个秘籍就是“陷门”了吧。
@ -81,7 +81,7 @@ SSL/TLS 的核心要素是**非对称加密**。非对称加密采用两个密
> 对称加密:通信双方共享唯一密钥 k加解密算法已知加密方利用密钥 k 加密,解密方利用密钥 k 解密,保密性依赖于密钥 k 的保密性。
![](./images/http&https/symmetric-encryption.png)
![](./images/http-vs-https/symmetric-encryption.png)
对称加密的密钥生成代价比公私钥对的生成代价低得多,那么有的人会问了,为什么 SSL/TLS 还需要使用非对称加密呢?因为对称加密的保密性完全依赖于密钥的保密性。在双方通信之前,需要商量一个用于对称加密的密钥。我们知道网络通信的信道是不安全的,传输报文对任何人是可见的,密钥的交换肯定不能直接在网络信道中传输。因此,使用非对称加密,对对称加密的密钥进行加密,保护该密钥不在网络信道中被窃听。这样,通信双方只需要一次非对称加密,交换对称加密的密钥,在之后的信息通信中,使用绝对安全的密钥,对信息进行对称加密,即可保证传输消息的保密性。
@ -99,7 +99,7 @@ SSL/TLS 介绍到这里,了解信息安全的朋友又会想到一个安全隐
>
> 同样的S 公钥即使做加密也难以避免这种信任性问题C 被 AS 拐跑了!
![](./images/http&https/attack1.png)
![](./images/http-vs-https/attack1.png)
为了公钥传输的信赖性问题第三方机构应运而生——证书颁发机构CACertificate Authority。CA 默认是受信任的第三方。CA 会给各个服务器颁发证书,证书存储在服务器上,并附有 CA 的**电子签名**(见下节)。
@ -117,7 +117,7 @@ SSL/TLS 介绍到这里,了解信息安全的朋友又会想到一个安全隐
>
> 客户端对证书数据(包含服务器的公钥)做相同的散列处理,得到摘要,并将该摘要与之前从签名中解码出的摘要做对比,如果相同,则身份验证成功;否则验证失败。
![](./images/http&https/digital-signature.png)
![](./images/http-vs-https/digital-signature.png)
总结来说,带有证书的公钥传输机制如下:
@ -127,7 +127,7 @@ SSL/TLS 介绍到这里,了解信息安全的朋友又会想到一个安全隐
4. C 获得 S 的证书,信任 CA 并知晓 CA 公钥,使用 CA 公钥对 S 证书上的签名解密,同时对消息进行散列处理,得到摘要。比较摘要,验证 S 证书的真实性。
5. 如果 C 验证 S 证书是真实的,则信任 S 的公钥(在 S 证书中)。
![](./images/http&https/public-key-transmission.png)
![](./images/http-vs-https/public-key-transmission.png)
对于数字签名,我这里讲的比较简单,如果你没有搞清楚的话,强烈推荐你看看[数字签名及数字证书原理](https://www.bilibili.com/video/BV18N411X7ty/)这个视频,这是我看过最清晰的讲解。
@ -138,6 +138,3 @@ SSL/TLS 介绍到这里,了解信息安全的朋友又会想到一个安全隐
- **端口号** HTTP 默认是 80HTTPS 默认是 443。
- **URL 前缀** HTTP 的 URL 前缀是 `http://`HTTPS 的 URL 前缀是 `https://`
- **安全性和资源消耗** HTTP 协议运行在 TCP 之上所有传输的内容都是明文客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密加密采用对称加密但对称加密的密钥用服务器方的证书进行了非对称加密。所以说HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。

View File

@ -1,105 +0,0 @@
---
title: HTTP 1.0 vs HTTP 1.1(应用层)
category: 计算机基础
tag:
- 计算机网络
---
这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1
- 响应状态码
- 缓存处理
- 连接方式
- Host头处理
- 带宽优化
## 响应状态码
HTTP/1.0仅定义了16种状态码。HTTP/1.1中新加入了大量的状态码光是错误响应状态码就新增了24种。比如说`100 (Continue)`——在请求大资源前的预热请求,`206 (Partial Content)`——范围请求的标识码,`409 (Conflict)`——请求与当前资源的规定冲突,`410 (Gone)`——资源已被永久转移,而且没有任何已知的转发地址。
## 缓存处理
缓存技术通过避免用户与源服务器的频繁交互,节约了大量的网络带宽,降低了用户接收信息的延迟。
### HTTP/1.0
HTTP/1.0提供的缓存机制非常简单。服务器端使用`Expires`标签来标志(时间)一个响应体,在`Expires`标志时间内的请求,都会获得该响应体缓存。服务器端在初次返回给客户端的响应体中,有一个`Last-Modified`标签,该标签标记了被请求资源在服务器端的最后一次修改。在请求头中,使用`If-Modified-Since`标签,该标签标志一个时间,意为客户端向服务器进行问询:“该时间之后,我要请求的资源是否有被修改过?”通常情况下,请求头中的`If-Modified-Since`的值即为上一次获得该资源时,响应体中的`Last-Modified`的值。
如果服务器接收到了请求头,并判断`If-Modified-Since`时间后,资源确实没有修改过,则返回给客户端一个`304 not modified`响应头,表示”缓冲可用,你从浏览器里拿吧!”。
如果服务器判断`If-Modified-Since`时间后,资源被修改过,则返回给客户端一个`200 OK`的响应体,并附带全新的资源内容,表示”你要的我已经改过的,给你一份新的”。
![HTTP1.0cache1](./images/http&https/HTTP1.0cache1.png)
![HTTP1.0cache2](./images/http&https/HTTP1.0cache2.png)
### HTTP/1.1
HTTP/1.1的缓存机制在HTTP/1.0的基础上大大增加了灵活性和扩展性。基本工作原理和HTTP/1.0保持不变,而是增加了更多细致的特性。其中,请求头中最常见的特性就是`Cache-Control`详见MDN Web文档 [Cache-Control](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control).
## 连接方式
**HTTP/1.0 默认使用短连接** ,也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源浏览器就会重新建立一个TCP连接这样就会导致有大量的“握手报文”和“挥手报文”占用了带宽。
**为了解决 HTTP/1.0 存在的资源浪费的问题, HTTP/1.1 优化为默认长连接模式 。** 采用长连接模式的请求报文会通知服务端“我向你请求连接并且连接成功建立后请不要关闭”。因此该TCP连接将持续打开为后续的客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
如果 TCP 连接一直保持的话也是对资源的浪费,因此,一些服务器软件(如 Apache还会支持超时时间的时间。在超时时间之内没有新的请求达到TCP 连接才会被关闭。
有必要说明的是HTTP/1.0仍提供了长连接选项,即在请求头中加入`Connection: Keep-alive`。同样的在HTTP/1.1中,如果不希望使用长连接选项,也可以在请求头中加入`Connection: close`,这样会通知服务器端:“我不需要长连接,连接成功后即可关闭”。
**HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。**
**实现长连接需要客户端和服务端都支持长连接。**
## Host头处理
域名系统DNS允许多个主机名绑定到同一个IP地址上但是HTTP/1.0并没有考虑这个问题假设我们有一个资源URL是http://example1.org/home.htmlHTTP/1.0的请求报文中,将会请求的是`GET /home.html HTTP/1.0`.也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。
因此HTTP/1.1在请求头中加入了`Host`字段。加入`Host`字段的报文头部将会是:
```
GET /home.html HTTP/1.1
Host: example1.org
```
这样,服务器端就可以确定客户端想要请求的真正的网址了。
## 带宽优化
### 范围请求
HTTP/1.1引入了范围请求range request机制以避免带宽的浪费。当客户端想请求一个文件的一部分或者需要继续下载一个已经下载了部分但被终止的文件HTTP/1.1可以在请求中加入`Range`头部,以请求(并只能请求字节型数据)数据的一部分。服务器端可以忽略`Range`头部,也可以返回若干`Range`响应。
如果一个响应包含部分数据的话,那么将带有`206 (Partial Content)`状态码。该状态码的意义在于避免了HTTP/1.0代理缓存错误地把该响应认为是一个完整的数据响应,从而把他当作为一个请求的响应缓存。
在范围响应中,`Content-Range`头部标志指示出了该数据块的偏移量和数据块的长度。
### 状态码100
HTTP/1.1中新加入了状态码`100`。该状态码的使用场景为,存在某些较大的文件请求,服务器可能不愿意响应这种请求,此时状态码`100`可以作为指示请求是否会被正常响应,过程如下图:
![HTTP1.1continue1](./images/http&https/HTTP1.1continue1.png)
![HTTP1.1continue2](./images/http&https/HTTP1.1continue2.png)
然而在HTTP/1.0中,并没有`100 (Continue)`状态码,要想触发这一机制,可以发送一个`Expect`头部,其中包含一个`100-continue`的值。
### 压缩
许多格式的数据在传输时都会做预压缩处理。数据的压缩可以大幅优化带宽的利用。然而HTTP/1.0对数据压缩的选项提供的不多不支持压缩细节的选择也无法区分端到端end-to-end压缩或者是逐跳hop-by-hop压缩。
HTTP/1.1则对内容编码content-codings和传输编码transfer-codings做了区分。内容编码总是端到端的传输编码总是逐跳的。
HTTP/1.0包含了`Content-Encoding`头部对消息进行端到端编码。HTTP/1.1加入了`Transfer-Encoding`头部可以对消息进行逐跳传输编码。HTTP/1.1还加入了`Accept-Encoding`头部,是客户端用来指示他能处理什么样的内容编码。
## 总结
1. **连接方式** : HTTP 1.0 为短连接HTTP 1.1 支持长连接。
1. **状态响应码** : HTTP/1.1中新加入了大量的状态码光是错误响应状态码就新增了24种。比如说`100 (Continue)`——在请求大资源前的预热请求,`206 (Partial Content)`——范围请求的标识码,`409 (Conflict)`——请求与当前资源的规定冲突,`410 (Gone)`——资源已被永久转移,而且没有任何已知的转发地址。
1. **缓存处理** : 在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准HTTP1.1 则引入了更多的缓存控制策略例如 Entity tagIf-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
1. **带宽优化及网络连接的使用** :HTTP1.0 中存在一些浪费带宽的现象例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了并且不支持断点续传功能HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206Partial Content这样就方便了开发者自由的选择以便于充分利用带宽和连接。
1. **Host头处理** : HTTP/1.1在请求头中加入了`Host`字段。
## 参考资料
[Key differences between HTTP/1.0 and HTTP/1.1](http://www.ra.ethz.ch/cdstore/www8/data/2136/pdf/pd1.pdf)

View File

@ -0,0 +1,105 @@
---
title: HTTP 1.0 vs HTTP 1.1(应用层)
category: 计算机基础
tag:
- 计算机网络
---
这篇文章会从下面几个维度来对比 HTTP 1.0 和 HTTP 1.1
- 响应状态码
- 缓存处理
- 连接方式
- Host 头处理
- 带宽优化
## 响应状态码
HTTP/1.0 仅定义了 16 种状态码。HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,`100 (Continue)`——在请求大资源前的预热请求,`206 (Partial Content)`——范围请求的标识码,`409 (Conflict)`——请求与当前资源的规定冲突,`410 (Gone)`——资源已被永久转移,而且没有任何已知的转发地址。
## 缓存处理
缓存技术通过避免用户与源服务器的频繁交互,节约了大量的网络带宽,降低了用户接收信息的延迟。
### HTTP/1.0
HTTP/1.0 提供的缓存机制非常简单。服务器端使用`Expires`标签来标志(时间)一个响应体,在`Expires`标志时间内的请求,都会获得该响应体缓存。服务器端在初次返回给客户端的响应体中,有一个`Last-Modified`标签,该标签标记了被请求资源在服务器端的最后一次修改。在请求头中,使用`If-Modified-Since`标签,该标签标志一个时间,意为客户端向服务器进行问询:“该时间之后,我要请求的资源是否有被修改过?”通常情况下,请求头中的`If-Modified-Since`的值即为上一次获得该资源时,响应体中的`Last-Modified`的值。
如果服务器接收到了请求头,并判断`If-Modified-Since`时间后,资源确实没有修改过,则返回给客户端一个`304 not modified`响应头,表示”缓冲可用,你从浏览器里拿吧!”。
如果服务器判断`If-Modified-Since`时间后,资源被修改过,则返回给客户端一个`200 OK`的响应体,并附带全新的资源内容,表示”你要的我已经改过的,给你一份新的”。
![HTTP1.0cache1](./images/http-vs-https/HTTP1.0cache1.png)
![HTTP1.0cache2](./images/http-vs-https/HTTP1.0cache2.png)
### HTTP/1.1
HTTP/1.1 的缓存机制在 HTTP/1.0 的基础上,大大增加了灵活性和扩展性。基本工作原理和 HTTP/1.0 保持不变,而是增加了更多细致的特性。其中,请求头中最常见的特性就是`Cache-Control`,详见 MDN Web 文档 [Cache-Control](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control).
## 连接方式
**HTTP/1.0 默认使用短连接** ,也就是说,客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(如 JavaScript 文件、图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会重新建立一个 TCP 连接,这样就会导致有大量的“握手报文”和“挥手报文”占用了带宽。
**为了解决 HTTP/1.0 存在的资源浪费的问题, HTTP/1.1 优化为默认长连接模式 。** 采用长连接模式的请求报文会通知服务端:“我向你请求连接,并且连接成功建立后,请不要关闭”。因此,该 TCP 连接将持续打开,为后续的客户端-服务端的数据交互服务。也就是说在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
如果 TCP 连接一直保持的话也是对资源的浪费,因此,一些服务器软件(如 Apache还会支持超时时间的时间。在超时时间之内没有新的请求达到TCP 连接才会被关闭。
有必要说明的是HTTP/1.0 仍提供了长连接选项,即在请求头中加入`Connection: Keep-alive`。同样的,在 HTTP/1.1 中,如果不希望使用长连接选项,也可以在请求头中加入`Connection: close`,这样会通知服务器端:“我不需要长连接,连接成功后即可关闭”。
**HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接。**
**实现长连接需要客户端和服务端都支持长连接。**
## Host 头处理
域名系统DNS允许多个主机名绑定到同一个 IP 地址上,但是 HTTP/1.0 并没有考虑这个问题,假设我们有一个资源 URL 是http://example1.org/home.htmlHTTP/1.0的请求报文中,将会请求的是`GET /home.html HTTP/1.0`.也就是不会加入主机名。这样的报文送到服务器端,服务器是理解不了客户端想请求的真正网址。
因此HTTP/1.1 在请求头中加入了`Host`字段。加入`Host`字段的报文头部将会是:
```
GET /home.html HTTP/1.1
Host: example1.org
```
这样,服务器端就可以确定客户端想要请求的真正的网址了。
## 带宽优化
### 范围请求
HTTP/1.1 引入了范围请求range request机制以避免带宽的浪费。当客户端想请求一个文件的一部分或者需要继续下载一个已经下载了部分但被终止的文件HTTP/1.1 可以在请求中加入`Range`头部,以请求(并只能请求字节型数据)数据的一部分。服务器端可以忽略`Range`头部,也可以返回若干`Range`响应。
如果一个响应包含部分数据的话,那么将带有`206 (Partial Content)`状态码。该状态码的意义在于避免了 HTTP/1.0 代理缓存错误地把该响应认为是一个完整的数据响应,从而把他当作为一个请求的响应缓存。
在范围响应中,`Content-Range`头部标志指示出了该数据块的偏移量和数据块的长度。
### 状态码 100
HTTP/1.1 中新加入了状态码`100`。该状态码的使用场景为,存在某些较大的文件请求,服务器可能不愿意响应这种请求,此时状态码`100`可以作为指示请求是否会被正常响应,过程如下图:
![HTTP1.1continue1](./images/http-vs-https/HTTP1.1continue1.png)
![HTTP1.1continue2](./images/http-vs-https/HTTP1.1continue2.png)
然而在 HTTP/1.0 中,并没有`100 (Continue)`状态码,要想触发这一机制,可以发送一个`Expect`头部,其中包含一个`100-continue`的值。
### 压缩
许多格式的数据在传输时都会做预压缩处理。数据的压缩可以大幅优化带宽的利用。然而HTTP/1.0 对数据压缩的选项提供的不多不支持压缩细节的选择也无法区分端到端end-to-end压缩或者是逐跳hop-by-hop压缩。
HTTP/1.1 则对内容编码content-codings和传输编码transfer-codings做了区分。内容编码总是端到端的传输编码总是逐跳的。
HTTP/1.0 包含了`Content-Encoding`头部对消息进行端到端编码。HTTP/1.1 加入了`Transfer-Encoding`头部可以对消息进行逐跳传输编码。HTTP/1.1 还加入了`Accept-Encoding`头部,是客户端用来指示他能处理什么样的内容编码。
## 总结
1. **连接方式** : HTTP 1.0 为短连接HTTP 1.1 支持长连接。
1. **状态响应码** : HTTP/1.1 中新加入了大量的状态码,光是错误响应状态码就新增了 24 种。比如说,`100 (Continue)`——在请求大资源前的预热请求,`206 (Partial Content)`——范围请求的标识码,`409 (Conflict)`——请求与当前资源的规定冲突,`410 (Gone)`——资源已被永久转移,而且没有任何已知的转发地址。
1. **缓存处理** : 在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准HTTP1.1 则引入了更多的缓存控制策略例如 Entity tagIf-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓存策略。
1. **带宽优化及网络连接的使用** :HTTP1.0 中存在一些浪费带宽的现象例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了并且不支持断点续传功能HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206Partial Content这样就方便了开发者自由的选择以便于充分利用带宽和连接。
1. **Host 头处理** : HTTP/1.1 在请求头中加入了`Host`字段。
## 参考资料
[Key differences between HTTP/1.0 and HTTP/1.1](http://www.ra.ethz.ch/cdstore/www8/data/2136/pdf/pd1.pdf)

View File

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -5,6 +5,8 @@ tag:
- 计算机网络
---
<!-- @include: @small-advertisement.snippet.md -->
上篇主要是计算机网络基础和应用层相关的内容。
## 计算机网络基础
@ -38,7 +40,7 @@ tag:
![TCP/IP 四层模型](https://oss.javaguide.cn/github/javaguide/cs-basics/network/tcp-ip-4-model.png)
关于每一层作用的详细介绍,请看 [OSI 和 TCP/IP 网络分层模型详解(基础)](https://javaguide.cn/cs-basics/network/osi&tcp-ip-model.html) 这篇文章。
关于每一层作用的详细介绍,请看 [OSI 和 TCP/IP 网络分层模型详解(基础)](https://javaguide.cn/cs-basics/network/osi-and-tcp-ip-model.html) 这篇文章。
#### 为什么网络要分层?
@ -133,7 +135,7 @@ HTTP 状态码用于描述 HTTP 请求的结果,比如 2xx 就代表请求被
### HTTP Header 中常见的字段有哪些?
| 请求头字段名 | 说明 | 示例 |
| :------------------ | :----------------------------------------------------------- | :----------------------------------------------------------- |
| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------------------------------------------------------------------------------------- |
| Accept | 能够接受的回应内容类型Content-Types。 | Accept: text/plain |
| Accept-Charset | 能够接受的字符集 | Accept-Charset: utf-8 |
| Accept-Datetime | 能够接受的按照时间来表示的版本 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT |
@ -169,14 +171,14 @@ HTTP 状态码用于描述 HTTP 请求的结果,比如 2xx 就代表请求被
### HTTP 和 HTTPS 有什么区别?(重要)
![HTTP 和 HTTPS 对比](https://oss.javaguide.cn/github/javaguide/cs-basics/network/http-vs-https.png)
![HTTP 和 HTTPS 对比](https://oss.javaguide.cn/github/javaguide/cs-basics/network/http1.0-vs-http1.1.png)
- **端口号** HTTP 默认是 80HTTPS 默认是 443。
- **URL 前缀** HTTP 的 URL 前缀是 `http://`HTTPS 的 URL 前缀是 `https://`
- **安全性和资源消耗** HTTP 协议运行在 TCP 之上所有传输的内容都是明文客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密加密采用对称加密但对称加密的密钥用服务器方的证书进行了非对称加密。所以说HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
- **SEO搜索引擎优化** :搜索引擎通常会更青睐使用 HTTPS 协议的网站,因为 HTTPS 能够提供更高的安全性和用户隐私保护。使用 HTTPS 协议的网站在搜索结果中可能会被优先显示,从而对 SEO 产生影响。
关于 HTTP 和 HTTPS 更详细的对比总结,可以看我写的这篇文章:[HTTP vs HTTPS应用层](./http&https.md) 。
关于 HTTP 和 HTTPS 更详细的对比总结,可以看我写的这篇文章:[HTTP vs HTTPS应用层](./http-vs-https.md) 。
### HTTP/1.0 和 HTTP/1.1 有什么区别?
@ -188,7 +190,7 @@ HTTP 状态码用于描述 HTTP 请求的结果,比如 2xx 就代表请求被
- **带宽** HTTP/1.0 中存在一些浪费带宽的现象例如客户端只是需要某个对象的一部分而服务器却将整个对象送过来了并且不支持断点续传功能HTTP/1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,即返回码是 206Partial Content这样就方便了开发者自由的选择以便于充分利用带宽和连接。
- **Host 头Host Header处理** :HTTP/1.1 引入了 Host 头字段,允许在同一 IP 地址上托管多个域名,从而支持虚拟主机的功能。而 HTTP/1.0 没有 Host 头字段,无法实现虚拟主机。
关于 HTTP/1.0 和 HTTP/1.1 更详细的对比总结,可以看我写的这篇文章:[HTTP/1.0 vs HTTP/1.1(应用层)](./http1.0&http1.1.md) 。
关于 HTTP/1.0 和 HTTP/1.1 更详细的对比总结,可以看我写的这篇文章:[HTTP/1.0 vs HTTP/1.1(应用层)](./http1.0-vs-http1.1.md) 。
### HTTP/1.1 和 HTTP/2.0 有什么区别?

View File

@ -104,8 +104,6 @@ tag:
![IP 地址使数据包到达其目的地](https://oss.javaguide.cn/github/javaguide/cs-basics/network/internet_protocol_ip_address_diagram.png)
### 什么是 IP 地址过滤?
**IP 地址过滤IP Address Filtering** 简单来说就是限制或阻止特定 IP 地址或 IP 地址范围的访问。例如,你有一个图片服务突然被某一个 IP 地址攻击,那我们就可以禁止这个 IP 地址访问图片服务。

View File

@ -5,7 +5,6 @@ tag:
- 计算机网络
---
为了准确无误地把数据送达目标处TCP 协议采用了三次握手策略。
## 建立连接-TCP 三次握手
@ -14,7 +13,6 @@ tag:
建立一个 TCP 连接需要“三次握手”,缺一不可
- **一次握手**:客户端发送带有 SYNSEQ=x 标志的数据包 -> 服务端,然后客户端进入 **SYN_SEND** 状态,等待服务器的确认;
- **二次握手**:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 > 客户端,然后服务端进入 **SYN_RECV** 状态
- **三次握手**:客户端发送带有 ACK(ACK=y+1) 标志的数据包 > 服务端,然后客户端和服务器端都进入**ESTABLISHED** 状态,完成 TCP 三次握手。
@ -24,6 +22,7 @@ tag:
### 为什么要三次握手?
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
1. **第一次握手** Client 什么都不能确认Server 确认了对方发送正常,自己接收正常
2. **第二次握手** Client 确认了自己发送、接收正常对方发送、接收正常Server 确认了:对方发送正常,自己接收正常
3. **第三次握手** Client 确认了自己发送、接收正常对方发送、接收正常Server 确认了:自己发送、接收正常,对方发送、接收正常
@ -64,28 +63,22 @@ TCP是全双工通信可以双向传输数据。任何一方都可以在数
### 为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?
因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK表示接收到了断开连接的请求。等到数据发完之后再发 FIN断开服务器到客户端的数据传送。
### 如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?
客户端没有收到 ACK 确认,会重新发送 FIN 请求。
### 为什么第四次挥手客户端需要等待 2\*MSL报文段最长寿命时间后才进入 CLOSED 状态?
第四次挥手时,客户端发送给服务器的 ACK 有可能丢失,如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN如果客户端在 2\*MSL 的时间内收到了 FIN就会重新发送 ACK 并再次等待 2MSL防止 Server 没有收到 ACK 而不断重发 FIN。
> **MSL(Maximum Segment Lifetime)** : 一个片段在网络中最大的存活时间2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSLClient 都没有再次收到 FIN那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。
## 参考
- 《计算机网络(第 7 版)》
- 《图解 HTTP》
- TCP and UDP Tutorialhttps://www.9tut.com/tcp-and-udp-tutorial

View File

@ -60,7 +60,6 @@ TCP 为全双工(Full-Duplex, FDX)通信,双方可以进行双向通信,客
## TCP 的拥塞控制是怎么实现的?
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素。相反,流量控制往往是点对点通信量的控制,是个端到端的问题。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
![TCP的拥塞控制](https://oss.javaguide.cn/github/javaguide/cs-basics/network/tcp-congestion-control.png)
@ -100,7 +99,6 @@ ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
### 连续 ARQ 协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
**优点:** 信道利用率高,容易实现,即使确认丢失,也不必重传。
@ -109,7 +107,6 @@ ARQ 包括停止等待 ARQ 协议和连续 ARQ 协议。
## Reference
1. 《计算机网络(第 7 版)》
2. 《图解 HTTP》
3. [https://www.9tut.com/tcp-and-udp-tutorial](https://www.9tut.com/tcp-and-udp-tutorial)

View File

@ -12,6 +12,8 @@ head:
content: 很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦!这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如进程管理、内存管理、虚拟内存等等。
---
<!-- @include: @small-advertisement.snippet.md -->
很多读者抱怨计算操作系统的知识点比较繁杂,自己也没有多少耐心去看,但是面试的时候又经常会遇到。所以,我带着我整理好的操作系统的常见问题来啦!这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如 **用户态和内核态、系统调用、进程和线程、死锁、内存管理、虚拟内存、文件系统**等等。
这篇文章只是对一些操作系统比较重要概念的一个概览,深入学习的话,建议大家还是老老实实地去看书。另外, 这篇文章的很多内容参考了《现代操作系统》第三版这本书,非常感谢。
@ -45,8 +47,6 @@ head:
![Kernel_Layout](https://oss.javaguide.cn/2020-8/Kernel_Layout.png)
### 操作系统主要有哪些功能?
从资源管理的角度来看,操作系统有 6 大功能:

View File

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

View File

@ -5,7 +5,6 @@ tag:
- 数据库基础
---
MySQL 字符编码集中有两套 UTF-8 编码实现:**`utf8`** 和 **`utf8mb4`**。
如果使用 **`utf8`** 的话,存储 emoji 符号和一些比较复杂的汉字、繁体字就会出错。
@ -73,7 +72,7 @@ BIG5 主要针对的是繁体中文,收录了 13000 多个汉字。
就比如说你使用 UTF-8 编码方式打开 GB2312 编码格式的文件就会出现乱码。示例:“牛”这个汉字 GB2312 编码后的十六进制数值为 “C5A3”而 “C5A3” 用 UTF-8 解码之后得到的却是 “ţ”。
你可以通过这个网站在线进行编码和解码https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan
你可以通过这个网站在线进行编码和解码:<https://www.haomeili.net/HanZi/ZiFuBianMaZhuanHuan>
![](https://oss.javaguide.cn/github/javaguide/csdn/836c49b117ee4408871b0020b74c991d.png)
@ -152,9 +151,9 @@ Incorrect string value: '\xF0\x9F\x98\x98\xF0\x9F...' for column 'name' at row 1
## 参考
- 字符集和字符编码Charset & Encoding https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
- 十分钟搞清字符集和字符编码http://cenalulu.github.io/linux/character-encoding/
- Unicode-维基百科https://zh.wikipedia.org/wiki/Unicode
- GB2312-维基百科https://zh.wikipedia.org/wiki/GB_2312
- UTF-8-维基百科https://zh.wikipedia.org/wiki/UTF-8
- GB18030-维基百科: https://zh.wikipedia.org/wiki/GB_18030
- 字符集和字符编码Charset & Encoding <https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html>
- 十分钟搞清字符集和字符编码:<http://cenalulu.github.io/linux/character-encoding/>
- Unicode-维基百科:<https://zh.wikipedia.org/wiki/Unicode>
- GB2312-维基百科:<https://zh.wikipedia.org/wiki/GB_2312>
- UTF-8-维基百科:<https://zh.wikipedia.org/wiki/UTF-8>
- GB18030-维基百科: <https://zh.wikipedia.org/wiki/GB_18030>

View File

@ -10,46 +10,4 @@ tag:
![](https://oss.javaguide.cn/javamianshizhibei/elasticsearch-questions.png)
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
<!-- @include: @planet.snippet.md -->

View File

@ -29,7 +29,7 @@ MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三
**SQL 与 MongoDB 常见术语对比**
| SQL | MongoDB |
| ----------------------- | ------------------------------ |
| ------------------------ | ------------------------------- |
| 表Table | 集合Collection |
| 行Row | 文档Document |
| 列Col | 字段Field |
@ -197,7 +197,7 @@ MongoDB 聚合管道由多个阶段组成,每个阶段在文档通过管道时
**常用阶段操作符**
| 操作符 | 简述 |
| --------- | ------------------------------------------------------------ |
| --------- | ---------------------------------------------------------------------------------------------------- |
| \$match | 匹配操作符,用于对文档集合进行筛选 |
| \$project | 投射操作符,用于重构每一个文档的字段,可以提取字段,重命名字段,甚至可以对原有字段进行操作后新增字段 |
| \$sort | 排序操作符,用于根据一个或多个字段对文档进行排序 |

View File

@ -953,4 +953,3 @@ OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
6. SQL对大小写不敏感
7. 清除已有语句:\c
```

View File

@ -84,15 +84,16 @@ select * from tb_student A where A.age='18' and A.name=' 张三 ';
结合上面的说明,我们分析下这个语句的执行流程:
* 先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 SQL 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。
* 通过分析器进行词法分析,提取 SQL 语句的关键元素,比如提取上面这个语句是查询 select提取需要查询的表名为 tb_student需要查询所有的列查询条件是这个表的 id='1'。然后判断这个 SQL 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
* 接下来就是优化器进行确定执行方案,上面的 SQL 语句,可以有两种执行方案:
- 先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 SQL 语句为 key 在内存中查询是否有结果,如果有直接缓存,如果没有,执行下一步。
- 通过分析器进行词法分析,提取 SQL 语句的关键元素,比如提取上面这个语句是查询 select提取需要查询的表名为 tb_student需要查询所有的列查询条件是这个表的 id='1'。然后判断这个 SQL 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
- 接下来就是优化器进行确定执行方案,上面的 SQL 语句,可以有两种执行方案:
a.先查询学生表中姓名为“张三”的学生,然后判断是否年龄是 18。
b.先找出学生中年龄 18 岁的学生,然后再查询姓名为“张三”的学生。
那么优化器根据自己的优化算法进行选择执行效率最好的一个方案(优化器认为,有时候不一定最好)。那么确认了执行计划后就准备开始执行了。
* 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。
- 进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。
### 2.2 更新语句
@ -101,12 +102,13 @@ select * from tb_student A where A.age='18' and A.name=' 张三 ';
```
update tb_student A set A.age='19' where A.name=' 张三 ';
```
我们来给张三修改下年龄在实际数据库肯定不会设置年龄这个字段的不然要被技术负责人打的。其实这条语句也基本上会沿着上一个查询的流程走只不过执行更新的时候肯定要记录日志啦这就会引入日志模块了MySQL 自带的日志模块是 **binlog归档日志** ,所有的存储引擎都可以使用,我们常用的 InnoDB 引擎还自带了一个日志模块 **redo log重做日志**,我们就以 InnoDB 模式下来探讨这个语句的执行流程。流程如下:
* 先查询到张三这一条数据,如果有缓存,也是会用到缓存。
* 然后拿到查询的语句,把 age 改为 19然后调用引擎 API 接口写入这一行数据InnoDB 引擎把数据保存在内存中,同时记录 redo log此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。
* 执行器收到通知后记录 binlog然后调用引擎接口提交 redo log 为提交状态。
* 更新完成。
- 先查询到张三这一条数据,如果有缓存,也是会用到缓存。
- 然后拿到查询的语句,把 age 改为 19然后调用引擎 API 接口写入这一行数据InnoDB 引擎把数据保存在内存中,同时记录 redo log此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。
- 执行器收到通知后记录 binlog然后调用引擎接口提交 redo log 为提交状态。
- 更新完成。
**这里肯定有同学会问,为什么要用两个日志模块,用一个日志模块不行吗?**
@ -114,25 +116,25 @@ update tb_student A set A.age='19' where A.name=' 张三 ';
并不是说只用一个日志模块不可以,只是 InnoDB 引擎就是通过 redo log 来支持事务的。那么,又会有同学问,我用两个日志模块,但是不要这么复杂行不行,为什么 redo log 要引入 prepare 预提交状态?这里我们用反证法来说明下为什么要这么做?
* **先写 redo log 直接提交,然后写 binlog**,假设写完 redo log 后机器挂了binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。
* **先写 binlog然后写 redo log**,假设写完了 binlog机器异常重启了由于没有 redo log本机是无法恢复这一条记录的但是 binlog 又有记录,那么和上面同样的道理,就会产生数据不一致的情况。
- **先写 redo log 直接提交,然后写 binlog**,假设写完 redo log 后机器挂了binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。
- **先写 binlog然后写 redo log**,假设写完了 binlog机器异常重启了由于没有 redo log本机是无法恢复这一条记录的但是 binlog 又有记录,那么和上面同样的道理,就会产生数据不一致的情况。
如果采用 redo log 两阶段提交的方式就不一样了,写完 binlog 后,然后再提交 redo log 就会防止出现上述的问题,从而保证了数据的一致性。那么问题来了,有没有一个极端的情况呢?假设 redo log 处于预提交状态binlog 也已经写完了,这个时候发生了异常重启会怎么样呢?
这个就要依赖于 MySQL 的处理机制了MySQL 的处理过程如下:
* 判断 redo log 是否完整,如果判断是完整的,就立即提交。
* 如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断 binlog 是否完整,如果完整就提交 redo log, 不完整就回滚事务。
- 判断 redo log 是否完整,如果判断是完整的,就立即提交。
- 如果 redo log 只是预提交但不是 commit 状态,这个时候就会去判断 binlog 是否完整,如果完整就提交 redo log, 不完整就回滚事务。
这样就解决了数据一致性的问题。
## 三 总结
* MySQL 主要分为 Server 层和引擎层Server 层主要包括连接器、查询缓存、分析器、优化器、执行器同时还有一个日志模块binlog这个日志模块所有执行引擎都可以共用redolog 只有 InnoDB 有。
* 引擎层是插件式的目前主要包括MyISAM,InnoDB,Memory 等。
* 查询语句的执行流程如下:权限校验(如果命中缓存)--->查询缓存--->分析器--->优化器--->权限校验--->执行器--->引擎
* 更新语句执行流程如下:分析器---->权限校验---->执行器--->引擎---redo log(prepare 状态)--->binlog--->redo log(commit状态)
- MySQL 主要分为 Server 层和引擎层Server 层主要包括连接器、查询缓存、分析器、优化器、执行器同时还有一个日志模块binlog这个日志模块所有执行引擎都可以共用redolog 只有 InnoDB 有。
- 引擎层是插件式的目前主要包括MyISAM,InnoDB,Memory 等。
- 查询语句的执行流程如下:权限校验(如果命中缓存)--->查询缓存--->分析器--->优化器--->权限校验--->执行器--->引擎
- 更新语句执行流程如下:分析器---->权限校验---->执行器--->引擎---redo log(prepare 状态)--->binlog--->redo log(commit 状态)
## 四 参考
* 《MySQL 实战45讲》
* MySQL 5.6参考手册:<https://dev.MySQL.com/doc/refman/5.6/en/>
- 《MySQL 实战 45 讲》
- MySQL 5.6 参考手册:<https://dev.MySQL.com/doc/refman/5.6/en/>

View File

@ -89,8 +89,7 @@ id 如果相同从上往下依次执行。id 不同id 值越大,执行
查询用到的表名,每行都有对应的表名,表名除了正常的表之外,也可能是以下列出的值:
- **`<unionM,N>`** : 本行引用了 id 为 M 和 N 的行的 UNION 结果;
- **`<derivedN>`** : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。
-**`<subqueryN>`** : 本行引用了 id 为 N 的表所产生的的物化子查询结果。
- **`<derivedN>`** : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。 -**`<subqueryN>`** : 本行引用了 id 为 N 的表所产生的的物化子查询结果。
### type重要

View File

@ -13,6 +13,8 @@ head:
content: 一篇文章总结MySQL常见的知识点和面试题涵盖MySQL基础、MySQL基础架构、MySQL存储引擎、MySQL查询缓存、MySQL事务、MySQL锁等内容。
---
<!-- @include: @small-advertisement.snippet.md -->
## MySQL 基础
### 什么是关系型数据库?

View File

@ -73,7 +73,7 @@ SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTE
### 脏读(读未提交)
![](https://oss.javaguide.cn/github/javaguide/2019-31-1%E8%84%8F%E8%AF%BB(%E8%AF%BB%E6%9C%AA%E6%8F%90%E4%BA%A4)%E5%AE%9E%E4%BE%8B.jpg)
![](<https://oss.javaguide.cn/github/javaguide/2019-31-1%E8%84%8F%E8%AF%BB(%E8%AF%BB%E6%9C%AA%E6%8F%90%E4%BA%A4)%E5%AE%9E%E4%BE%8B.jpg>)
### 避免脏读(读已提交)

View File

@ -20,7 +20,7 @@ NoSQL 数据库代表HBase 、Cassandra、MongoDB、Redis。
## SQL 和 NoSQL 有什么区别?
| | SQL 数据库 | NoSQL 数据库 |
| :----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| :----------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| 数据存储模型 | 结构化存储,具有固定行和列的表格 | 非结构化存储。文档JSON 文档,键值:键值对,宽列:包含行和动态列的表,图:节点和边 |
| 发展历程 | 开发于 1970 年代,重点是减少数据重复 | 开发于 2000 年代后期,重点是提升可扩展性,减少大规模数据的存储成本 |
| 例子 | Oracle、MySQL、Microsoft SQL Server 、PostgreSQL | 文档MongoDB、CouchDB键值Redis 、DynamoDB宽列Cassandra 、 HBase图表Neo4j 、 Amazon Neptune、Giraph |
@ -54,6 +54,6 @@ NoSQL 数据库主要可以分为下面四种类型:
## 参考
- NoSQL 是什么?- MongoDB 官方文档https://www.mongodb.com/zh-cn/nosql-explained
- 什么是 NoSQL? - AWShttps://aws.amazon.com/cn/nosql/
- NoSQL vs. SQL Databases - MongoDB 官方文档https://www.mongodb.com/zh-cn/nosql-explained/nosql-vs-sql
- NoSQL 是什么?- MongoDB 官方文档:<https://www.mongodb.com/zh-cn/nosql-explained>
- 什么是 NoSQL? - AWS<https://aws.amazon.com/cn/nosql/>
- NoSQL vs. SQL Databases - MongoDB 官方文档:<https://www.mongodb.com/zh-cn/nosql-explained/nosql-vs-sql>

View File

@ -5,7 +5,6 @@ tag:
- Redis
---
看到很多小伙伴简历上写了“**熟练使用缓存**”,但是被我问到“**缓存常用的 3 种读写策略**”的时候却一脸懵逼。
在我看来,造成这个问题的原因是我们在学习 Redis 的时候,可能只是简单了写一些 Demo并没有去关注缓存的读写策略或者说压根不知道这回事。

View File

@ -6,49 +6,6 @@ tag:
---
**缓存基础** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
![](https://oss.javaguide.cn/javamianshizhibei/database-questions.png)
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
<!-- @include: @planet.snippet.md -->

View File

@ -9,47 +9,4 @@ tag:
![](https://oss.javaguide.cn/github/javaguide/database/redis/redis-cluster-javamianshizhibei.png)
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
<!-- @include: @planet.snippet.md -->

View File

@ -388,7 +388,7 @@ Sorted Set 类似于 Set但和 Set 相比Sorted Set 增加了一个权重
### 常用命令
| 命令 | 介绍 |
| --------------------------------------------- | ------------------------------------------------------------ |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| ZADD key score1 member1 score2 member2 ... | 向指定有序集合添加一个或多个元素 |
| ZCARD KEY | 获取指定有序集合的元素数量 |
| ZSCORE key member | 获取指定有序集合中指定元素的 score 值 |

View File

@ -27,7 +27,7 @@ Bitmap 存储的是连续的二进制数字0 和 1通过 Bitmap, 只需
### 常用命令
| 命令 | 介绍 |
| ------------------------------------- | ------------------------------------------------------------ |
| ------------------------------------- | ---------------------------------------------------------------- |
| SETBIT key offset value | 设置指定 offset 位置的值 |
| GETBIT key offset | 获取指定 offset 位置的值 |
| BITCOUNT key start end | 获取 start 和 end 之前值为 1 的元素个数 |
@ -87,7 +87,7 @@ HyperLogLog 的使用非常简单但原理非常复杂。HyperLogLog 的原
HyperLogLog 相关的命令非常少,最常用的也就 3 个。
| 命令 | 介绍 |
| ----------------------------------------- | ------------------------------------------------------------ |
| ----------------------------------------- | -------------------------------------------------------------------------------- |
| PFADD key element1 element2 ... | 添加一个或多个元素到 HyperLogLog 中 |
| PFCOUNT key1 key2 | 获取一个或者多个 HyperLogLog 的唯一计数。 |
| PFMERGE destkey sourcekey1 sourcekey2 ... | 将多个 HyperLogLog 合并到 destkey 中destkey 会结合多个源,算出对应的唯一计数。 |
@ -133,7 +133,7 @@ Geospatial index地理空间索引简称 GEO 主要用于存储地理
### 常用命令
| 命令 | 介绍 |
| ------------------------------------------------ | ------------------------------------------------------------ |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| GEOADD key longitude1 latitude1 member1 ... | 添加一个或多个元素对应的经纬度信息到 GEO 中 |
| GEOPOS key member1 member2 ... | 返回给定元素的经纬度信息 |
| GEODIST key member1 member2 M/KM/FT/MI | 返回两个给定元素之间的距离 |

View File

@ -12,6 +12,8 @@ head:
content: 一篇文章总结Redis常见的知识点和面试题涵盖Redis基础、Redis常见数据结构、Redis线程模型、Redis内存管理、Redis事务、Redis性能优化等内容。
---
<!-- @include: @small-advertisement.snippet.md -->
## Redis 基础
### 什么是 Redis
@ -248,7 +250,7 @@ struct __attribute__ ((__packed__)) sdshdr64 {
通过源码可以看出SDS 共有五种实现方式 SDS_TYPE_5并未用到、SDS_TYPE_8、SDS_TYPE_16、SDS_TYPE_32、SDS_TYPE_64其中只有后四种实际用到。Redis 会根据初始化的长度决定使用哪种类型,从而减少内存的使用。
| 类型 | 字节 | 位 |
| -------- | ---- | ---- |
| -------- | ---- | --- |
| sdshdr5 | < 1 | <8 |
| sdshdr8 | 1 | 8 |
| sdshdr16 | 2 | 16 |
@ -593,4 +595,3 @@ Redis 提供 6 种数据淘汰策略:
- 《Redis 设计与实现》
- Redis 命令手册https://www.redis.com.cn/commands.html
- WHY Redis choose single thread (vs multi threads): [https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153](https://medium.com/@jychen7/sharing-redis-single-thread-vs-multi-threads-5870bd44d153)

View File

@ -1204,7 +1204,7 @@ ORDER BY c.cust_name
SQL 允许在 `JOIN` 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示:
| 连接类型 | 说明 |
| ---------------------------------------- | ------------------------------------------------------------ |
| ---------------------------------------- | --------------------------------------------------------------------------------------------- |
| INNER JOIN 内连接 | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 |
| LEFT JOIN / LEFT OUTER JOIN 左(外)连接 | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 |
| RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 |

View File

@ -490,7 +490,7 @@ order by c.cust_name;
SQL 允许在 `JOIN` 左边加上一些修饰性的关键词,从而形成不同类型的连接,如下表所示:
| 连接类型 | 说明 |
| ---------------------------------------- | ------------------------------------------------------------ |
| ---------------------------------------- | --------------------------------------------------------------------------------------------- |
| INNER JOIN 内连接 | (默认连接方式)只有当两个表都存在满足条件的记录时才会返回行。 |
| LEFT JOIN / LEFT OUTER JOIN 左(外)连接 | 返回左表中的所有行,即使右表中没有满足条件的行也是如此。 |
| RIGHT JOIN / RIGHT OUTER JOIN 右(外)连接 | 返回右表中的所有行,即使左表中没有满足条件的行也是如此。 |
@ -919,7 +919,7 @@ SELECT user FROM user;
下表说明了可用于`GRANT``REVOKE`语句的所有允许权限:
| **特权** | **说明** | **级别** | | | | | |
| ----------------------- | ------------------------------------------------------------ | -------- | ------ | -------- | -------- | ---- | ---- |
| ----------------------- | ------------------------------------------------------------------------------------------------------- | -------- | ------ | -------- | -------- | --- | --- |
| **全局** | 数据库 | **表** | **列** | **程序** | **代理** | | |
| ALL [PRIVILEGES] | 授予除 GRANT OPTION 之外的指定访问级别的所有权限 | | | | | | |
| ALTER | 允许用户使用 ALTER TABLE 语句 | X | X | X | | | |

View File

@ -75,8 +75,8 @@ Zuul 主要通过过滤器(类似于 AOP来过滤请求从而实现网
![Zuul2 架构](https://oscimg.oschina.net/oscnet/up-4f9047dc9109e27f9fced1b365e2b976e9d.png)
- Github 地址 https://github.com/Netflix/zuul
- 官方 Wiki https://github.com/Netflix/zuul/wiki
- Github 地址 <https://github.com/Netflix/zuul>
- 官方 Wiki <https://github.com/Netflix/zuul/wiki>
### Spring Cloud Gateway
@ -90,8 +90,8 @@ Spring Cloud Gateway 不仅提供统一的路由方式,并且基于 Filter 链
Spring Cloud Gateway 和 Zuul 2.x 的差别不大,也是通过过滤器来处理请求。不过,目前更加推荐使用 Spring Cloud Gateway 而非 ZuulSpring Cloud 生态对其支持更加友好。
- Github 地址 https://github.com/spring-cloud/spring-cloud-gateway
- 官网 https://spring.io/projects/spring-cloud-gateway
- Github 地址 <https://github.com/spring-cloud/spring-cloud-gateway>
- 官网 <https://spring.io/projects/spring-cloud-gateway>
### Kong
@ -118,8 +118,8 @@ $ curl -X POST http://kong:8001/services/{service}/plugins \
![](https://oss.javaguide.cn/github/javaguide/system-design/distributed-system/api-gateway/kong-gateway-overview.png)
- Github 地址: https://github.com/Kong/kong
- 官网地址 https://konghq.com/kong
- Github 地址: <https://github.com/Kong/kong>
- 官网地址 <https://konghq.com/kong>
### APISIX
@ -144,8 +144,8 @@ APISIX 同样支持定制化的插件开发。开发者除了能够使用 Lua
![](https://oscimg.oschina.net/oscnet/up-a240d3b113cde647f5850f4c7cc55d4ff5c.png)
- Github 地址 https://github.com/apache/apisix
- 官网地址: https://apisix.apache.org/zh/
- Github 地址 <https://github.com/apache/apisix>
- 官网地址: <https://apisix.apache.org/zh/>
相关阅读:
@ -162,11 +162,11 @@ Shenyu 是一款基于 WebFlux 的可扩展、高性能、响应式网关Apac
Shenyu 通过插件扩展功能,插件是 ShenYu 的灵魂并且插件也是可扩展和热插拔的。不同的插件实现不同的功能。Shenyu 自带了诸如限流、熔断、转发 、重写、重定向、和路由监控等插件。
- Github 地址: https://github.com/apache/incubator-shenyu
- 官网地址 https://shenyu.apache.org/
- Github 地址: <https://github.com/apache/incubator-shenyu>
- 官网地址 <https://shenyu.apache.org/>
## 参考
- Kong 插件开发教程[通俗易懂]https://cloud.tencent.com/developer/article/2104299
- API 网关 Kong 实战https://xie.infoq.cn/article/10e4dab2de0bdb6f2c3c93da6
- Spring Cloud Gateway 原理介绍和应用https://blog.fintopia.tech/60e27b0e2078082a378ec5ed/
- Kong 插件开发教程[通俗易懂]<https://cloud.tencent.com/developer/article/2104299>
- API 网关 Kong 实战:<https://xie.infoq.cn/article/10e4dab2de0bdb6f2c3c93da6>
- Spring Cloud Gateway 原理介绍和应用:<https://blog.fintopia.tech/60e27b0e2078082a378ec5ed/>

View File

@ -8,49 +8,4 @@ icon: "configuration"
![](https://oss.javaguide.cn/javamianshizhibei/distributed-system.png)
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
<!-- @include: @planet.snippet.md -->

View File

@ -84,9 +84,9 @@ COMMIT;
插入数据这里,我们没有使用 `insert into` 而是使用 `replace into` 来插入数据,具体步骤是这样的:
1)第一步: 尝试把数据插入到表中。
- 第一步: 尝试把数据插入到表中。
2)第二步: 如果主键或唯一索引字段出现重复数据错误而插入失败时,先从表中删除含有重复关键字值的冲突行,然后再次尝试把数据插入到表中。
- 第二步: 如果主键或唯一索引字段出现重复数据错误而插入失败时,先从表中删除含有重复关键字值的冲突行,然后再次尝试把数据插入到表中。
这种方式的优缺点也比较明显:

View File

@ -95,7 +95,7 @@ OK
### 如何实现锁的优雅续期?
对于 Java 开发的小伙伴来说,已经有了现成的解决方案:**[Redisson](https://github.com/redisson/redisson)** 。其他语言的解决方案,可以在 Redis 官方文档中找到地址https://redis.io/topics/distlock 。
对于 Java 开发的小伙伴来说,已经有了现成的解决方案:**[Redisson](https://github.com/redisson/redisson)** 。其他语言的解决方案,可以在 Redis 官方文档中找到,地址:<https://redis.io/topics/distlock>
![Distributed locks with Redis](https://oss.javaguide.cn/github/javaguide/redis-distributed-lock.png)
@ -394,6 +394,3 @@ private static class LockData
## 总结
这篇文章我们介绍了分布式锁的基本概念以及实现分布式锁的两种常见方式。至于具体选择 Redis 还是 ZooKeeper 来实现分布式锁,还是要看业务的具体需求。如果对性能要求比较高的话,建议使用 Redis 实现分布式锁。如果对可靠性要求比较高的话,建议使用 ZooKeeper 实现分布式锁。

View File

@ -293,8 +293,3 @@ zkClient.setData().forPath("/node1/00001","c++".getBytes());//更新节点数据
```java
List<String> childrenPaths = zkClient.getChildren().forPath("/node1");
```

View File

@ -125,7 +125,7 @@ Stat 类中包含了一个数据节点的所有状态信息的字段,包括事
下面我们来看一下每个 znode 状态信息究竟代表的是什么吧!(下面的内容来源于《从 Paxos 到 ZooKeeper 分布式一致性原理与实践》,因为 Guide 确实也不是特别清楚,要学会参考资料的嘛!
| znode 状态信息 | 解释 |
| -------------- | ------------------------------------------------------------ |
| -------------- | --------------------------------------------------------------------------------------------------- |
| cZxid | create ZXID即该数据节点被创建时的事务 id |
| ctime | create time即该节点的创建时间 |
| mZxid | modified ZXID即该节点最终一次更新时的事务 id |
@ -202,7 +202,7 @@ Session 有一个属性叫做:`sessionTimeout` `sessionTimeout` 代表会
ZooKeeper 集群中的所有机器通过一个 **Leader 选举过程** 来选定一台称为 “**Leader**” 的机器Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外,**Follower** 和 **Observer** 都只能提供读服务。Follower 和 Observer 唯一的区别在于 Observer 机器不参与 Leader 的选举过程,也不参与写操作的“过半写成功”策略,因此 Observer 机器可以在不影响写性能的情况下提升集群的读性能。
| 角色 | 说明 |
| -------- | ------------------------------------------------------------ |
| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Leader | 为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态。 |
| Follower | 为客户端提供读服务,如果是写服务则转发给 Leader。参与选举过程中的投票。 |
| Observer | 为客户端提供读服务,如果是写服务则转发给 Leader。不参与选举过程中的投票也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于 ZooKeeper3.3 系列新增的角色。 |
@ -263,9 +263,9 @@ ZAB 协议包括两种基本的模式,分别是
关于 **ZAB 协议&Paxos 算法** 需要讲和理解的东西太多了,具体可以看下面这几篇文章:
- [Paxos 算法详解](https://javaguide.cn/distributed-system/theorem&algorithm&protocol/paxos-algorithm.html)
- [Paxos 算法详解](https://javaguide.cn/distributed-system/protocol/paxos-algorithm.html)
- [Zookeeper ZAB 协议分析](https://dbaplus.cn/news-141-1875-1.html)
- [Raft 算法详解](https://javaguide.cn/distributed-system/theorem&algorithm&protocol/raft-algorithm.html)
- [Raft 算法详解](https://javaguide.cn/distributed-system/protocol/raft-algorithm.html)
## 总结

View File

@ -79,9 +79,9 @@ tag:
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cc534022c7184770b9b82b2d0008432a~tplv-k3u1fbpfcp-zoom-1.image)
* **单点故障问题**,如果协调者挂了那么整个系统都处于不可用的状态了。
* **阻塞问题**,即当协调者发送 `prepare` 请求,参与者收到之后如果能处理那么它将会进行事务的处理但并不提交,这个时候会一直占用着资源不释放,如果此时协调者挂了,那么这些资源都不会再释放了,这会极大影响性能。
* **数据不一致问题**,比如当第二阶段,协调者只发送了一部分的 `commit` 请求就挂了,那么也就意味着,收到消息的参与者会进行事务的提交,而后面没收到的则不会进行事务提交,那么这时候就会产生数据不一致性问题。
- **单点故障问题**,如果协调者挂了那么整个系统都处于不可用的状态了。
- **阻塞问题**,即当协调者发送 `prepare` 请求,参与者收到之后如果能处理那么它将会进行事务的处理但并不提交,这个时候会一直占用着资源不释放,如果此时协调者挂了,那么这些资源都不会再释放了,这会极大影响性能。
- **数据不一致问题**,比如当第二阶段,协调者只发送了一部分的 `commit` 请求就挂了,那么也就意味着,收到消息的参与者会进行事务的提交,而后面没收到的则不会进行事务提交,那么这时候就会产生数据不一致性问题。
### 3PC三阶段提交
@ -109,8 +109,8 @@ tag:
#### prepare 阶段
* `Proposer提案者`:负责提出 `proposal`,每个提案者在提出提案时都会首先获取到一个 **具有全局唯一性的、递增的提案编号N**,即在整个集群中是唯一的编号 N然后将该编号赋予其要提出的提案在**第一阶段是只将提案编号发送给所有的表决者**。
* `Acceptor表决者`:每个表决者在 `accept` 某提案后会将该提案编号N记录在本地这样每个表决者中保存的已经被 accept 的提案中会存在一个**编号最大的提案**,其编号假设为 `maxN`。每个表决者仅会 `accept` 编号大于自己本地 `maxN` 的提案,在批准提案时表决者会将以前接受过的最大编号的提案作为响应反馈给 `Proposer`
- `Proposer提案者`:负责提出 `proposal`,每个提案者在提出提案时都会首先获取到一个 **具有全局唯一性的、递增的提案编号 N**,即在整个集群中是唯一的编号 N然后将该编号赋予其要提出的提案在**第一阶段是只将提案编号发送给所有的表决者**。
- `Acceptor表决者`:每个表决者在 `accept` 某提案后,会将该提案编号 N 记录在本地,这样每个表决者中保存的已经被 accept 的提案中会存在一个**编号最大的提案**,其编号假设为 `maxN`。每个表决者仅会 `accept` 编号大于自己本地 `maxN` 的提案,在批准提案时表决者会将以前接受过的最大编号的提案作为响应反馈给 `Proposer`
> 下面是 `prepare` 阶段的流程图,你可以对照着参考一下。
@ -156,9 +156,9 @@ tag:
和介绍 `Paxos` 一样,在介绍 `ZAB` 协议之前,我们首先来了解一下在 `ZAB` 中三个主要的角色,`Leader 领导者``Follower跟随者``Observer观察者`
* `Leader` :集群中 **唯一的写请求处理者** ,能够发起投票(投票也是为了进行写请求)。
* `Follower`:能够接收客户端的请求,如果是读请求则可以自己处理,**如果是写请求则要转发给 `Leader`** 。在选举过程中会参与投票,**有选举权和被选举权** 。
* `Observer` :就是没有选举权和被选举权的 `Follower`
- `Leader` :集群中 **唯一的写请求处理者** ,能够发起投票(投票也是为了进行写请求)。
- `Follower`:能够接收客户端的请求,如果是读请求则可以自己处理,**如果是写请求则要转发给 `Leader`** 。在选举过程中会参与投票,**有选举权和被选举权** 。
- `Observer` :就是没有选举权和被选举权的 `Follower`
`ZAB` 协议中对 `zkServer`(即上面我们说的三个角色的总称) 还有两种模式的定义,分别是 **消息广播****崩溃恢复**
@ -242,24 +242,24 @@ tag:
其中节点类型可以分为 **持久节点**、**持久顺序节点**、**临时节点** 和 **临时顺序节点**
* 持久节点:一旦创建就一直存在,直到将其删除。
* 持久顺序节点:一个父节点可以为其子节点 **维护一个创建的先后顺序** ,这个顺序体现在 **节点名称** 上,是节点名称后自动添加一个由 10 位数字组成的数字串,从 0 开始计数。
* 临时节点:临时节点的生命周期是与 **客户端会话** 绑定的,**会话消失则节点消失** 。临时节点 **只能做叶子节点** ,不能创建子节点。
* 临时顺序节点:父节点可以创建一个维持了顺序的临时节点(和前面的持久顺序性节点一样)。
- 持久节点:一旦创建就一直存在,直到将其删除。
- 持久顺序节点:一个父节点可以为其子节点 **维护一个创建的先后顺序** ,这个顺序体现在 **节点名称** 上,是节点名称后自动添加一个由 10 位数字组成的数字串,从 0 开始计数。
- 临时节点:临时节点的生命周期是与 **客户端会话** 绑定的,**会话消失则节点消失** 。临时节点 **只能做叶子节点** ,不能创建子节点。
- 临时顺序节点:父节点可以创建一个维持了顺序的临时节点(和前面的持久顺序性节点一样)。
节点状态中包含了很多节点的属性比如 `czxid``mzxid` 等等,在 `zookeeper` 中是使用 `Stat` 这个类来维护的。下面我列举一些属性解释。
* `czxid``Created ZXID`,该数据节点被 **创建** 时的事务ID。
* `mzxid``Modified ZXID`,节点 **最后一次被更新时** 的事务ID。
* `ctime``Created Time`,该节点被创建的时间。
* `mtime` `Modified Time`,该节点最后一次被修改的时间。
* `version`:节点的版本号。
* `cversion`**子节点** 的版本号。
* `aversion`:节点的 `ACL` 版本号。
* `ephemeralOwner`:创建该节点的会话的 `sessionID` 如果该节点为持久节点该值为0。
* `dataLength`:节点数据内容的长度。
* `numChildre`该节点的子节点个数如果为临时节点为0。
* `pzxid`该节点子节点列表最后一次被修改时的事务ID注意是子节点的 **列表** ,不是内容。
- `czxid``Created ZXID`,该数据节点被 **创建** 时的事务 ID。
- `mzxid``Modified ZXID`,节点 **最后一次被更新时** 的事务 ID。
- `ctime``Created Time`,该节点被创建的时间。
- `mtime` `Modified Time`,该节点最后一次被修改的时间。
- `version`:节点的版本号。
- `cversion`**子节点** 的版本号。
- `aversion`:节点的 `ACL` 版本号。
- `ephemeralOwner`:创建该节点的会话的 `sessionID` ,如果该节点为持久节点,该值为 0。
- `dataLength`:节点数据内容的长度。
- `numChildre`:该节点的子节点个数,如果为临时节点为 0。
- `pzxid`:该节点子节点列表最后一次被修改时的事务 ID注意是子节点的 **列表** ,不是内容。
### 会话
@ -271,11 +271,11 @@ tag:
`ACL``Access Control Lists` ,它是一种权限控制。在 `zookeeper` 中定义了 5 种权限,它们分别为:
* `CREATE` :创建子节点的权限。
* `READ`:获取节点数据和子节点列表的权限。
* `WRITE`:更新节点数据的权限。
* `DELETE`:删除子节点的权限。
* `ADMIN`:设置节点 ACL 的权限。
- `CREATE` :创建子节点的权限。
- `READ`:获取节点数据和子节点列表的权限。
- `WRITE`:更新节点数据的权限。
- `DELETE`:删除子节点的权限。
- `ADMIN`:设置节点 ACL 的权限。
### Watcher 机制
@ -357,14 +357,14 @@ tag:
这篇文章中我带大家入门了 `zookeeper` 这个强大的分布式协调框架。现在我们来简单梳理一下整篇文章的内容。
* 分布式与集群的区别
- 分布式与集群的区别
* `2PC``3PC` 以及 `paxos` 算法这些一致性框架的原理和实现。
- `2PC``3PC` 以及 `paxos` 算法这些一致性框架的原理和实现。
* `zookeeper` 专门的一致性算法 `ZAB` 原子广播协议的内容(`Leader` 选举、崩溃恢复、消息广播)。
- `zookeeper` 专门的一致性算法 `ZAB` 原子广播协议的内容(`Leader` 选举、崩溃恢复、消息广播)。
* `zookeeper` 中的一些基本概念,比如 `ACL`,数据节点,会话,`watcher`机制等等。
- `zookeeper` 中的一些基本概念,比如 `ACL`,数据节点,会话,`watcher`机制等等。
* `zookeeper` 的典型应用场景,比如选主,注册中心等等。
- `zookeeper` 的典型应用场景,比如选主,注册中心等等。
如果忘了可以回去看看再次理解一下,如果有疑问和建议欢迎提出 🤝🤝🤝。

View File

@ -8,46 +8,4 @@ icon: "transanction"
![](https://oss.javaguide.cn/javamianshizhibei/distributed-system.png)
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>
<!-- @include: @planet.snippet.md -->

View File

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -167,4 +167,3 @@ raft 的要求之一就是安全性不依赖于时间:系统不能仅仅因为
- https://github.com/OneSizeFitsQuorum/raft-thesis-zh_cn/blob/master/raft-thesis-zh_cn.md
- https://github.com/ongardie/dissertation/blob/master/stanford.pdf
- https://knowledge-sharing.gitbooks.io/raft/content/chapter5.html

View File

@ -210,7 +210,6 @@ Dubbo 采用 微内核Microkernel + 插件Plugin 模式,简单来
不会。两者都宕机也不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。注册中心和监控中心都是可选的,服务消费者可以直连服务提供者。
## Dubbo 的负载均衡策略
### 什么是负载均衡?
@ -411,8 +410,6 @@ public class RpcStatus {
另外Dubbo 为了避免数据倾斜问题(节点不够分散,大量请求落到同一节点),还引入了虚拟节点的概念。通过虚拟节点可以让节点更加分散,有效均衡各个节点的请求量。
![](https://oss.javaguide.cn/java-guide-blog/consistent-hash-invoker.jpg)
官方有详细的源码分析:[https://dubbo.apache.org/zh/docs/v2.7/dev/source/loadbalance/#23-consistenthashloadbalance](https://dubbo.apache.org/zh/docs/v2.7/dev/source/loadbalance/#23-consistenthashloadbalance) 。这里还有一个相关的 [PR#5440](https://github.com/apache/dubbo/pull/5440) 来修复老版本中 ConsistentHashLoadBalance 存在的一些 Bug。感兴趣的小伙伴可以多花点时间研究一下。我这里不多分析了这个作业留给你们
@ -457,4 +454,3 @@ Kryo和FST这两种序列化方式是 Dubbo 后来才引入的,性能非常好
Dubbo 官方文档中还有一个关于这些[序列化协议的性能对比图](https://dubbo.apache.org/zh/docs/v2.7/user/serialization/#m-zhdocsv27userserialization)可供参考。
![](https://oscimg.oschina.net/oscnet/up-00c3ce1e5d222e477ed84310239daa2f6b0.png)

View File

@ -13,10 +13,8 @@ tag:
**为什么要 RPC ** 因为两个不同的服务器上的服务提供的方法不在一个内存空间所以需要通过网络编程才能传递方法调用所需要的参数。并且方法调用的结果也需要通过网络编程来接收。但是如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的因为我们需要考虑底层传输方式TCP 还是 UDP、序列化方式等等方面。
**RPC 能帮助我们做什么呢?** 简单来说,通过 RPC 可以帮助我们调用远程计算机上某个服务的方法,这个过程就像调用本地方法一样简单。并且!我们不需要了解底层网络编程的具体细节。
举个例子:两个不同的服务 A、B 部署在两台不同的机器上,服务 A 如果想要调用服务 B 中的某个方法的话就可以通过 RPC 来做。
一言蔽之:**RPC 的出现就是为了让你调用远程方法像调用本地方法一样简单。**
@ -25,7 +23,6 @@ tag:
为了能够帮助小伙伴们理解 RPC 原理,我们可以将整个 RPC 的 核心功能看作是下面 👇 5 个部分实现的:
1. **客户端(服务消费端)** :调用远程方法的一端。
1. **客户端 Stub** 这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
1. **网络传输** 网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最近基本的 Socket 或者性能以及封装更加优秀的 Netty推荐
@ -34,7 +31,6 @@ tag:
具体原理图如下,后面我会串起来将整个 RPC 的过程给大家说一下。
![RPC原理图](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-6/37345851.jpg)
1. 服务消费端client以本地调用的方式调用远程服务
@ -141,4 +137,3 @@ Dubbo 也是 Spring Cloud Alibaba 里面的一个组件。
## 既然有了 HTTP 协议,为什么还要有 RPC
[HTTP 和 RPC 详细对比](http&rpc.md) 。

View File

@ -1,53 +0,0 @@
---
title: 降级&熔断详解(付费)
category: 高可用
---
**降级&熔断** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
![](https://oss.javaguide.cn/xingqiu/image-20220304102536445.png)
最近几年,市面上有越来越多的“技术大佬”开始办培训班/训练营,动辄成千上万的学费,却并没有什么干货,单纯的就是割韭菜。
为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的知识星球。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面。
欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/image-20220311203414600.png" style="margin: 0 auto; " />
</a>
</div>
下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiufuwu.png" style="margin: 0 auto; " />
</a>
</div>
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍: [JavaGuide 知识星球详细介绍](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)。
这里再送一个 30 元的新人优惠券(续费半价)。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/xingqiu/xingqiuyouhuijuanheyi.png" style="margin: 0 auto; " />
</a>
</div>
进入星球之后,记得添加微信,我会发你详细的星球使用指南。
<div align="center">
<a href="https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html">
<img src="https://oss.javaguide.cn/github/javaguide/IMG_3007.jpg" style="margin: 0 auto; " />
</a>
</div>

View File

@ -0,0 +1,8 @@
---
title: 降级&熔断详解(付费)
category: 高可用
---
**降级&熔断** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
<!-- @include: @planet.snippet.md -->

Some files were not shown because too many files have changed in this diff Show More