├── .nojekyll
├── .husky
└── pre-commit
├── docs
├── .vuepress
│ ├── styles
│ │ ├── config.scss
│ │ ├── index.scss
│ │ └── palette.scss
│ ├── public
│ │ ├── me.png
│ │ ├── logo.png
│ │ ├── favicon.ico
│ │ └── assets
│ │ │ └── icon
│ │ │ ├── chrome-192.png
│ │ │ ├── chrome-512.png
│ │ │ ├── ms-icon-144.png
│ │ │ ├── apple-icon-152.png
│ │ │ ├── chrome-mask-192.png
│ │ │ ├── chrome-mask-512.png
│ │ │ ├── guide-maskable.png
│ │ │ └── guide-monochrome.png
│ ├── sidebar
│ │ ├── books.ts
│ │ ├── about-the-author.ts
│ │ ├── open-source-project.ts
│ │ └── high-quality-technical-articles.ts
│ ├── navbar.ts
│ ├── config.ts
│ └── theme.ts
├── java
│ ├── jvm
│ │ ├── pictures
│ │ │ ├── 内存区域常见配置参数.png
│ │ │ └── jdk监控和故障处理工具总结
│ │ │ │ ├── 3内存监控.png
│ │ │ │ ├── 4线程监控.png
│ │ │ │ ├── 1JConsole连接.png
│ │ │ │ └── 2查看Java程序概况.png
│ │ └── jvm-in-action.md
│ ├── concurrent
│ │ └── images
│ │ │ ├── thread-local
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ ├── 5.png
│ │ │ ├── 6.png
│ │ │ ├── 7.png
│ │ │ ├── 8.png
│ │ │ ├── 9.png
│ │ │ ├── 10.png
│ │ │ ├── 11.png
│ │ │ ├── 12.png
│ │ │ ├── 13.png
│ │ │ ├── 14.png
│ │ │ ├── 15.png
│ │ │ ├── 16.png
│ │ │ ├── 17.png
│ │ │ ├── 18.png
│ │ │ ├── 19.png
│ │ │ ├── 20.png
│ │ │ ├── 21.png
│ │ │ ├── 22.png
│ │ │ ├── 23.png
│ │ │ ├── 24.png
│ │ │ ├── 25.png
│ │ │ ├── 26.png
│ │ │ ├── 27.png
│ │ │ ├── 28.png
│ │ │ ├── 29.png
│ │ │ ├── 30.png
│ │ │ └── 31.png
│ │ │ └── java-thread-pool-summary
│ │ │ ├── Executor框架的使用示意图.png
│ │ │ ├── FixedThreadPool.png
│ │ │ ├── SingleThreadExecutor.png
│ │ │ ├── CachedThreadPool-execute.png
│ │ │ ├── threadpoolexecutor构造函数.png
│ │ │ ├── ScheduledThreadPoolExecutor机制.png
│ │ │ ├── ScheduledThreadPoolExecutor执行周期任务步骤.png
│ │ │ └── relationship-between-thread-pool-parameters.png
│ ├── collection
│ │ └── priorityqueue-source-code.md
│ └── basis
│ │ └── generics-and-wildcards.md
├── database
│ ├── mysql
│ │ └── images
│ │ │ ├── redo-log.png
│ │ │ ├── mvvc
│ │ │ ├── trans_visible.png
│ │ │ ├── 0e906b95-c916-4f30-beda-9cb3e49746bf.png
│ │ │ ├── 317e91e1-1ee1-42ad-9412-9098d5c6a9ad.png
│ │ │ ├── 528559e9-dae8-4d14-b78d-a5b657c88391.png
│ │ │ ├── 6a276e7a-b0da-4c7b-bdf7-c0c7b7b3b31c.png
│ │ │ ├── 6f82703c-36a1-4458-90fe-d7f4edbac71a.png
│ │ │ ├── 6fb2b9a1-5f14-4dec-a797-e4cf388ed413.png
│ │ │ ├── 79ed6142-7664-4e0b-9023-cf546586aa39.png
│ │ │ ├── 8778836b-34a8-480b-b8c7-654fe207a8c2.png
│ │ │ ├── a3fd1ec6-8f37-42fa-b090-7446d488fd04.png
│ │ │ ├── c52ff79f-10e6-46cb-b5d4-3c9cbcc1934a.png
│ │ │ └── cbbedbc5-0e3c-4711-aafd-7f3d68a4ed4e.png
│ │ │ ├── concurrency-consistency-issues-dirty-reading.png
│ │ │ ├── concurrency-consistency-issues-phantom-read.png
│ │ │ ├── concurrency-consistency-issues-unrepeatable-read.png
│ │ │ ├── concurrency-consistency-issues-missing-modifications.png
│ │ │ ├── ACID.drawio
│ │ │ ├── AID-C.drawio
│ │ │ ├── concurrency-consistency-issues-missing-modifications.drawio
│ │ │ ├── concurrency-consistency-issues-phantom-read.drawio
│ │ │ ├── concurrency-consistency-issues-unrepeatable-read.drawio
│ │ │ ├── concurrency-consistency-issues-dirty-reading.drawio
│ │ │ └── 数据库事务示意图.drawio
│ ├── redis
│ │ ├── images
│ │ │ ├── why-redis-so-fast.png
│ │ │ ├── aof-rewrite.drawio
│ │ │ ├── redis-list.drawio
│ │ │ ├── memory-fragmentation.drawio
│ │ │ ├── hash-shopping-cart.drawio
│ │ │ ├── aof-work-process.drawio
│ │ │ └── redis-event-handler.drawio
│ │ ├── redis-cluster.md
│ │ ├── cache-basics.md
│ │ └── redis-delayed-task.md
│ └── elasticsearch
│ │ └── elasticsearch-questions-01.md
├── snippets
│ ├── article-footer.snippet.md
│ ├── article-header.snippet.md
│ ├── small-advertisement.snippet.md
│ ├── planet2.snippet.md
│ ├── yuanma.snippet.md
│ └── planet.snippet.md
├── system-design
│ ├── basis
│ │ └── pictures
│ │ │ ├── Codelf.png
│ │ │ ├── dubbo-naming.png
│ │ │ ├── vscode-codelf.png
│ │ │ ├── marting-naming.png
│ │ │ └── naming-mindmap.png
│ ├── framework
│ │ ├── spring
│ │ │ ├── images
│ │ │ │ ├── async
│ │ │ │ │ └── async.png
│ │ │ │ ├── spring-annotations
│ │ │ │ │ └── @RequestBody.png
│ │ │ │ └── spring-transaction
│ │ │ │ │ ├── roollbackFor.png
│ │ │ │ │ └── PlatformTransactionManager.png
│ │ │ ├── springboot-knowledge-and-questions-summary.md
│ │ │ └── springboot-source-code.md
│ │ └── netty.md
│ ├── security
│ │ └── images
│ │ │ └── design-of-authority-system
│ │ │ ├── permission-application.png
│ │ │ ├── new-authority-system-menu.png
│ │ │ ├── new-authority-system-design.png
│ │ │ ├── new-authority-system-management-interface.png
│ │ │ ├── new-authority-system-design-access-flow-chart.png
│ │ │ └── new-authority-system-menu-management-interface.png
│ ├── system-design-questions.md
│ └── design-pattern.md
├── cs-basics
│ ├── data-structure
│ │ ├── pictures
│ │ │ ├── 堆
│ │ │ │ ├── 堆1.png
│ │ │ │ ├── 堆2.png
│ │ │ │ ├── 建堆1.png
│ │ │ │ ├── 建堆2.png
│ │ │ │ ├── 建堆3.png
│ │ │ │ ├── 建堆4.png
│ │ │ │ ├── 堆排序1.png
│ │ │ │ ├── 堆排序2.png
│ │ │ │ ├── 堆排序3.png
│ │ │ │ ├── 堆排序4.png
│ │ │ │ ├── 堆排序5.png
│ │ │ │ ├── 堆排序6.png
│ │ │ │ ├── 堆的存储.png
│ │ │ │ ├── 删除堆顶元素1.png
│ │ │ │ ├── 删除堆顶元素2.png
│ │ │ │ ├── 删除堆顶元素3.png
│ │ │ │ ├── 删除堆顶元素4.png
│ │ │ │ ├── 删除堆顶元素5.png
│ │ │ │ ├── 删除堆顶元素6.png
│ │ │ │ ├── 堆-插入元素1.png
│ │ │ │ ├── 堆-插入元素2.png
│ │ │ │ └── 堆-插入元素3.png
│ │ │ ├── 红黑树
│ │ │ │ ├── 红黑树1.PNG
│ │ │ │ ├── 红黑树1.png
│ │ │ │ ├── 红黑树2.PNG
│ │ │ │ ├── 红黑树2.png
│ │ │ │ ├── 红黑树3.PNG
│ │ │ │ ├── 红黑树3.png
│ │ │ │ ├── 红黑树4.PNG
│ │ │ │ ├── 红黑树4.png
│ │ │ │ ├── 红黑树5.PNG
│ │ │ │ ├── 红黑树5.png
│ │ │ │ ├── 红黑树6.PNG
│ │ │ │ └── 红黑树6.png
│ │ │ └── 线性数据结构
│ │ │ │ ├── 栈.png
│ │ │ │ ├── 数组.png
│ │ │ │ ├── 队列.png
│ │ │ │ ├── 单链表2.png
│ │ │ │ ├── 双向循环链表.png
│ │ │ │ ├── 双向链表.png
│ │ │ │ ├── 循环队列-堆满.png
│ │ │ │ ├── 顺序队列假溢出.png
│ │ │ │ ├── 栈实现浏览器倒退和前进.png
│ │ │ │ └── 栈实现浏览器倒退和前进.drawio
│ │ └── red-black-tree.md
│ ├── operating-system
│ │ └── images
│ │ │ ├── macos.png
│ │ │ ├── unix.png
│ │ │ ├── Linux目录树.png
│ │ │ ├── windows.png
│ │ │ ├── 修改文件权限.png
│ │ │ ├── 用户态与内核态.png
│ │ │ ├── Linux权限命令.png
│ │ │ ├── Linux权限解读.png
│ │ │ └── 文件inode信息.png
│ ├── network
│ │ ├── images
│ │ │ ├── arp
│ │ │ │ ├── arp_same_lan.png
│ │ │ │ ├── 2008410143049281.png
│ │ │ │ └── arp_different_lan.png
│ │ │ ├── http-vs-https
│ │ │ │ ├── OWF.png
│ │ │ │ ├── attack1.png
│ │ │ │ ├── HTTP1.0cache1.png
│ │ │ │ ├── HTTP1.0cache2.png
│ │ │ │ ├── HTTP1.1continue1.png
│ │ │ │ ├── HTTP1.1continue2.png
│ │ │ │ ├── digital-signature.png
│ │ │ │ ├── symmetric-encryption.png
│ │ │ │ ├── public-key-cryptography.png
│ │ │ │ └── public-key-transmission.png
│ │ │ └── network-model
│ │ │ │ └── nerwork-layer-protocol.png
│ │ ├── http-status-codes.md
│ │ ├── the-whole-process-of-accessing-web-pages.md
│ │ └── nat.md
│ └── algorithms
│ │ ├── common-data-structures-leetcode-recommendations.md
│ │ └── classical-algorithm-problems-recommendations.md
├── distributed-system
│ ├── protocol
│ │ └── images
│ │ │ ├── gossip
│ │ │ ├── 反熵-闭环.png
│ │ │ ├── gossip.png
│ │ │ ├── redis-cluster-gossip.png
│ │ │ ├── gossip-rumor-mongering.gif
│ │ │ └── 反熵-闭环.drawio
│ │ │ └── paxos
│ │ │ └── paxos-made-simple.png
│ ├── images
│ │ ├── api-gateway
│ │ │ └── api-gateway-overview.png
│ │ ├── zookeeper
│ │ │ ├── zookeeper-watcher.drawio
│ │ │ └── znode-structure.drawio
│ │ └── distributed-id
│ │ │ ├── distributed-id-requirements.drawio
│ │ │ ├── database-number-segment-mode.drawio
│ │ │ ├── nosql.drawio
│ │ │ ├── the-primary-key-of-the-database-increases-automatically.drawio
│ │ │ └── id-after-the-sub-table-not-conflict.drawio
│ ├── distributed-transaction.md
│ ├── distributed-configuration-center.md
│ └── distributed-lock.md
├── high-performance
│ ├── images
│ │ └── read-and-write-separation-and-library-subtable
│ │ │ ├── two-forms-of-sub-table.png
│ │ │ ├── vertical-slicing-database.png
│ │ │ ├── horizontal-slicing-database.png
│ │ │ ├── vertical-slicing-database.drawio
│ │ │ ├── read-and-write-separation.drawio
│ │ │ ├── read-and-write-separation-proxy.drawio
│ │ │ └── two-forms-of-sub-table.drawio
│ ├── sql-optimization.md
│ └── data-cold-hot-separation.md
├── high-availability
│ ├── idempotency.md
│ ├── fallback-and-circuit-breaker.md
│ ├── redundancy.md
│ ├── high-availability-system-design.md
│ └── timeout-and-retry.md
├── open-source-project
│ ├── big-data.md
│ └── machine-learning.md
├── interview-preparation
│ ├── self-test-of-common-interview-questions.md
│ ├── interview-experience.md
│ └── key-points-of-interview.md
├── books
│ ├── README.md
│ └── search-engine.md
├── zhuanlan
│ ├── README.md
│ ├── handwritten-rpc-framework.md
│ ├── back-end-interview-high-frequency-system-design-and-scenario-questions.md
│ ├── source-code-reading.md
│ └── java-mian-shi-zhi-bei.md
├── javaguide
│ ├── use-suggestion.md
│ ├── contribution-guideline.md
│ ├── history.md
│ ├── intro.md
│ └── faq.md
├── README.md
├── about-the-author
│ ├── dog-that-copies-other-people-essay.md
│ ├── javaguide-100k-star.md
│ ├── README.md
│ ├── my-article-was-stolen-and-made-into-video-and-it-became-popular.md
│ └── feelings-after-one-month-of-induction-training.md
└── high-quality-technical-articles
│ ├── advanced-programmer
│ └── programmer-quickly-learn-new-technology.md
│ ├── work
│ └── 32-tips-improving-career.md
│ ├── README.md
│ └── interview
│ └── some-secrets-about-alibaba-interview.md
├── media
└── pictures
│ └── logo.png
├── .gitattributes
├── .prettierignore
├── .gitignore
├── .markdownlint-cli2.mjs
├── .github
└── workflows
│ └── test.yml
├── package.json
├── sw.js
└── index.html
/.nojekyll:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | pnpm nano-staged
2 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/config.scss:
--------------------------------------------------------------------------------
1 | $theme-color: #2980b9;
2 |
--------------------------------------------------------------------------------
/media/pictures/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/media/pictures/logo.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/me.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/me.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/logo.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/favicon.ico
--------------------------------------------------------------------------------
/docs/.vuepress/styles/index.scss:
--------------------------------------------------------------------------------
1 | body {
2 | @media (min-width: 1440px) {
3 | font-size: 16px;
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text=auto
2 | *.js linguist-language=java
3 | *.css linguist-language=java
4 | *.html linguist-language=java
--------------------------------------------------------------------------------
/docs/java/jvm/pictures/内存区域常见配置参数.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/jvm/pictures/内存区域常见配置参数.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/redo-log.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/redo-log.png
--------------------------------------------------------------------------------
/docs/snippets/article-footer.snippet.md:
--------------------------------------------------------------------------------
1 | 
2 |
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/1.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/2.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/3.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/4.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/5.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/6.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/7.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/8.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/9.png
--------------------------------------------------------------------------------
/docs/system-design/basis/pictures/Codelf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/basis/pictures/Codelf.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/chrome-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/chrome-192.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/chrome-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/chrome-512.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/建堆1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/建堆1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/建堆2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/建堆2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/建堆3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/建堆3.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/建堆4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/建堆4.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/macos.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/macos.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/unix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/unix.png
--------------------------------------------------------------------------------
/docs/database/redis/images/why-redis-so-fast.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/redis/images/why-redis-so-fast.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/10.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/11.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/12.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/13.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/14.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/15.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/16.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/17.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/18.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/19.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/20.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/21.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/22.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/23.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/24.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/25.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/26.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/27.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/28.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/29.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/30.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/thread-local/31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/thread-local/31.png
--------------------------------------------------------------------------------
/docs/java/jvm/pictures/jdk监控和故障处理工具总结/3内存监控.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/jvm/pictures/jdk监控和故障处理工具总结/3内存监控.png
--------------------------------------------------------------------------------
/docs/java/jvm/pictures/jdk监控和故障处理工具总结/4线程监控.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/jvm/pictures/jdk监控和故障处理工具总结/4线程监控.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/ms-icon-144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/ms-icon-144.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序3.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序4.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序5.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆排序6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆排序6.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆的存储.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆的存储.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树1.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树2.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树3.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树3.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树3.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树4.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树4.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树4.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树5.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树5.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树5.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树6.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树6.PNG
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/红黑树/红黑树6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/红黑树/红黑树6.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/栈.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/栈.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/arp/arp_same_lan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/arp/arp_same_lan.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/OWF.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/OWF.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/Linux目录树.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/Linux目录树.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/windows.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/windows.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/修改文件权限.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/修改文件权限.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/用户态与内核态.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/用户态与内核态.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/trans_visible.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/trans_visible.png
--------------------------------------------------------------------------------
/docs/system-design/basis/pictures/dubbo-naming.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/basis/pictures/dubbo-naming.png
--------------------------------------------------------------------------------
/docs/system-design/basis/pictures/vscode-codelf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/basis/pictures/vscode-codelf.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/apple-icon-152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/apple-icon-152.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/chrome-mask-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/chrome-mask-192.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/chrome-mask-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/chrome-mask-512.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/guide-maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/guide-maskable.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素3.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素4.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素5.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/删除堆顶元素6.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆-插入元素1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆-插入元素1.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆-插入元素2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆-插入元素2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/堆/堆-插入元素3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/堆/堆-插入元素3.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/数组.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/数组.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/队列.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/队列.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/Linux权限命令.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/Linux权限命令.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/Linux权限解读.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/Linux权限解读.png
--------------------------------------------------------------------------------
/docs/cs-basics/operating-system/images/文件inode信息.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/operating-system/images/文件inode信息.png
--------------------------------------------------------------------------------
/docs/java/jvm/pictures/jdk监控和故障处理工具总结/1JConsole连接.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/jvm/pictures/jdk监控和故障处理工具总结/1JConsole连接.png
--------------------------------------------------------------------------------
/docs/java/jvm/pictures/jdk监控和故障处理工具总结/2查看Java程序概况.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/jvm/pictures/jdk监控和故障处理工具总结/2查看Java程序概况.png
--------------------------------------------------------------------------------
/docs/snippets/article-header.snippet.md:
--------------------------------------------------------------------------------
1 | [](../about-the-author/zhishixingqiu-two-years.md)
2 |
--------------------------------------------------------------------------------
/docs/system-design/basis/pictures/marting-naming.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/basis/pictures/marting-naming.png
--------------------------------------------------------------------------------
/docs/system-design/basis/pictures/naming-mindmap.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/basis/pictures/naming-mindmap.png
--------------------------------------------------------------------------------
/docs/.vuepress/public/assets/icon/guide-monochrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/.vuepress/public/assets/icon/guide-monochrome.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/单链表2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/单链表2.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/双向循环链表.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/双向循环链表.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/双向链表.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/双向链表.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/arp/2008410143049281.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/arp/2008410143049281.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/arp/arp_different_lan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/arp/arp_different_lan.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/attack1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/attack1.png
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/gossip/反熵-闭环.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/protocol/images/gossip/反熵-闭环.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/循环队列-堆满.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/循环队列-堆满.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/顺序队列假溢出.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/顺序队列假溢出.png
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/gossip/gossip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/protocol/images/gossip/gossip.png
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/images/async/async.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/framework/spring/images/async/async.png
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/栈实现浏览器倒退和前进.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/data-structure/pictures/线性数据结构/栈实现浏览器倒退和前进.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/HTTP1.0cache1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/HTTP1.0cache1.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/HTTP1.0cache2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/HTTP1.0cache2.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/HTTP1.1continue1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/HTTP1.1continue1.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/HTTP1.1continue2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/HTTP1.1continue2.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/digital-signature.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/digital-signature.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/symmetric-encryption.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/symmetric-encryption.png
--------------------------------------------------------------------------------
/docs/distributed-system/images/api-gateway/api-gateway-overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/images/api-gateway/api-gateway-overview.png
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/paxos/paxos-made-simple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/protocol/images/paxos/paxos-made-simple.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/public-key-cryptography.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/public-key-cryptography.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/http-vs-https/public-key-transmission.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/http-vs-https/public-key-transmission.png
--------------------------------------------------------------------------------
/docs/cs-basics/network/images/network-model/nerwork-layer-protocol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/cs-basics/network/images/network-model/nerwork-layer-protocol.png
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/gossip/redis-cluster-gossip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/protocol/images/gossip/redis-cluster-gossip.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/0e906b95-c916-4f30-beda-9cb3e49746bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/0e906b95-c916-4f30-beda-9cb3e49746bf.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/317e91e1-1ee1-42ad-9412-9098d5c6a9ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/317e91e1-1ee1-42ad-9412-9098d5c6a9ad.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/528559e9-dae8-4d14-b78d-a5b657c88391.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/528559e9-dae8-4d14-b78d-a5b657c88391.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/6a276e7a-b0da-4c7b-bdf7-c0c7b7b3b31c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/6a276e7a-b0da-4c7b-bdf7-c0c7b7b3b31c.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/6f82703c-36a1-4458-90fe-d7f4edbac71a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/6f82703c-36a1-4458-90fe-d7f4edbac71a.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/6fb2b9a1-5f14-4dec-a797-e4cf388ed413.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/6fb2b9a1-5f14-4dec-a797-e4cf388ed413.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/79ed6142-7664-4e0b-9023-cf546586aa39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/79ed6142-7664-4e0b-9023-cf546586aa39.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/8778836b-34a8-480b-b8c7-654fe207a8c2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/8778836b-34a8-480b-b8c7-654fe207a8c2.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/a3fd1ec6-8f37-42fa-b090-7446d488fd04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/a3fd1ec6-8f37-42fa-b090-7446d488fd04.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/c52ff79f-10e6-46cb-b5d4-3c9cbcc1934a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/c52ff79f-10e6-46cb-b5d4-3c9cbcc1934a.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/mvvc/cbbedbc5-0e3c-4711-aafd-7f3d68a4ed4e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/mvvc/cbbedbc5-0e3c-4711-aafd-7f3d68a4ed4e.png
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/gossip/gossip-rumor-mongering.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/distributed-system/protocol/images/gossip/gossip-rumor-mongering.gif
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/Executor框架的使用示意图.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/Executor框架的使用示意图.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/FixedThreadPool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/FixedThreadPool.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-dirty-reading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/concurrency-consistency-issues-dirty-reading.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-phantom-read.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/concurrency-consistency-issues-phantom-read.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/SingleThreadExecutor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/SingleThreadExecutor.png
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/images/spring-annotations/@RequestBody.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/framework/spring/images/spring-annotations/@RequestBody.png
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/images/spring-transaction/roollbackFor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/framework/spring/images/spring-transaction/roollbackFor.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-unrepeatable-read.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/concurrency-consistency-issues-unrepeatable-read.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/CachedThreadPool-execute.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/CachedThreadPool-execute.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/threadpoolexecutor构造函数.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/threadpoolexecutor构造函数.png
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-missing-modifications.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/database/mysql/images/concurrency-consistency-issues-missing-modifications.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/ScheduledThreadPoolExecutor机制.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/ScheduledThreadPoolExecutor机制.png
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/permission-application.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/permission-application.png
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/new-authority-system-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/new-authority-system-menu.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/ScheduledThreadPoolExecutor执行周期任务步骤.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/ScheduledThreadPoolExecutor执行周期任务步骤.png
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/images/spring-transaction/PlatformTransactionManager.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/framework/spring/images/spring-transaction/PlatformTransactionManager.png
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/new-authority-system-design.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/new-authority-system-design.png
--------------------------------------------------------------------------------
/docs/java/concurrent/images/java-thread-pool-summary/relationship-between-thread-pool-parameters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/java/concurrent/images/java-thread-pool-summary/relationship-between-thread-pool-parameters.png
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/two-forms-of-sub-table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/high-performance/images/read-and-write-separation-and-library-subtable/two-forms-of-sub-table.png
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/vertical-slicing-database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/high-performance/images/read-and-write-separation-and-library-subtable/vertical-slicing-database.png
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/horizontal-slicing-database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/high-performance/images/read-and-write-separation-and-library-subtable/horizontal-slicing-database.png
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/new-authority-system-management-interface.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/new-authority-system-management-interface.png
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/new-authority-system-design-access-flow-chart.png
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | # Vuepress Cache
2 | **/.vuepress/.cache/**
3 | # Vuepress Temp
4 | **/.vuepress/.temp/**
5 | # Vuepress Output
6 | dist/
7 |
8 | # Node modules
9 | node_modules/
10 |
11 | # pnpm lock file
12 | pnpm-lock.yaml
13 |
14 | index.html
15 | sw.js
16 |
--------------------------------------------------------------------------------
/docs/system-design/security/images/design-of-authority-system/new-authority-system-menu-management-interface.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/22alo/JavaGuide/HEAD/docs/system-design/security/images/design-of-authority-system/new-authority-system-menu-management-interface.png
--------------------------------------------------------------------------------
/docs/snippets/small-advertisement.snippet.md:
--------------------------------------------------------------------------------
1 | ::: tip 这是一则或许对你有用的小广告
2 |
3 | - **面试专版**:准备 Java 面试的小伙伴可以考虑面试专版:**[《Java 面试指北 》](../zhuanlan/java-mian-shi-zhi-bei.md)** (质量非常高,专为面试打造,配合 JavaGuide 食用效果最佳)。
4 | - **知识星球**:技术专栏/一对一提问/简历修改/求职指南/面试打卡/不定时福利,欢迎加入 **[JavaGuide 官方知识星球](../about-the-author/zhishixingqiu-two-years.md)**。
5 |
6 | :::
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | # *.drawio
3 | *.drawio.bkp
4 | .DS_Store
5 | # VS Code Config file
6 | .vscode/
7 | # VuePress Cache
8 | **/.vuepress/.cache/
9 | # VuePress Temp
10 | **/.vuepress/.temp/
11 | # VuePress Output
12 | dist/
13 | traversal-folder-replace-string.py
14 | format-markdown.py
15 |
16 | .npmrc
17 | package-lock.json
18 | lintmd-config.json
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/styles/palette.scss:
--------------------------------------------------------------------------------
1 | $sidebar-width: 20rem;
2 | $sidebar-mobile-width: 16rem;
3 | $vp-font: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", sans-serif';
4 | $vp-font-heading: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", sans-serif';
5 |
--------------------------------------------------------------------------------
/docs/system-design/framework/netty.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Netty常见面试题总结(付费)
3 | category: 框架
4 | icon: "network"
5 | ---
6 |
7 | **Netty** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/distributed-system/distributed-transaction.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 分布式事务常见解决方案总结(付费)
3 | category: 分布式
4 | ---
5 |
6 | **分布式事务** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了《Java 面试指北》中。
7 |
8 | 
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/docs/distributed-system/distributed-configuration-center.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 分布式配置中心常见问题总结(付费)
3 | category: 分布式
4 | ---
5 |
6 | **分布式配置中心** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了《Java 面试指北》中。
7 |
8 | 
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/docs/database/redis/redis-cluster.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Redis集群详解(付费)
3 | category: 数据库
4 | tag:
5 | - Redis
6 | ---
7 |
8 | **Redis 集群** 相关的面试题为我的 [知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。
9 |
10 | 
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/docs/database/redis/cache-basics.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 缓存基础常见面试题总结(付费)
3 | category: 数据库
4 | tag:
5 | - Redis
6 | ---
7 |
8 | **缓存基础** 相关的面试题为我的 [知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。
9 |
10 | 
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: SpringBoot常见面试题总结(付费)
3 | category: 框架
4 | tag:
5 | - Spring
6 | ---
7 |
8 | **Spring Boot** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/docs/high-availability/idempotency.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 接口幂等方案总结(付费)
3 | category: 高可用
4 | icon: security-fill
5 | ---
6 |
7 | **接口幂等** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
8 |
9 | 
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/docs/high-availability/fallback-and-circuit-breaker.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 降级&熔断详解(付费)
3 | category: 高可用
4 | icon: circuit
5 | ---
6 |
7 | **降级&熔断** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
8 |
9 | 
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/docs/system-design/system-design-questions.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 系统设计常见面试题总结(付费)
3 | category: Java面试指北
4 | icon: "design"
5 | ---
6 |
7 | **系统设计** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
8 |
9 | 
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/docs/database/elasticsearch/elasticsearch-questions-01.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Elasticsearch常见面试题总结(付费)
3 | category: 数据库
4 | tag:
5 | - NoSQL
6 | - Elasticsearch
7 | ---
8 |
9 | **Elasticsearch** 相关的面试题为我的[知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。
10 |
11 | 
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/docs/java/collection/priorityqueue-source-code.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: PriorityQueue 源码分析(付费)
3 | category: Java
4 | tag:
5 | - Java集合
6 | ---
7 |
8 | **PriorityQueue 源码分析** 为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 必读源码系列》](https://javaguide.cn/zhuanlan/source-code-reading.html)中。
9 |
10 | 
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/docs/system-design/framework/spring/springboot-source-code.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Spring Boot核心源码解读(付费)
3 | category: 框架
4 | tag:
5 | - Spring
6 | ---
7 |
8 | **Spring Boot 核心源码解读** 为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 必读源码系列》](https://javaguide.cn/zhuanlan/source-code-reading.html)中。
9 |
10 | 
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.markdownlint-cli2.mjs:
--------------------------------------------------------------------------------
1 | export default {
2 | config: {
3 | default: true,
4 | MD003: {
5 | style: "atx",
6 | },
7 | MD004: {
8 | style: "dash",
9 | },
10 | MD010: false,
11 | MD013: false,
12 | MD024: {
13 | allow_different_nesting: true,
14 | },
15 | MD035: {
16 | style: "---",
17 | },
18 | MD036: false,
19 | MD040: false,
20 | MD045: false,
21 | MD046: false,
22 | },
23 | ignores: [
24 | "**/node_modules/**",
25 | // markdown import demo
26 | "**/*.snippet.md",
27 | ],
28 | };
29 |
--------------------------------------------------------------------------------
/docs/open-source-project/big-data.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Java 优质开源大数据项目
3 | category: 开源项目
4 | icon: big-data
5 | ---
6 |
7 | - **[Spark](https://github.com/apache/spark)** :Spark 是用于大规模数据处理的统一分析引擎。
8 | - **[Flink](https://github.com/apache/flink "flink")**:Apache Flink 是一个框架和分布式处理引擎,用于在*无边界和有边界*数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
9 | - **[HBase](https://hbase.apache.org/)**:HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用 HBase 技术可在廉价 PC Server 上搭建起大规模结构化存储集群。
10 | - **[Flume](https://flume.apache.org/)** :Apache Flume 是一个分布式的、可靠的、可用的,从多种不同的源收集、聚集、移动大量日志数据到集中数据存储的系统。
11 | - **[Storm](https://storm.apache.org/)** : 一个分布式,高容错的实时计算系统。
12 |
--------------------------------------------------------------------------------
/docs/interview-preparation/self-test-of-common-interview-questions.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 常见面试题自测(付费)
3 | category: 知识星球
4 | icon: security-fill
5 | ---
6 |
7 | 面试之前,强烈建议大家多拿常见的面试题来进行自测,检查一下自己的掌握情况,这是一种非常实用的备战技术面试的小技巧。
8 |
9 | 在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「技术面试题自测篇」** ,我总结了 Java 面试中最重要的知识点的最常见的面试题并按照面试提问的方式展现出来。
10 |
11 | 
12 |
13 | 每一道用于自测的面试题我都会给出重要程度,方便大家在时间比较紧张的时候根据自身情况来选择性自测。并且,我还会给出提示,方便你回忆起对应的知识点。
14 |
15 | 在面试中如果你实在没有头绪的话,一个好的面试官也是会给你提示的。
16 |
17 | 
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Docs Test
2 |
3 | on:
4 | - push
5 | - pull_request
6 |
7 | jobs:
8 | test-docs:
9 | name: Test docs
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout
13 | uses: actions/checkout@v4
14 |
15 | - name: Install pnpm
16 | uses: pnpm/action-setup@v4
17 |
18 | - name: Setup Node.js
19 | uses: actions/setup-node@v4
20 | with:
21 | node-version: 22
22 | cache: pnpm
23 |
24 | - name: Install deps
25 | run: pnpm install --frozen-lockfile
26 |
27 | - name: Build test
28 | env:
29 | NODE_OPTIONS: --max_old_space_size=4096
30 | run: pnpm docs:build
31 |
--------------------------------------------------------------------------------
/docs/books/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 技术书籍精选
3 | category: 计算机书籍
4 | ---
5 |
6 |
7 |
8 | 精选优质计算机书籍。
9 |
10 | 开源的目的是为了大家能一起完善,如果你觉得内容有任何需要完善/补充的地方,欢迎大家在项目 [issues 区](https://github.com/CodingDocs/awesome-cs/issues) 推荐自己认可的技术书籍,让我们共同维护一个优质的技术书籍精选集!
11 |
12 | - GitHub 地址:[https://github.com/CodingDocs/awesome-cs](https://github.com/CodingDocs/awesome-cs)
13 | - Gitee 地址:[https://gitee.com/SnailClimb/awesome-cs](https://gitee.com/SnailClimb/awesome-cs)
14 |
15 | 如果内容对你有帮助的话,欢迎给本项目点个 Star。我会用我的业余时间持续完善这份书单,感谢!
16 |
17 | ## 公众号
18 |
19 | 最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。
20 |
21 | 
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebar/books.ts:
--------------------------------------------------------------------------------
1 | import { arraySidebar } from "vuepress-theme-hope";
2 |
3 | export const books = arraySidebar([
4 | {
5 | text: "计算机基础",
6 | link: "cs-basics",
7 | icon: "computer",
8 | },
9 | {
10 | text: "数据库",
11 | link: "database",
12 | icon: "database",
13 | },
14 | {
15 | text: "搜索引擎",
16 | link: "search-engine",
17 | icon: "search",
18 | },
19 | {
20 | text: "Java",
21 | link: "java",
22 | icon: "java",
23 | },
24 | {
25 | text: "软件质量",
26 | link: "software-quality",
27 | icon: "highavailable",
28 | },
29 |
30 | {
31 | text: "分布式",
32 | link: "distributed-system",
33 | icon: "distributed-network",
34 | },
35 | ]);
36 |
--------------------------------------------------------------------------------
/docs/high-performance/sql-optimization.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 常见SQL优化手段总结(付费)
3 | category: 高性能
4 | head:
5 | - - meta
6 | - name: keywords
7 | content: 分页优化,索引,Show Profile,慢 SQL
8 | - - meta
9 | - name: description
10 | content: SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 优化,因为它的改造成本相对于代码来说也要小得多。
11 | ---
12 |
13 | **常见 SQL 优化手段总结** 相关的内容为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。
14 |
15 | 
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/docs/system-design/design-pattern.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 设计模式常见面试题总结
3 | category: 系统设计
4 | icon: "Tools"
5 | head:
6 | - - meta
7 | - name: keywords
8 | content: 设计模式,单例模式,责任链模式,适配器模式,工厂模式,代理模式
9 | - - meta
10 | - name: description
11 | content: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象 的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临 的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当⻓的 一段时间的试验和错误总结出来的。
12 | ---
13 |
14 | **设计模式** 相关的面试题已经整理到了 PDF 手册中,你可以在我的公众号“**JavaGuide**”后台回复“**PDF**” 获取。
15 |
16 | 
17 |
18 | **《设计模式》PDF 电子书内容概览**:
19 |
20 | 
21 |
22 |
23 |
--------------------------------------------------------------------------------
/docs/zhuanlan/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 星球专属优质专栏概览
3 | category: 知识星球
4 | ---
5 |
6 | 这部分的内容为我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)专属,目前已经更新了下面这些专栏:
7 |
8 | - **[《Java 面试指北》](./java-mian-shi-zhi-bei.md)** : 与 JavaGuide 开源版的内容互补!
9 | - **[《后端面试高频系统设计&场景题》](./back-end-interview-high-frequency-system-design-and-scenario-questions.md)** : 包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
10 | - **[《手写 RPC 框架》](./java-mian-shi-zhi-bei.md)** : 从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。
11 | - **[《Java 必读源码系列》](./source-code-reading.md)**:目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码
12 | - ……
13 |
14 | 欢迎准备 Java 面试以及学习 Java 的同学加入我的[知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多!收费虽然是白菜价,但星球里的内容比你参加几万的培训班质量还要高。
15 |
16 | 我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!
17 |
18 |
19 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebar/about-the-author.ts:
--------------------------------------------------------------------------------
1 | import { arraySidebar } from "vuepress-theme-hope";
2 |
3 | export const aboutTheAuthor = arraySidebar([
4 | {
5 | text: "个人经历",
6 | icon: "experience",
7 | collapsible: false,
8 | children: [
9 | "internet-addiction-teenager",
10 | "my-college-life",
11 | "javaguide-100k-star",
12 | "feelings-after-one-month-of-induction-training",
13 | "feelings-of-half-a-year-from-graduation-to-entry",
14 | ],
15 | },
16 | {
17 | text: "杂谈",
18 | icon: "chat",
19 | collapsible: false,
20 | children: [
21 | "writing-technology-blog-six-years",
22 | "my-article-was-stolen-and-made-into-video-and-it-became-popular",
23 | "dog-that-copies-other-people-essay",
24 | "zhishixingqiu-two-years",
25 | ],
26 | },
27 | ]);
28 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebar/open-source-project.ts:
--------------------------------------------------------------------------------
1 | import { arraySidebar } from "vuepress-theme-hope";
2 |
3 | export const openSourceProject = arraySidebar([
4 | {
5 | text: "技术教程",
6 | link: "tutorial",
7 | icon: "book",
8 | },
9 | {
10 | text: "实战项目",
11 | link: "practical-project",
12 | icon: "project",
13 | },
14 | {
15 | text: "系统设计",
16 | link: "system-design",
17 | icon: "design",
18 | },
19 | {
20 | text: "工具类库",
21 | link: "tool-library",
22 | icon: "codelibrary-fill",
23 | },
24 | {
25 | text: "开发工具",
26 | link: "tools",
27 | icon: "tool",
28 | },
29 | {
30 | text: "机器学习",
31 | link: "machine-learning",
32 | icon: "a-MachineLearning",
33 | },
34 | {
35 | text: "大数据",
36 | link: "big-data",
37 | icon: "big-data",
38 | },
39 | ]);
40 |
--------------------------------------------------------------------------------
/docs/zhuanlan/handwritten-rpc-framework.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 《手写 RPC 框架》
3 | category: 知识星球
4 | ---
5 |
6 | ## 介绍
7 |
8 | **《手写 RPC 框架》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,我写了 12 篇文章来讲解如何从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。
9 |
10 | 麻雀虽小五脏俱全,项目代码注释详细,结构清晰,并且集成了 Check Style 规范代码结构,非常适合阅读和学习。
11 |
12 | ## 内容概览
13 |
14 | 
15 |
16 | 通过这个简易的轮子,你可以学到 RPC 的底层原理和原理以及各种 Java 编码实践的运用。你甚至可以把它当做你的毕设/项目经验的选择,这是非常不错!对比其他求职者的项目经验都是各种系统,造轮子肯定是更加能赢得面试官的青睐。
17 |
18 | - GitHub 地址:[https://github.com/Snailclimb/guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 。
19 | - Gitee 地址:[https://gitee.com/SnailClimb/guide-rpc-framework](https://gitee.com/SnailClimb/guide-rpc-framework) 。
20 |
21 |
22 |
--------------------------------------------------------------------------------
/docs/java/basis/generics-and-wildcards.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 泛型&通配符详解
3 | category: Java
4 | tag:
5 | - Java基础
6 | ---
7 |
8 | **泛型&通配符** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)(点击链接即可查看详细介绍以及获取方法)中。
9 |
10 | [《Java 面试指北》](hhttps://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html) 的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
11 |
12 | 
13 |
14 | [《Java 面试指北》](hhttps://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)只是星球内部众多资料中的一个,星球还有很多其他优质资料比如[专属专栏](https://javaguide.cn/zhuanlan/)、Java 编程视频、PDF 资料。
15 |
16 | 
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/docs/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 《后端面试高频系统设计&场景题》
3 | category: 知识星球
4 | ---
5 |
6 | ## 介绍
7 |
8 | **《后端面试高频系统设计&场景题》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
9 |
10 | 近年来,随着国内的技术面试越来越卷,越来越多的公司开始在面试中考察系统设计和场景问题,以此来更全面的考察求职者,不论是校招还是社招。不过,正常面试全是场景题的情况还是极少的,面试官一般会在面试中穿插一两个系统设计和场景题来考察你。
11 |
12 | 于是,我总结了这份《后端面试高频系统设计&场景题》,包含了常见的系统设计案例比如短链系统、秒杀系统以及高频的场景题比如海量数据去重、第三方授权登录。
13 |
14 | 即使不是准备面试,我也强烈推荐你认真阅读这一系列文章,这对于提升自己系统设计思维和解决实际问题的能力还是非常有帮助的。并且,涉及到的很多案例都可以用到自己的项目上比如抽奖系统设计、第三方授权登录、Redis 实现延时任务的正确方式。
15 |
16 | 《后端面试高频系统设计&场景题》本身是属于《Java 面试指北》的一部分,后面由于内容篇幅较多,因此被单独提了出来。
17 |
18 | ## 内容概览
19 |
20 | 
21 |
22 |
23 |
--------------------------------------------------------------------------------
/docs/javaguide/use-suggestion.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 使用建议
3 | category: 走近项目
4 | icon: star
5 | ---
6 |
7 | **对于不准备面试的同学来说** ,本文档倾向于给你提供一个比较详细的学习路径,目录清晰,让你对于 Java 整体的知识体系有一个清晰认识。你可以跟着视频、书籍或者官方文档学习完某个知识点之后,然后来这里找对应的总结,帮助你更好地掌握对应的知识点。甚至说,你在有编程基础的情况下,想要学习某个知识点的话,可以直接看我的总结,这样学习效率会非常高。
8 |
9 | **对于准备面试的同学来说** ,本文档涵盖 Java 程序员所需要掌握的核心知识的常见面试问题总结。
10 |
11 | 大部分人看 JavaGuide 应该都是为了准备技术八股文。**那如何才能更高效地准备技术八股文?**
12 |
13 | 对于技术八股文来说,尽量不要死记硬背,这种方式非常枯燥且对自身能力提升有限!但是!想要一点不背是不太现实的,只是说要结合实际应用场景和实战来理解记忆。
14 |
15 | 我一直觉得面试八股文最好是和实际应用场景和实战相结合。很多同学现在的方向都错了,上来就是直接背八股文,硬生生学成了文科,那当然无趣了。
16 |
17 | 举个例子:你的项目中需要用到 Redis 来做缓存,你对照着官网简单了解并实践了简单使用 Redis 之后,你去看了 Redis 对应的八股文。你发现 Redis 可以用来做限流、分布式锁,于是你去在项目中实践了一下并掌握了对应的八股文。紧接着,你又发现 Redis 内存不够用的情况下,还能使用 Redis Cluster 来解决,于是你就又去实践了一下并掌握了对应的八股文。
18 |
19 | 而且, **面试中有水平的面试官都是根据你的项目经历来顺带着问一些技术八股文** 。
20 |
21 | 举个例子:你的项目用到了消息队列,那面试官可能就会问你:为什么使用消息队列?项目中什么模块用到了消息队列?如何保证消息不丢失?如何保证消息的顺序性?(结合你使用的具体的消息队列来准备)……。
22 |
23 | **一定要记住你的主要目标是理解和记关键词,而不是像背课文一样一字一句地记下来!**
24 |
25 | 另外,记录博客或者用自己的理解把对应的知识点讲给别人听也是一个不错的选择。
26 |
27 | 最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。
28 |
--------------------------------------------------------------------------------
/docs/interview-preparation/interview-experience.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 优质面经汇总(付费)
3 | category: 知识星球
4 | icon: experience
5 | ---
6 |
7 | 古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。
8 |
9 | 在 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)** 的 **「面经篇」** ,我分享了 15+ 篇高质量的 Java 后端面经,有校招的,也有社招的,有大厂的,也有中小厂的。
10 |
11 | 如果你是非科班的同学,也能在这些文章中找到对应的非科班的同学写的面经。
12 |
13 | 
14 |
15 | 并且,[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。
16 |
17 | 
18 |
19 | 
20 |
21 | 
22 |
23 | 相比于牛客网或者其他网站的面经,《Java 面试指北》中整理的面经质量更高,并且,我会提供优质的参考资料。
24 |
25 | 有很多同学要说了:“为什么不直接给出具体答案呢?”。主要原因有如下两点:
26 |
27 | 1. 参考资料解释的要更详细一些,还可以顺便让你把相关的知识点复习一下。
28 | 2. 给出的参考资料基本都是我的原创,假如后续我想对面试问题的答案进行完善,就不需要挨个把之前的面经写的答案给修改了(面试中的很多问题都是比较类似的)。当然了,我的原创文章也不太可能覆盖到面试的每个点,部分面试问题的答案,我是精选的其他技术博主写的优质文章,文章质量都很高。
29 |
30 |
31 |
--------------------------------------------------------------------------------
/docs/javaguide/contribution-guideline.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 贡献指南
3 | category: 走近项目
4 | icon: guide
5 | ---
6 |
7 | 欢迎参与 JavaGuide 的维护工作,这是一件非常有意义的事情。详细信息请看:[JavaGuide 贡献指南](https://zhuanlan.zhihu.com/p/464832264) 。
8 |
9 | 你可以从下面几个方向来做贡献:
10 |
11 | - 修改错别字,毕竟内容基本都是手敲,难免会有笔误。
12 | - 对原有内容进行修改完善,例如对某个面试问题的答案进行完善、对某篇文章的内容进行完善。
13 | - 新增内容,例如新增面试常问的问题、添加重要知识点的详解。
14 |
15 | 目前的贡献奖励也比较丰富和完善,对于多次贡献的用户,有耳机、键盘等实物奖励以及现金奖励!
16 |
17 | 一定一定一定要注意 **排版规范**:
18 |
19 | - [中文文案排版指北 - GitHub](https://github.com/sparanoid/chinese-copywriting-guidelines)
20 | - [写给大家看的中文排版指南 - 知乎](https://zhuanlan.zhihu.com/p/20506092)
21 | - [中文文案排版细则 - Dawner](https://dawner.top/posts/chinese-copywriting-rules/)
22 | - [中文技术文档写作风格指南](https://github.com/yikeke/zh-style-guide/)
23 |
24 | 如果要提 issue/question 的话,强烈推荐阅读下面这些资料:
25 |
26 | - [《提问的智慧》](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way)
27 | - [《如何向开源社区提问题》](https://github.com/seajs/seajs/issues/545)
28 | - [《如何有效地报告 Bug》](http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html)
29 | - [《如何向开源项目提交无法解答的问题》](https://zhuanlan.zhihu.com/p/25795393)。
30 |
31 | 另外,你可以参考学习别人的文章,但一定一定一定不能复制粘贴别人的内容,努力比别人写的更容易理解,用自己的话讲出来,适当简化表达,突出重点!
32 |
--------------------------------------------------------------------------------
/docs/snippets/planet2.snippet.md:
--------------------------------------------------------------------------------
1 | ## 星球其他资源
2 |
3 | [知识星球](../about-the-author/zhishixingqiu-two-years.md)除了提供了 **《Java 面试指北》** 、 **《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x 、Netty 4.x、SpringBoot2.1 的源码)、 **《手写 RPC 框架》** 、**《Kafka 常见面试题/知识点总结》** 等多个专属小册,还有读书活动、学习打卡、简历修改、免费提问、海量 Java 优质面试资源以及各种不定时的福利。
4 |
5 | 
6 |
7 | 
8 |
9 | 下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
10 |
11 | [](../about-the-author/zhishixingqiu-two-years.md)
12 |
13 | **我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
14 |
15 | 如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md)。
16 |
17 | ## 星球限时优惠
18 |
19 | 这里再送一张 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
20 |
21 | 
22 |
23 | 进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1)** 。
24 |
25 | **无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
26 |
27 | 不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
28 |
--------------------------------------------------------------------------------
/docs/snippets/yuanma.snippet.md:
--------------------------------------------------------------------------------
1 | [《Java 必读源码系列》](../zhuanlan/source-code-reading.md)(点击链接即可查看详细介绍)的部分内容展示如下。
2 |
3 | 
4 |
5 | 为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的[Java 面试知识星球](../about-the-author/zhishixingqiu-two-years.md)。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面,非常适合准备 Java 面试和学习 Java 的同学。
6 |
7 | **欢迎准备 Java 面试以及学习 Java 的同学加入我的 [知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。**
8 |
9 | 下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
10 |
11 | [](../about-the-author/zhishixingqiu-two-years.md)
12 |
13 | **我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
14 |
15 | 如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md) 。
16 |
17 | 这里再送一个 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
18 |
19 | 
20 |
21 | 进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** 。
22 |
23 | **无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
24 |
25 | 不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
26 |
--------------------------------------------------------------------------------
/docs/open-source-project/machine-learning.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Java 优质开源 AI 项目
3 | category: 开源项目
4 | icon: a-MachineLearning
5 | ---
6 |
7 | 由于 Java 在 AI 领域目前的应用较少,因此相关的开源项目也非常少。
8 |
9 | ## 基础框架
10 |
11 | - [Spring AI](https://github.com/spring-projects/spring-ai):人工智能工程应用框架,为开发 AI 应用程序提供了 Spring 友好的 API 和抽象。
12 | - [Spring AI Alibaba](https://github.com/alibaba/spring-ai-alibaba):一款 Java 语言实现的 AI 应用开发框架,旨在简化 Java AI 应用程序开发,让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。
13 | - [LangChain4j](https://github.com/langchain4j/langchain4j):LangChiain 的 Java 版本,用于简化将 LLM(Large Language Model,大语言模型) 集成到 Java 应用程序的过程。
14 | - [Deeplearning4j](https://github.com/eclipse/deeplearning4j):Deeplearning4j 是第一个为 Java 和 Scala 编写的商业级,开源,分布式深度学习库。
15 | - [Smile](https://github.com/haifengl/smile):基于 Java 和 Scala 的机器学习库。
16 | - [GdxAI](https://github.com/libgdx/gdx-ai):完全用 Java 编写的人工智能框架,用于使用 libGDX 进行游戏开发。
17 |
18 | ## 实战
19 |
20 | - [springboot-openai-chatgpt](https://github.com/274056675/springboot-openai-chatgpt):一个基于 SpringCloud 微服务架构,已对接 GPT-3.5、GPT-4.0、百度文心一言、Midjourney 绘图等等。
21 | - [ai-beehive](https://github.com/hncboy/ai-beehive):AI 蜂巢,基于 Java 使用 Spring Boot 3 和 JDK 17,支持的功能有 ChatGPT、OpenAi Image、Midjourney、NewBing、文心一言等等。
22 |
--------------------------------------------------------------------------------
/docs/.vuepress/navbar.ts:
--------------------------------------------------------------------------------
1 | import { navbar } from "vuepress-theme-hope";
2 |
3 | export default navbar([
4 | { text: "面试指南", icon: "java", link: "/home.md" },
5 | { text: "开源项目", icon: "github", link: "/open-source-project/" },
6 | { text: "技术书籍", icon: "book", link: "/books/" },
7 | {
8 | text: "程序人生",
9 | icon: "article",
10 | link: "/high-quality-technical-articles/",
11 | },
12 | {
13 | text: "知识星球",
14 | icon: "planet",
15 | children: [
16 | {
17 | text: "星球介绍",
18 | icon: "about",
19 | link: "/about-the-author/zhishixingqiu-two-years.md",
20 | },
21 | {
22 | text: "星球专属优质专栏",
23 | icon: "about",
24 | link: "/zhuanlan/",
25 | },
26 | {
27 | text: "星球优质主题汇总",
28 | icon: "star",
29 | link: "https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1",
30 | },
31 | ],
32 | },
33 | {
34 | text: "网站相关",
35 | icon: "about",
36 | children: [
37 | { text: "关于作者", icon: "zuozhe", link: "/about-the-author/" },
38 | {
39 | text: "更新历史",
40 | icon: "history",
41 | link: "/timeline/",
42 | },
43 | ],
44 | },
45 | ]);
46 |
--------------------------------------------------------------------------------
/docs/zhuanlan/source-code-reading.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 《Java 必读源码系列》
3 | category: 知识星球
4 | star: true
5 | ---
6 |
7 | ## 介绍
8 |
9 | **《Java 必读源码系列》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot 2.1 等框架/中间件的源码。后续还会整理更多值得阅读的优质源码,持续完善中。
10 |
11 | 结构清晰,内容详细,非常适合想要深入学习框架/中间件源码的同学阅读。
12 |
13 | ## 内容概览
14 |
15 | 
16 |
17 |
18 |
19 | ## 更多专栏
20 |
21 | 除了《Java 必读源码系列》之外,我的知识星球还有 [《Java 面试指北》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247536358&idx=2&sn=a6098093107d596d3c426c9e71e871b8&chksm=cea1012df9d6883b95aab61fd815a238c703b2d4b36d78901553097a4939504e3e6d73f2b14b&token=710779655&lang=zh_CN#rd)**、**[《后端面试高频系统设计&场景题》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247536451&idx=1&sn=5eae2525ac3d79591dd86c6051522c0b&chksm=cea10088f9d6899e0aee4146de162a6de6ece71ba4c80c23f04d12b1fd48c087a31bc7d413f4&token=710779655&lang=zh_CN#rd)、《手写 RPC 框架》等多个专栏。进入星球之后,统统都可以免费阅读。
22 |
23 | 
24 |
--------------------------------------------------------------------------------
/docs/database/redis/images/aof-rewrite.drawio:
--------------------------------------------------------------------------------
1 | 7VZNj9MwEP01Pm6VxE3bPTb9ACEWkIoEe3TjSWJw4uK42+7+euxk0nxtVywITlxa+3n8bM97Mwqhq/z8RrNDdqc4SBJ4/EzomgSB73sz++eQxxqZL25rINWCY1AL7MQTIOghehQcyl6gUUoaceiDsSoKiE0PY1qrUz8sUbJ/6oGlMAJ2MZNj9IvgJqvRRTBv8bcg0qw52Z/h+3LWBONLyoxxdepAdEPoSitl6lF+XoF0yWvyUu/bXlm9XExDYX5lQ5gcow98b8TN8cf6M/d3357UDbI8MHnEBy8/bslmRm5nZDEnmymJIhKhhqV5bNKi1bHg4Jh9QqNTJgzsDix2qydrBItlJpe4nKjCoLL+zM2FlCslla64KPg8hLnFS6PVd2hWClUAbt6yXEhnoHdgIs1EUdrb3KlCNeTqqKuzM2OsL4KQLu2PzYT7cQHlJFUqlcAOopzEKq8W4rIK3SY1ux12+cMgwhMwRaANnK/m3r8oaksBVA5GW0qv2dCYAKsgmOP81HrKn4c1lnX95GEgQx+nF+5WajtAtV+hfDBSfiQyFHzpSsjOYsnKUsR9XVsTeHYGZ2G+4oob3zt8EuJsfe6ErR9xUh8JfFSDg8TaazUSv+jksQCdBIfeOL8NpkEyIx7613gu53jCJyXsBS/60kVfX0oHstXXx13dIh0QTemAKBgQGaZTMCOiygKXZ/++K+jIFRpO2lb32BxWtPdsb9t9zxNMirRwhrECgi3jyNWNsP10iQu54NxxRBpK8cT2FZ/zwsG9qXplGJFwPegb4UuFiM0fydqW2/XR9SK4WrU33iToqeH/mVmaEJUkJfwV+ab/2/m/aOfDKg1un2nnwTPtZha+upvbafuNUPuk/dKim58=
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "javaguide",
3 | "version": "2.0.0-alpha.40",
4 | "private": true,
5 | "description": "javaguide",
6 | "license": "MIT",
7 | "author": "Guide",
8 | "scripts": {
9 | "docs:build": "vuepress build docs",
10 | "docs:dev": "vuepress dev docs",
11 | "docs:clean-dev": "vuepress dev docs --clean-cache",
12 | "lint": "pnpm lint:prettier && pnpm lint:md",
13 | "lint:md": "markdownlint-cli2 '**/*.md'",
14 | "lint:prettier": "prettier --check --write .",
15 | "prepare": "husky",
16 | "update": "pnpm dlx vp-update"
17 | },
18 | "nano-staged": {
19 | "**/*": "prettier --write --ignore-unknown",
20 | ".md": "markdownlint-cli2"
21 | },
22 | "dependencies": {
23 | "@vuepress/bundler-vite": "2.0.0-rc.19",
24 | "@vuepress/plugin-feed": "2.0.0-rc.70",
25 | "@vuepress/plugin-search": "2.0.0-rc.70",
26 | "husky": "9.1.7",
27 | "markdownlint-cli2": "0.17.1",
28 | "mathjax-full": "3.2.2",
29 | "nano-staged": "0.8.0",
30 | "prettier": "3.4.2",
31 | "sass-embedded": "1.83.1",
32 | "vue": "^3.5.13",
33 | "vuepress": "2.0.0-rc.19",
34 | "vuepress-theme-hope": "2.0.0-rc.68"
35 | },
36 | "packageManager": "pnpm@10.0.0"
37 | }
38 |
--------------------------------------------------------------------------------
/docs/javaguide/history.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 网站历史
3 | category: 走近项目
4 | ---
5 |
6 | 由于项目内容一直持续在更新迭代,所以,这里就不记录项目内容的具体更新情况了。
7 |
8 | 你可以通过 [RSS 订阅](https://javaguide.cn/feed.json)获取网站的最新更新,你还可以通过 [https://javaguide.cn/article/](https://javaguide.cn/article/)获取到网站最新更新的文章。
9 |
10 | 
11 |
12 | 这里只记录一些比较重要的一些节点:
13 |
14 | - [2022-06-13](https://github.com/Snailclimb/JavaGuide/commit/83efb36fb56d197f2c4b471084b884c6a4f23e37):完善网站排版以及样式。
15 | - [2022-04-09](https://github.com/Snailclimb/JavaGuide/commit/618477f96c4a976cfe5a3bba2f646c0d20e3137e):添加[技术书籍精选](https://javaguide.cn/books/)。
16 | - [2021-03-13](https://github.com/Snailclimb/JavaGuide/commit/5c45af9c7a7cff0d3bc905b09b3bc42f2ee8a88a):添加[开源项目精选](https://javaguide.cn/open-source-project/)。
17 | - [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/827996e7722fd51718863d4bee156a8c6c759ff5) : 移除了开发工具的部分内容。
18 | - [2021-03-03](https://github.com/Snailclimb/JavaGuide/commit/5a5f8ccb3bfb8d6ba8ac41295f1a1e4555395260):vuepress-theme-hope 主题更新升级(比较重要的一次主题更新,从 1.x 版本升级到 2.x 版本,网站性能提升)。
19 | - [2021-11-09](https://github.com/Snailclimb/JavaGuide/commit/dc45389934b7763f4f9789168f71c72ef303d3c4) : 基于 vuepress 重构整个项目,提升阅读体验。
20 |
--------------------------------------------------------------------------------
/docs/snippets/planet.snippet.md:
--------------------------------------------------------------------------------
1 | [《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)(点击链接即可查看详细介绍)的部分内容展示如下,你可以将其看作是 [JavaGuide](https://javaguide.cn/#/) 的补充完善,两者可以配合使用。
2 |
3 | 
4 |
5 | 为了帮助更多同学准备 Java 面试以及学习 Java ,我创建了一个纯粹的[Java 面试知识星球](../about-the-author/zhishixingqiu-two-years.md)。虽然收费只有培训班/训练营的百分之一,但是知识星球里的内容质量更高,提供的服务也更全面,非常适合准备 Java 面试和学习 Java 的同学。
6 |
7 | **欢迎准备 Java 面试以及学习 Java 的同学加入我的 [知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习氛围也很不错!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。**
8 |
9 | 下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
10 |
11 | [](../about-the-author/zhishixingqiu-two-years.md)
12 |
13 | **我有自己的原则,不割韭菜,用心做内容,真心希望帮助到你!**
14 |
15 | 如果你感兴趣的话,不妨花 3 分钟左右看看星球的详细介绍:[JavaGuide 知识星球详细介绍](../about-the-author/zhishixingqiu-two-years.md) 。
16 |
17 | 这里再送一张 **30** 元的星球专属优惠券,数量有限(价格即将上调。老用户续费半价 ,微信扫码即可续费)!
18 |
19 | 
20 |
21 | 进入星球之后,记得查看 **[星球使用指南](https://t.zsxq.com/0d18KSarv)** (一定要看!!!) 和 **[星球优质主题汇总](https://t.zsxq.com/12uSKgTIm)** ,干货多多!
22 |
23 | **无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
24 |
25 | 不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
26 |
--------------------------------------------------------------------------------
/docs/database/mysql/images/ACID.drawio:
--------------------------------------------------------------------------------
1 | 7Zhdb5swFIZ/jS9b8R24BAJdp1Wamotply6Yj9VgZkyT7tfPBjvAIFK7LcqqNZHAfo99bJ/zxLIDzLA63FDYFHckRRgYWnoA5hYYhq4ZHn8J5XlQPM0chJyWqWw0CrvyB1I9pdqVKWpnDRkhmJXNXExIXaOEzTRIKdnPm2UEz0dtYI4Wwi6BeKl+KVNWDKprbEb9AyrzQo2sO3LBDzB5zCnpajkeMMzYiePYHcwVVL7kQtsCpmQ/kcwImCElhA2l6hAiLGKrwjb0i09Yj/OmqGYv6fD5/ttDl3wtnor7T9S9tRq/C6/swcsTxB1Sy+gny55VgPolIuFEB2awL0qGdg1MhHXPkeBawSoszVmJcUgwoX1f0wp9y9twvWWUPCJlqUmNhKgioonKI2JJISs5hm0ryxmp2cTl8JF6DKsSC/A+IhZQWNYtn/sdqYm070hH+5kWjHGeDNv0+YOHSDxEg/Y6JyTHCDZle52Qqjckbd80zgbvvDj1bxuBHGGZAZmUJ0QZOkwkmZEbRCrEKHepKasp6Xj+pb4fWTRtqRUTDg1LilDynx99jwzwgsTgFUjoK0g4mMmIzthwvndEGa7a/qfN46vpXnMYjbyUi7cPohgEIXBdENnAjYAXi4K/BZ4GIge4GvA3qo2nxgRDnpSTv0pnZovvKTpPcfdyat8+nZs5nYa2pFM3Vuh0zgWncSY4wwmcFghcQWPEnxsQWJeBM4XIzZI/3zrfPISm9a9BaJ4JwtsJhB7wfOBx9jbAd0AQjBCeYm+Q2wbWvz+DNcIHj+fYfrPMSN4JX9lmvUsTbp2J8O2EcM4zL+j9fusB177QGcBN0DuEa9vsxSF0FhD64e12kX2+PjZP8fpxbpJ3KUFc5jWvJjxqiOuBiFbJr4a+NFRlmophVpkaqVMMyMut8Z+dEo8EqDuMvSTHW7vCvB4cXh0vzL1t8q+EGf0E
--------------------------------------------------------------------------------
/docs/books/search-engine.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 搜索引擎必读经典书籍
3 | category: 计算机书籍
4 | icon: "search"
5 | ---
6 |
7 | ## Lucene
8 |
9 | Elasticsearch 在 Apache Lucene 的基础上开发而成,学习 ES 之前,建议简单了解一下 Lucene 的相关概念。
10 |
11 | **[《Lucene 实战》](https://book.douban.com/subject/6440615/)** 是国内为数不多的中文版本讲 Lucene 的书籍,适合用来学习和了解 Lucene 相关的概念和常见操作。
12 |
13 | 
14 |
15 | ## Elasticsearch
16 |
17 | **[《一本书讲透 Elasticsearch:原理、进阶与工程实践》](https://book.douban.com/subject/36716996/)**
18 |
19 | 
20 |
21 | 基于 8.x 版本编写,目前全网最新的 Elasticsearch 讲解书籍。内容覆盖 Elastic 官方认证的核心知识点,源自真实项目案例和企业级问题解答。
22 |
23 | **[《Elasticsearch 核心技术与实战》](http://gk.link/a/10bcT "《Elasticsearch 核心技术与实战》")**
24 |
25 | 极客时间的这门课程基于 Elasticsearch 7.1 版本讲解,还算比较新。并且,作者是 eBay 资深技术专家,有 20 年的行业经验,课程质量有保障!
26 |
27 | 
28 |
29 | **[《Elasticsearch 源码解析与优化实战》](https://book.douban.com/subject/30386800/)**
30 |
31 | 
32 |
33 | 如果你想进一步深入研究 Elasticsearch 原理的话,可以看看张超老师的这本书。这是市面上唯一一本写 Elasticsearch 源码的书。
34 |
--------------------------------------------------------------------------------
/docs/database/redis/images/redis-list.drawio:
--------------------------------------------------------------------------------
1 | 7VlNc9owFPw1HJPBlg32MYE07aGdDnSS5tRR7YetRrY8sgiQX18Zy9iWYEIpXy05Ya3kJ2l3rfc0dNAgmd9znMWfWQi0Y3fDeQcNO7Zt+QjJnwJZlIjv90sg4iRUg2pgTF5BgV2FTkkIeWugYIwKkrXBgKUpBKKFYc7ZrD1swmh71gxHYADjAFMTfSShiEvUs/s1/hFIFFczWz2/7ElwNVjtJI9xyGYNCN110IAzJsqnZD4AWpBX8VK+92FD72phHFKxzQujhx/xr0fijsbJyPr2+jD69MW+UlFeMJ2qDavFikXFAGfTNIQiiNVBt7OYCBhnOCh6Z1JzicUioao7fwYRFPvuysaEpUIpavVl21xxNT1wAfMGpHZwDywBwRdyiOq9chSbyk42Uu1ZLY7bVVjcEKavMKz8EK1C15TJB8XaHzBoGwwuH60D8jghlA4YZXwZGIUYvElQvCQ4e4ZGTy/w4OfkL5mvmHZMpv01RLuHIhqtJ/qQhj0u0VWvbvFTE++sJx79b8Tb3pkR33v7cIY0vCmynGwFFOc5CdosSzb44rtiedl4KhrXtlu1h/Nm73ChWrsd5ALzCMTb+QbCVtY1JWkd55sp50CxIC/tXL1OBzXDV0bkiutsYiFdcq8dI2dTHoB6rZlc9Ui6d2zNFCUzRqClL1b73t0q/X/OKmdiAaenCed1r93dPOC6RqijeqAqmfdiAuv9vNhC4V2PC8fXArm+7rpDm2WLyv/MzHImJjCuILufGGb+OfaRYd5eeDbNY8MKsoQSWv3WKsVSloJWtykIUxKlhYOknCDx26IgI/KCfaM6EhKGxTRrC8a6pNzdN9tXgK61IYs3nOWscZae7PdWAVpm7c0zlr3LU9Lun1oe15CHXvDnI5OKJpB1aoHMKxS93O/H1OfkH5B5b+HLac9TIF2TlmB7EMipzvtKn+6p9fHM7wcmlyqPUfkdTh7ZrP8ZKKu9+v8VdPcb
--------------------------------------------------------------------------------
/docs/database/redis/images/memory-fragmentation.drawio:
--------------------------------------------------------------------------------
1 | 7VdNc9owEP01OtLBNhj5aBOSTmbaaSeHpL10hC1sTWSLCvHVX9+VvQb8QZs0bWlmOhyQ3sq7631vF0G8ab670WyZvVMJl8QdJjviXRHXdZyhD18W2VdIEEwqINUiwUNH4E584wgOEV2LhK8aB41S0ohlE4xVUfDYNDCmtdo2jy2UbEZdspR3gLuYyS56LxKTVSh1J0f8LRdpVkd2/KCy5Kw+jG+yyliitieQNyPeVCtlqlW+m3Jpi1fXpXru+oz1kJjmhXnKA/l7Z//5y+2nj/cmH6zmi83jgz9ALxsm1/jCxPUl+ItWS1bYrM0eS+F/XdtUo4UqzGBVEhXCAYcugezoaIdVar8pmY1JeEWA8BklNCT04BuSrNxXJ7E+h0iuVusi4TZvB8zbTBh+t2SxtW5BZoBlJpdotvmgbhxq90LKqZJKl768hHG6iO0LGa0e+YnFjymfL6ylZmZoN4/cxBn6TiVbrdCAleLa8N1ZCpwDsdARXOXc6D0cwQfcCWoBm8H1cL89Ssup9ZKdyMpHjKGa04PrI+GwQM6fwb/7e/i/HPmviOzg0mR7/8n+W2R740uTPXrlZF+MupFzaeomPdS1SsmLJLS3G9jFthwi/vGPIt8J84A2u/5k6/dmjLurHZaz3Oz7il5lwJPObalVZshSrXXMf6bMLh0n5R73VLvGNJfMiE0zjT4KMMIHJSDBA9ujYYvtNotV+vjU6XWq7Yi2HI1ajgzTKTcdR6UiDq/96yKhXZFAY1Kf0HHdodCqExK6hM7sggaETjpCgr4xrcZrTNNCFbw1ehFiUqSF1R8IgAMe2S4UcHMO0ZCLJLFheju9OQvacm00f93vTr8mX9T8HRafeiNz/1TzB/28AqNTMhuRaFpOXkCuSQSL6xIJb9mG3di/SvUsnusnjXj/zOW9DAUSmpZDfliKCkNVYSCDwCPh+B8UlNWMZHMuIxY/piXeDn4iNx/3J9eHqPyUPg3MGmVjD7wzI/FF8vOC1rWh77eH9sjPeb78YHv8s1lNoeNfdm/2HQ==
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | home: true
3 | icon: home
4 | title: Java 面试指南
5 | heroImage: /logo.svg
6 | heroText: JavaGuide
7 | tagline: 「Java学习 + 面试指南」涵盖 Java 程序员需要掌握的核心知识
8 | actions:
9 | - text: 开始阅读
10 | link: /home.md
11 | type: primary
12 | - text: 知识星球
13 | link: /about-the-author/zhishixingqiu-two-years.md
14 | type: default
15 | footer: |-
16 | 鄂ICP备2020015769号-1 | 主题: VuePress Theme Hope
17 | ---
18 |
19 | ## 关于网站
20 |
21 | JavaGuide 已经持续维护 6 年多了,累计提交了 **5600+** commit ,共有 **550+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
22 |
23 | 如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收获再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。
24 |
25 | - [项目介绍](./javaguide/intro.md)
26 | - [贡献指南](./javaguide/contribution-guideline.md)
27 | - [常见问题](./javaguide/faq.md)
28 |
29 | ## 关于作者
30 |
31 | - [我曾经也是网瘾少年](./about-the-author/internet-addiction-teenager.md)
32 | - [害,毕业三年了!](./about-the-author/my-college-life.md)
33 | - [我的知识星球快 3 岁了!](./about-the-author/zhishixingqiu-two-years.md)
34 | - [坚持写技术博客六年了](./about-the-author/writing-technology-blog-six-years.md)
35 |
36 | ## 公众号
37 |
38 | 最新更新会第一时间同步在公众号,推荐关注!另外,公众号上有很多干货不会同步在线阅读网站。
39 |
40 | 
41 |
--------------------------------------------------------------------------------
/docs/database/mysql/images/AID-C.drawio:
--------------------------------------------------------------------------------
1 | 5ZjZcpswFIafRpfJAGK9BBvStM1Fm+mS3skglkYgCvKWp68EwoCNM0k6HmdqZwZL/znazvmkIAM4yzc3FSrTOxphAjQl2gA4B5qmKprDv4SybRVHga2QVFkknXrhPnvCXUupLrMI1yNHRilhWTkWQ1oUOGQjDVUVXY/dYkrGo5YowQfCfYjIofoji1jaqrZm9foHnCVpN7JqygUvUPiYVHRZyPGABgMzCAK7Neeo60sutE5RRNcDCfoAzipKWVvKNzNMRGy7sLXtgiPW3bwrXLAXNSBfy+/et6cCXX26ib/o33+pqyvZS822XTxwxMMjq7RiKU1ogYjfq16zZix6VXit9/lMaclFlYu/MWNbmWu0ZJRLKcuJtOJNxn6K5teGrD0MLPON7LmpbLtKwartoJGoPgxtfbOm1rWrHzELU1mJacEClGdEWD9i5lUoK2q+/jtaUGm/p8sqFPNOGeMIagZ0+YNHVTyEQ32dUJoQjMqsvg5p3hjCunEN4rZ3Xhz2b2jecIQ2LqpYcM0q+rgDjzPhHaa1y1E3sWO51OTuQVWC2TN+eusnEj0YQEJzg2mOeQC5Q4UJYtlqvE+Q3G7Jzq9Hjhckda8gUM56hcgSdxtpD8keOBGydZoxfF+iJhZrfiiN4dpts4PsJwTVdUdCRsiMElo1I0B95uqOtcvHwGI2H5m5gd5+3gVTR4lZ4YrhzbM5llYNykNNHuKaIg+tdX8kQkNq6eA41HTlRFzACS5MwmRER4CYf5a0M1zVze7i8VVUp9z0Rl5KxLcL/AB4M2DbwDeA7QMnEAV3DhwF+CawFeBanY/TjQnaPHWd/Buie/DFhvh7E3wvhP2/QNTWx4hah4iq2gSi5qkI1U9E6GxAqA48WyDp86cFPP08hEYI23E4SWho40V8WSRCY0yioZ6bRONEJN4OSHSA4wKHA2gB1wSe15N4DMBWrktUvH0GU5i3PZ7iII5jLZzEPDIXpmFeGubjdwJonhtz80SYzweYc6h5QW1OXgfYxpleCewQT5O4sA3dUC6LRB2+t3/91gGJ7u38gAC+PLZ3ORmls6AF3su9lBDJkoJXQx40zHVPBCsLEXGlIc+iqLmMT3E1vqAPrpzahb0zQmsPHO0QHGfqVvN6bni1/ymnsQ1+L4P+Xw==
--------------------------------------------------------------------------------
/docs/distributed-system/protocol/images/gossip/反熵-闭环.drawio:
--------------------------------------------------------------------------------
1 | 5VhNc5swEP01HONBYDAcjeOm06bTTHNoc+ooIIwaQIyQY5NfXwkkg4w/iJukziQHR/skFmnf7mPBsGfZ+orCIvlGIpQalhmtDfvSsCwATJf/E0jVIL4/aYAFxZFc1AK3+AlJ0JToEkeo1BYyQlKGCx0MSZ6jkGkYpJSs9GUxSfW7FnCBesBtCNM++hNHLGlQz5q0+GeEF4m6M3D9ZiaDarE8SZnAiKw6kD037BklhDWjbD1DqQieiktz3ac9s5uNUZSzIRcEfoFuKoCmflF8L77+dn58yS6kl0eYLuWBjblneFPD44OJ+A38qdw/q1RQuGMef24EqwQzdFvAUMyseApwLGFZyi3Ah7AsGlJivEZ8H0GM03RGUkJrR3Ycx1YYcrxklDygzkzk3ruOK2ZU2ExhPCAWJtJ5THImEwZ43O4HRJ0OUYbWHUgG6AqRDDFa8SVy1lZpJ7PVGkt71eFeQkmHdoVBmW2LjeeWED6QnDyDn/EAfmYfhx9rix/b+8/8+P3YR1w/pEkoS8iC5DCdt2hAyTKPRLTrkLVrrgkpZOj+IMYqGTu4ZERnbXBgS7KkITqwfUcqKqQLxI6noTjbQZooSiHDj7p2vnjQQb8qrJ08XMN7/jjSMz7Fi5yPQx4rxHM5EMmHud5P5USGo6ihCZX4Cd7X/gRRBcE5q4/iBIZzOYiHQznTy/rNQ0zeVHtO7KoGc2R66vlaaY4G8yB934izdZaQOC55QmwTtdnC6dw5AwQt+DiCNla5fC6CNunz0yMjj6aisxJVlMKyxOFheUJrzH4JY2RajrTvRHxHrrQu1zLctVEpI+cH+lUvdJR5151rL6utquPkBlHMAyIqvMZOl0jVdB6TSGegRHaIdXYQq7BTK1g1Mt5Eb2R8X3fRnFte1e0atxyNna0E9bcyrwlMz9FL6QWwewmpmHsPWq/K6Z+1/oKLPXBsjYsL+9zV3nsFNdmogqYJrUQcUIWOmEgNAgcV6MOphuOP/O7fVu2D3dPP1hTLHfl63zI2zQ30Vsri9pJz/I6URZXWSygLFxZPV5az7yPBji8XryMt4Iiw7BWJo8UPzqr4LXfPu/Vzy3v7I4ptv3HL0H/HsN9RYYN9LxEn9QwTxz+bnoGb7efOZnn70die/wU=
--------------------------------------------------------------------------------
/docs/distributed-system/images/zookeeper/zookeeper-watcher.drawio:
--------------------------------------------------------------------------------
1 | 7Vjbbts4EP0aPiawRF2oR8m1tgg2wALZxW6fFqzESGxp0aXo2O7XdyhR0S321kjjGou+2JwzQ4qcOTwaG+Hlev+bopvyXuZMIHeR7xF+h1zXiTCGL4McWiQkUQsUiuc2qAce+FdmwYVFtzxn9ShQSyk034zBTFYVy/QIo0rJ3TjsUYrxUze0YDPgIaNijv7Nc122KHHDHn/PeFF2T3YCe76PNPtcKLmt7POQi9MgTVPSute0W8setC5pLncDCK8QXiopdTta75dMmNx2aWvnpUe8z/tWrNLfM4F5H/786wvZ4vv9v3dc8I85ubuxxav1ocsHyyE91pRKl7KQFRWrHk2aMzOz6gKsPuZ3KTcAOgB+YlofbK3pVkuASr0W1gsbVod/zPxbvzM/2OUa491+ZB2s9SgrbRd1ImundM2FCbhjOlGUVzUc515WsouXW5WZGaXWwCjXxzF8QJLMhwmobwspC8Hohte3mVw3jqxuQtPHdnUYDtf33cQ+oc2eSdnRolio7vZxrBId96kqmD4R5z5TB64kk2sGGYJ5igmq+dN4H9TejeI5zk6NlaKHQcBGcsjEYOU/DAAB3TUnlsT2krtkwrVJvB/5p+Jh0O6gswZH6aGGv2dw2R76iYot665kILQlwojlwZet7Bw3dUMpoMUCKrdvqtr5YVSY70xwU1C7HGqZ0zlnV6i/IIbtu5Jr9rChTfV3IKLjyzAkdWBsLsRSCqmatXBOGXnMAK+1kp9Z56lkxa7oBjwxpdn+9B2Yc7absBiTC/vW3vV67HRYOdDicHGc5gOqnc+k8JpU0TlDFYMr4sQPUUX3O1XxCMPeVhWnKucvTquiE56MfxtVdF+tik50RBVrpuDi/wxVXHqe7/n/a1X03WtTRW/GJAetMIJXO4FBgBKMYoJWPiIBIkuzU6qz0hBkwgRIih6X++UyDmpuISp4UYGZQRJhYZyYFHNo5mPrWPM8b+T4JX6NJfpadfNVrHGjSaP2EmuCF1iD34o1/ow17oA1HkpiRJJmkKAkaOiToghcIYo8FKWNK2pifASnIyu0isz0KG5iUhT7xhWvUOwaGhKCktC44gTF6S/yXZB8wZh8vjMn3zPRLkI+8jMauWltB42de3Zndw2kuOjv2x/Syc1bL0xG1PSmlGv3ZWf1rDv7hzKevLXx6ZYwfFW45/1Hwzk9tXeBhjOaCT4etQkkQjHoM0GxY9oEI92pUXgYwLsANN+oOrwUvEbwExStTHAC07GZHgVNcNNudP33L3m/hLzfOBN9x+Hb6TuY/V+jLTX7/5/x6hs=
--------------------------------------------------------------------------------
/docs/database/redis/images/hash-shopping-cart.drawio:
--------------------------------------------------------------------------------
1 | 7VnZcts2FP0azLQP9nAFyUctdJI2STPjztTJG0RCJGOIUEjIkvL1AUGAGxgvkWQ7rvUi4gAXyzm4FxuwZ6vdmwKt0w80xgRYRrwD9hxYlmkakP9VyL5GgsCrgaTIYlmoBS6z71iChkQ3WYzLXkFGKWHZug9GNM9xxHoYKgq67RdbUtJvdY0SrAGXESI6+l8Ws1SNCwZtxlucJalqGrpOnbNCqrQcSpmimG47kB0Ce1ZQyuqv1W6GScWeIqa2u/hJbtOzAufsPgbX3+fs35Ll766uvvn/fFha5fzLmenKzrG9GjKOOQMySQuW0oTmiIQtOi3oJo9xVa3BU22Z95SuOWhy8CtmbC/lRBtGOZSyFZG5vMfF/krai8TnKnHuquR8182c72VqSXMmKzV9nq77XnX4p5xIqKSbIsK3EGHLyYWKBLNbyjmNcnzOY7rCvH/crsAEseym3w8kJ1/SlGvl4R9SoQeoJTt5g8hGtvQ33v8BQg8EDpj4IITA98GUu5jxbv6npmyrWyXCNs0YvlwjQcuWu29fo2VGyIwSWghbO0bYX0YcL1lBr3EnB0Y+XiwH6sBGnRtcMLy7XR+dT2lgudJ5ZPhwbJnedpxRYWnHD5Xd0SVwNAkOpPn4pDme1yPNHiHNUo7fJe10rLkaa29RmWrM8TGzPj392ZbTHA+mpoQQyZKcJyPOEeb4tGIw43F8IjNWWRyL4DWmRz+gjUeZgyRxoduXxNElcUamsXUqQfzfOezHfO40/nXENQDecw3wnnINgCMBCBImaeppCr9tqMo4KwWBE17AdNa7NpN/JaJQhklsqrp41+rq6syjLiXLJYbR6FISe8HCGCp+rKgYOOcDJwx0J/RHnNA+lRN6J5JSVPiCpXSfn5TBq1f+olf2hXTcJxZSHTxfnfLBTvnclDRP6ZMfX66SQ590R84Pj6ukdUqffMFKDn3y6ZXUbzA0mnEeT6qbO9Ac7nr7/Q7HFf4JMX7gywViGXbDsLqtsw64NtJ57fDm3nLrcO+TgGzhE83ENFay2cP9jTs8CNZnGWnXvfS7uypjUFV93NGqEvo2Qz9A8nvcmLxKDm3nOIJrFT223CPn09AFPBD5UHzYwDd5Dc//6sc9Ugw2rOFhBepRGI5dx50sCo8cPDWNqstkjkwNEAbA94B/8T/SLIB3Kub5j6mYf6IdkKpl0QBcf98FkxkIHTCdgcATyEX1qhBeCGTyF7pBb6qHuca6OKAHoQemcxCY1cdkCoKgaecrb0c8AJ5HeWeTthh2/q6N2/OYpwQtMJmi6DoR+LDxzix2hC3j6wnNpXF5jVmUqoR6SVTTv7OdDMTvOG5gef3XF9vX3cAc2z+aD/cDnmyfQuvFqH1RtsMf
--------------------------------------------------------------------------------
/docs/javaguide/intro.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 项目介绍
3 | category: 走近项目
4 | icon: about
5 | ---
6 |
7 | 我是 19 年大学毕业的,在大三准备面试的时候,我开源了 JavaGuide 。我把自己准备面试过程中的一些总结都毫不保留地通过 JavaGuide 分享了出来。
8 |
9 | 开源 JavaGuide 初始想法源于自己的个人那一段比较迷茫的学习经历,主要目的是为了通过这个开源平台来帮助一些在学习 Java 或者面试过程中遇到问题的小伙伴。
10 |
11 | - **对于 Java 初学者来说:** 本文档倾向于给你提供一个比较详细的学习路径,目录清晰,让你对于 Java 整体的知识体系有一个清晰认识。你可以跟着视频或者书籍学习完某个知识点之后,然后来这里找对应的总结,帮助你更好地掌握对应的知识点。
12 | - **对于非 Java 初学者来说:** 本文档更适合回顾知识,准备面试,让你搞清面试应该把重心放在哪些问题上。
13 |
14 | **由于本网站的内容完全开源,由大家共同维护完善,因此内容质量比较高。** 如果你也想要参与 JavaGuide 的维护建设工作,请查阅[贡献指南](./contribution-guideline.md)。
15 |
16 | 相比于其他通过 JavaGuide 学到东西或者说助力获得 offer 的朋友来说 , JavaGuide 对我的意义更加重大。不夸张的说,有时候真的感觉像是自己的孩子一点一点长大一样,我一直用心呵护着它。虽然,我花了很长时间来维护它,但是,我觉得非常值得!非常有意义!
17 |
18 | 不过,希望大家对面试不要抱有侥幸的心理,打铁还需自身硬! **我希望这个文档是为你学习 Java 指明方向,而不仅仅是用来应付面试用的。**
19 |
20 | 另外,JavaGuide 不可能把面试中的所有内容都给涵盖住,尤其是阿里、美团这种挖的比较深入的面试。你可以根据你的目标公司进行针对性的深入学习,多看一些目标公司的面经进行查漏补缺,没事就自测一下,多多思考总结。
21 |
22 | 加油!奥利给!
23 |
24 | ## 官方知识星球
25 |
26 | 对于准备面试的同学来说,强烈推荐我创建的一个纯粹的[Java 面试知识星球](../about-the-author/zhishixingqiu-two-years.md),干货非常多,学习氛围也很不错!
27 |
28 | 下面是星球提供的部分服务(点击下方图片即可获取知识星球的详细介绍):
29 |
30 | [](../about-the-author/zhishixingqiu-two-years.md)
31 |
32 | ## 项目说明
33 |
34 | - [在线阅读网站](https://javaguide.cn)基于 Vuepress 搭建,使用的是主题是 [vuepress-theme-hope](https://github.com/vuepress-theme-hope/vuepress-theme-hope)(很 Nice 的一个主题)。
35 | - 项目的 Markdown 格式参考:[GitHub Markdown 格式](https://guides.github.com/features/mastering-markdown/),表情素材来自:[EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)。
36 | - Logo 下的小图标是使用[Shields.IO](https://shields.io/) 生成的。
37 |
38 | ## 贡献者
39 |
40 | [你可以点此链接查看 JavaGuide 的所有贡献者。](https://github.com/Snailclimb/JavaGuide/graphs/contributors) 感谢你们让 JavaGuide 变得更好!如果你们来到武汉一定要找我,我请你们吃饭玩耍。
41 |
--------------------------------------------------------------------------------
/docs/about-the-author/dog-that-copies-other-people-essay.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 抄袭狗,你冬天睡觉脚必冷!!!
3 | category: 走近作者
4 | tag:
5 | - 杂谈
6 | ---
7 |
8 | 抄袭狗真的太烦了。。。
9 |
10 | 听朋友说我的文章在知乎又被盗了,原封不动地被别人用来引流。
11 |
12 | 
13 |
14 | 而且!!!这还不是最气的。
15 |
16 | 这人还在文末注明的原出处还不是我的。。。
17 |
18 | 
19 |
20 | 也就是说 CSDN 有另外一位抄袭狗盗了我的这篇文章并声明了原创,知乎抄袭狗又原封不动地搬运了这位 CSDN 抄袭狗的文章。
21 |
22 | 真可谓离谱他妈给离谱开门,离谱到家了。
23 |
24 | 
25 |
26 | 我打开知乎抄袭狗注明的原出处链接,好家伙,一模一样的内容,还表明了原创。
27 |
28 | 
29 |
30 | 看了一下 CSDN 这位抄袭狗的文章,好家伙,把我高赞回答搬运了一个遍。。。真是很勤奋了。。。
31 |
32 | CSDN 我就不想多说了,就一大型文章垃圾场,都是各种不规范转载,各种收费下载的垃圾资源。这号称国内流量最大的技术网站贼恶心,吃香太难看,能不用就不要用吧!
33 |
34 | 像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。
35 |
36 | 
37 |
38 | 我的文章基本被盗完了,关键是我自己发没有什么流量,反而是盗我文章的那些人比我这个原作者流量还大。
39 |
40 | 这是什么世道,是人性的扭曲还是道德的沦丧?
41 |
42 | 不过,也没啥,CSDN 这垃圾网站不去发文也无妨。
43 |
44 | 看看 CSDN 热榜上的文章都是一些什么垃圾,不是各种广告就是一些毫无质量的拼凑文。
45 |
46 | 
47 |
48 | 当然了,也有极少部分的高质量文章,比如涛哥、二哥、冰河、微观技术等博主的文章。
49 |
50 | 还有很多视频平台(比如抖音、哔哩哔哩)上面有很多博主直接把别人的原创拿来做个视频,用来引流或者吸粉。
51 |
52 | 今天提到的这篇被盗的文章曾经就被一个培训机构拿去做成了视频用来引流。
53 |
54 | 
55 |
56 | 作为个体,咱也没啥办法,只能遇到一个举报一个。。。
57 |
--------------------------------------------------------------------------------
/docs/distributed-system/images/distributed-id/distributed-id-requirements.drawio:
--------------------------------------------------------------------------------
1 | 1Zhbb6M4FMc/jaXZh1RcAphHSJPujDSzD9Wqs48GTsBTg1Mgl86n32PjJJCQVUebaNpESsw5vsA5P/9tQ9xZuXuo2ar4KjMQxLGyHXHviePYtuXjn7K8dhbqOZ0hr3lmKh0Nj/wnGKNlrGueQTOo2EopWr4aGlNZVZC2Axura7kdVltKMRx1xXI4MzymTJxbn3jWFuYpnOBo/xN4XuxHtv2w85RsX9k8SVOwTG57JndO3FktZduVyt0MhArePi5du8UF7+HGaqjatzRIoVj9Vb08ffv5MmXBy+Mz24gJ7XrZMLE2D2xutn3dR6CW6yoD1YlN3Hhb8BYeVyxV3i3mHG1FWwrjPjykhRdLLsRMClnrjtylp76qUlvLZ+h5fP1RLWTV9uzdR7V4hjYtTLe5YE1jyudBMHHZQN3CrmcyQXkAWUJbv2IV4/VdkyBDqBOY6+0x39N9Eotert2pMTLDWH7o+5gGLJhM/EJW7JGs+AKHjZNBbvyXtaJHh23S6LkTYQXbX+10bPZ+LOX6f+4R6pGIqkJsE2qpQjgl0YLMpySmymJGwhtPDu0uM2G9gYl+8gaA9DOpnsFMf3uPwoKVXKi0zOS65lDjTXyD7QhZy6WTpmNkZX7ie/51QAmsISiuew6KPQaKfytOnJtxEpIoJiFy4iskooDMkQ2XxPcfEw/wL+ARhIl1JR2hwRCP6W/Hw72hjERzQsOjnnxAKsDOPAjGqAj9wGVXEg16Ihqe4/1mKqa3Fw2kYqHXlEAvLh8SjyVNYVw0EupNvWttPsL3JhrezfDwSeiTONQ7jTmJF9pCSeh+aE4yBnQ5yomfUkiWV5IR+t72HuFFTgpXncdMeI8glNkEqmySCJk+q/NRNimAZbzKu4ulTNdNH5sR1hK5U6ipNhq2RNYZ1BM0dy1OWaSGRTyM1TmvjBVK/LXQhb93Hl7pKoJXMNlHTte7c3q9Lg0OyiNYK4mDYVObZVYq5MwNFiA20PKUoa8CDMyJv2vVq6UuG1Y1kwZq3rFirWTDWy7N7daAw/ENdL60w0s78uSTZ3ddHP//GJ98JjXNilWXkrMSjFddLmCH9bIbJWP0UIK7S18fSvQ2UxVmag1xrM/3Ksy4tIQzfVyhJMItqa20I45JZCtLjGXdCKUkirS+RCSMh5XxtIP5XPQkpgvGMEBoVvhekB6crO2JvgwmfSUrOFEIY2KC55jQ+xQlALXEjdXURwJEZBwlzzI1zKigDSXvoowNxE6wBETM0udctz69xZ7i0SstZf7JOdo5l6jDkbkvUc4VJOqfL/ETldXOY/M8/Pr97+r7D/ofx2j1+Fc5Sc80bTMSBmbXE2NhoS3RF7ZhD+r11WEBrf/nmIE6gIW2KqidVngY6gcOpd+U3aVVD+XuMd81zG/HdOT9UKy/us+WdZJ5PhEG0+UC1CPoX+bcOdnRT0eWYjrCuf3rnOPl8QWh9vVes7rzfwE=
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-missing-modifications.drawio:
--------------------------------------------------------------------------------
1 | 7VrbcqM4EP0aPcZl7vjR+DI7U3PZ3dTW7j4qWIASgRiQYztfvxJIXAzOkKnx4JqlUuVILalB3UenW10AYxUf32UwjT7RHSJAn++OwFgDXbfnC/4rBKdS4BhaKQgzvCtFDcE9fkFSOJfSPd6hvDWRUUoYTttCnyYJ8llLBrOMHtrTAkraT01hiDqCex+SrvRvvGNRKXV1p5b/hnAYqSdrttzwA/SfwozuE/k8oBtbe7vduuVwDJUuudE8gjt6aIiMDTBWGaWsbMXHFSLCtMps5brthdHqvTOUsCEL3n82DXfum5j99eL88fjlz9i17+RecnZS9kA7bh7ZpRmLaEgTSDa11Cv2jITWOe/Vcz5SmnKhxoWPiLGT9DXcM8pFEYuJHOUvnJ3+keuLzr+iM7NUd31sDq5PshfQhEmlmiX7WxhjIiZ8QMzLIE5yvp1PNKFqPt1nvlgRMcYRpVvGkv9wI4kfMSGfhZSGBMEU5zOfxsWAnxdTt0GpnTeb+i3dk08orSdMdtEpUpSr97jkCYV9mIWIvTLPrKDDTySiMeIW4usyRCDDz+33gPJshNW8Gh+8ISHyBrhIvc+Q7JFC/Tl+COFHV+DkEGGG7lNYbPvAyaONApin5XkO8FGgyQswIStKaFYoMoIA2b7P5TnL6BNSIwlN0A1j4RllDB1fR0PXe3JBxRWSSzVb9g81MylR1CAlJfvh/jYmf1/T37Z7Y/5WQXmKB6PHA3NgPLBGjQeLDkEsVZA4w9BH+MATxzYjEBwmvO1z4yB+1j1xmDBPzZZyIMa7XQkxlOMX+FDoE55PKeaeEsotD1jrHiwQ8TivStEaPCOTtNuBSw+FyGRX7rjOIZtAeuUAXyScu/lMRJk26ZS9wYCRyn8XLqg1W3061XIaBDkH8Tnaqvf7fgCaXfzxf3qXxmqS0r4dqjqRKdD/Z5HJsM8ik9ONTE5PZDKvFpnsKTLdSGSyBkYmY8zIZPUSg9a9707E8CZisM6vKGMTg9O9omxM4C2B64GNBdwlWGrdjIQbgLVd2+/Chr+laHjS0oelNiP9kgjRjHOEWIMuNca1EOIOQAifYBOBiIeMt0JWmWLCzBiY0d2RMdNDGVO6MVJhVB+Yb2jjlkb1Ls1MtbLr1Ub1nsTj59bKjIkiboUihhbLtFGrZQrBU7XsVqplF66odbVMU4Wt7y2PXb8Epk01sOtEHFNZtkpKx66BuVPEuZWIM7QIpjmjJqVTGexKZTD3/MI6Njf01MGm68ePc7hzXqEY+/qhttAqa1nAtcByVdS3VmDhFJIt8HhjW0iWH+AzfCc+uWsWvBogsb/uxQdphVPu8sKL3BNzzUiPhSHVeFUl2zjAW4OFJhpLDywW1aMe+aOKr/tmftLB4m0U0y7kvT1ANmS/cQq84q/QyTiX00QqzZ8Q8yNFlb8C+PXFGfjNLvg1twf92tvRz7v1N5Fljlx/d2ps/gM=
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-phantom-read.drawio:
--------------------------------------------------------------------------------
1 | 7Vptb+I4EP41lvZOKsIJeftIgHRV7UordU/78uXkBudl68TZxBS4X3+2YxNCQkvvSqG7CAnsx/bYmXk8M3YA5iRbXZeoSD7SOSbAGM5XwJwCw4BwaPMfgaxrxDGtGojLdK46NcBt+g9W4FChi3SOq1ZHRilhadEGQ5rnOGQtDJUlXba7RZS0Zy1QjDvAbYhIF/2SzllSo67hNPh7nMaJnhnaXt1yh8L7uKSLXM0HDDOwgyBw6+YMaVnqQasEzelyCzJnwJyUlLK6lK0mmAjdarXV44I9rZt1lzhnhwy4uV0Ff/3tf86+uHH86frm+3v680pJeUBkofQBZjZwA+DxggVcC4wtgXgW8IeyaQrGM/VAbK2ViOdcp6pKS5bQmOaIzBrUl4rCYilDXmv6fKC04CDk4A/M2FoRBC0Y5VDCMqJa+VOW669qvKx8E5WBpavT1XbjdK1qBN1h4m9sNaGElnLR2lqmH9GcqXnhSNUDlKVEyLjBzC9Rmlf8iT/SnOr+dFGGYkTCGGeqYZlj/sWVL75Eh2oQUxoTjIq0GoQ0kw1hJbsGUS2dF7flW4avZqgVLLS619gKqvQ69lnYUHsKlTFmj/QzN5TkWx3TDHMl8nFqn18NB+bIVrJKTBBLH9prQ2ofxpuxG3GfaMpX3XShUVTxtWyRlRe2Zm0gSeFn0Nno0rlDVUK4axGUXCYpw7cFkupbcu/WJhyqitrfROlKENePUkK26BNF2A5DjlespPdYt+Q0xzucss6IUw+4ZHj1OKv2sgBaypcpXw9tVV82nlNDyZbT1FgfR1oUeK69zYu9j2lvxzwze496wtUI+GPg+jJcjcEYwg4FuAJY29b9Jtyyt4IQSeOcV0OuMMxxX6gz5cnDWDVk6XxO9pGrHfN+SYbYOwRxrIMIYh6LINYBBOn6iAtBXosghntigthvKXc9V0a8SGLqHpiYwj0EOzgL/V98cXoyDJsIb1EVKG8xyf65EGc5aYWrSpqNq34IR8VKak6381IsfkNOK/buzz+0QL6+Wmbd3EvUD+I0s5O3HOyCSsxXhe6kPEGvQuTlUmGWD6zp2z4s9XgpdWWgnnhzQG6xdb+TeOwsBA3Xbvu1cz8ZuZdM+TVPRoZz4kzZe2tx7hwo8CJxTR9Ang5s1ikDm75/vUS23ymyeU9GNgeOWp5MXxH/19CmF270Sj1+4IPdK+58kfHC5l6+4WHjAOHTUbAT9CLjNwt65m7Qc7tBz+kJeqNjBT1NskuW8zr3gSfPcmDPBbB6bTWRFz8T4DkSCYDPC4FExjfoAV2L9446QN2VB8U7c0+8AzMH+FPgQVEY+8DzNlP94FPJV5yDMO9w8TzunfaExh4im6q+tQt8+ZEyGY8PNFdCq3vMwkS7yl+B/ObuVdaoS37o9rAfHo39o1Mk+edizJdJ1q1Dk3XjpMl6915bJTHdtx2XJOZZ29rq3FAfLYnh1ebvHnV+2/ynxpz9Cw==
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-unrepeatable-read.drawio:
--------------------------------------------------------------------------------
1 | 7Vptc5s4EP41+hiPQYDxR/BLern27nq5m14/3cggQImMKMiOnV9fCYQBQxy3jR3SejyDpZVYIe2jfXYFAE6Wm+sUJdEH5mMK9KG/AXAKdH1kQHGVgq0SQLMQhCnxC5FWCW7JI1bCoZKuiI+zRkfOGOUkaQo9FsfY4w0ZSlP20OwWMNocNUEhbgluPUTb0k/E51EhtfVRJX+HSRiVI2vWuGhZIO8+TNkqVuMBHc6t+XxuF81LVOpSE80i5LOHmgjOAJykjPGitNxMMJVLWy5bcd/8idbdc6c45sfc8NsfBrSHnkH4v4+jj3d//r20rSs1l4xvy/XAvlgeVWUpj1jIYkRnldTN54yl1qGoVX3eM5YIoSaEd5jzrbI1WnEmRBFfUtUqHjjd/qfuzyufZWVgltXppt443apawGKulGqmqs/RklDZ4QZzN0UkzsR0PrCYlf3ZKvXkHRHnAlG6CR1xEYskL7JDNggZCylGCckGHlvmDV6Wd50HhXZRrOs3dVeN0LaBMktWDvvUwpdQR2mI+YF+RtFPWqU2gLLwNWZLLFZIdEgxRZysm6BGam+Eu34VPkRBQeQb4KL0rhFd4RL1+/ihVGxdiZOHiHB8m6B8HR6E82iiAGVJsZ8DspFocgNC6YRRluaKYBBgy/OEPOMpu8dlS8xi/LawsMYpx5uD1lOtO1+hfKlmqfpD5ZlKUVRzSqXsxe0NL/Y+pb1trWf2Lp/nwgfn5gPjSD4w+8UH45aDcEqS2MPQe7QQgWPTI1ASxqLsidXCYq+7cucQEZo5qmFJfL+AGM7II1rk+qTlE0aEpaRy0wXmtAMLVA7n7kK0mp9RQVo/4XJwV7Ycyy4qVkvTiCy7HM7VcCBZpul0itrRgFHK/5ImqDSbXTrL21kQZALV+2jbPd/3A9Bo40/86W03Vjkp7XmqajFToP9izAStPWYatZlp1MFMxgsw05c7///P0EE4SG+tNWf/DBm/0joij/4y05vwPnXgwh8iL/NI8oK9Ii+z03do7ZT44ju+yXeYr+g7Og09amcxMwO4DrBdMDOB7QBHawctYra8adpuE9bsrUTHxzVdWGo6rZ8SIRrcR4h5VN4DT4UQ+wiEtAnogpCzIUS3z4eQKU4mZHuDPPeGuOnvn9yPi/snkpqehh/7kPh+Zi9R/yy1az1LTPX2jr6cXJ3upFLv4PhTnVx15wfGW9qgv1h+oHUkCN1W7FeGoHWnCJfjhZc+XtDtV04RtI4c4cIXp3vTcU6+6DT4bgr1kF9E+iZwJnnsPwHjUS6ZA1cU5rnEuUFrdC2/WAC6RWXwv0gbILG+rOT7/NwoV1luRWGJoQaTTb6QZbsohfn/bATcKRhrsuC4YDzeDXUnhso/jhh4cU9TjydorAPIUNVru8DNf7lOLnw5i5XS7B5zLypd5c8Afn28B36jDX7N7kC/drJoybxES32Ilg4GQc/nXKPXipYOPvflQPWF/Ydlni1aEtXqi7TiJV311R+cfQU=
--------------------------------------------------------------------------------
/docs/database/mysql/images/concurrency-consistency-issues-dirty-reading.drawio:
--------------------------------------------------------------------------------
1 | 7Vpbk6I4FP41eWxLQG6P4KV3e2d2ZrZramYfIwZINxIWYqv96zeBIGKi7Uwp2jOWVZqchJPL+c53TiLAGM5X9znM4o9khhKg92crYIyArpuuzr65YF0JbMOsBFGOZ5VIawSP+BUJYV9IF3iGilZHSkhCcdYWBiRNUUBbMpjnZNnuFpKkPWoGIyQJHgOYyNJveEbjSurodiP/A+EorkfWLLdqmcLgOcrJIhXjAd2YWJPJxKma57DWJRZaxHBGllsiYwyMYU4IrUrz1RAlfGvrbauem+xp3cw7Ryk95oE//x4YTj8YYPr11f7y9OmfuWPdibUUdF3vB5qx7RFVktOYRCSFybiR+uWaEdfaZ7WmzwdCMibUmPAJUboWtoYLSpgopvNEtLIJ5+vv4vmy8i+v9My6OlptN47WohaSlAqlminqEzjHCe/wgKifQ5wWbDkfSUrq/mSRB/yJmFKGKN00PPbFNol/8Q5FLyIkShDMcNELyLxsCIqy6ySstLPitn5T98UIsg2EWYp62H0bX0Md5hGiB/oNqn7cKlsDCAvfIzJHbIdYhxwlkOKXNqih8I1o06/BBysIiPwAXITeF5gsUI36XfwkCXNdjpNljCl6zGC5D0tGHm0UwCKr/DnEK44mP8RJMiQJyUtFRhgiKwiYvKA5eUZ1S0pS9L6w8IJyilYHrSdaN1whuFSzRH3ZMFMtirdIqZad3N7Gzd7ntLejXZm96/nc4kHX8WBwZDwwryseuBJBeHWQ2MHQBzhliWObERIcpawcsN1CzNd97jmYpWaeaJjj2ayCGCrwK5yW+rjlM4KZpbhy0wfmSIGFhA/nb1K0LZ4RSdp1wuWgV0rEssmKxda0MksV4dz1ezzKtEmnqh0NGKH8MzdBo9lU6awfJ2FYMFTvom0zv58H4EDGH/vRZRprSEp7O1RJkSnUf7PIZFg7kcmWI5OtiEyDE0SmEcqGeP0AA/8B+/lf3/wv0+fa0N0Gpl3TKrn35/jelPleuW69I3pXDm7K6d/YBK4P3DEYW8BnBe8SZH8kucumO5pB20bdj8iDTGu3SdE4CdFaKp3nJ1oZCpxoNfn+4Ea0P0S05u6Rr0OiVRraVvj8APgecHzu/I4HPE3O8Nhqadu0ahNu2VuIjucFFZbaFP9LIkQzdhFiSghRHRKNcyHEOQIh8j3BDSGdIUR3ukOIMjSqT4Dv5BbhhEle7QZvnuo1s6M07+A0b9d83Vzr6ooY3+01n/OeHfSKMfE2IyjOfeqOtpKHLkYRt/z/TPm/uxu7L5z/a4oDwC0YnO8/n4sHg80S2rc8LIf0hmViPwSuXUomwGeFSSnxHuALvOfvbgDdSnhmP81bILH+W/A3G0qj3BWlFZkl+pqZrcqNrNtZKSp/xzbwR8DVeMHzgetuhnpiQ5WvifSC9ErPFXtupA4AecsL/PJT6qSMy0kqlBbPiAYxaO4i3z349V22G8jg1xwF+rVzHVWMS2RCpzly7L8vPiK/MDrKJg5N8vavjexeihtqCQZ73cuyO7tMZNXm1bXqkrl5PdAY/w8=
--------------------------------------------------------------------------------
/docs/about-the-author/javaguide-100k-star.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: JavaGuide 开源项目 100K Star 了!
3 | category: 走近作者
4 | tag:
5 | - 个人经历
6 | ---
7 |
8 | 2021-03-21,晚上 12 点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 GitHub 主页](https://github.com/Snailclimb)。
9 |
10 | 好家伙!几天没注意,[JavaGuide](https://github.com/Snailclimb/JavaGuide) 这个项目直接上了 100K star。
11 |
12 | 
13 |
14 | 其实,这个真没啥好嘚瑟的。因为,教程类的含金量其实是比较低的,Star 数量比较多主要也是因为受众面比较广,大家觉得不错,点个 star 就相当于收藏了。很多特别优秀的框架,star 数量可能只有几 K。所以,单纯看 star 数量没啥意思,就当看个笑话吧!
15 |
16 | 
17 |
18 | 维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。
19 |
20 | 对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎!
21 |
22 | 开源非常重要的一点就是协作。如果你开源了一个项目之后,就不再维护,别人给你提交 issue/pr,你都不处理,那开源也没啥意义了!
23 |
24 | 我的公号的小伙伴都是通过这个项目关注我的,趁着午休,简单复盘一下,也算是对关注这个项目的小伙伴负责。
25 |
26 | 我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
27 |
28 | 到今天(2021-03-23)为止,这个仓库已经累计有 **2933** 次 commit,累计有 **207** 位朋友参与到了项目中来。
29 |
30 | 
31 |
32 | 累计有 **511** 个 **issue** 和 **575** 个 **PR**。所有的 PR 都已经被处理,仅有 15 个左右的 issue 我还未抽出时间处理。
33 |
34 | 
35 |
36 | 其实,相比于 star 数量,你看看仓库的 issue 和 PR 更能说明你的项目是否有价值。
37 |
38 | 那些到处骗 star 甚至是 刷 star 的行为,我就不多说了,有点丢人。人家觉得你的项目还不错,能提供价值,自然就给你点 star 了。
39 |
40 | **未来几年,我还是会持续完善 JavaGuide。**
41 |
42 | **希望自己以后能开源一些有价值的轮子吧!继续加油!**
43 |
--------------------------------------------------------------------------------
/docs/javaguide/faq.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 常见问题
3 | category: 走近项目
4 | icon: help
5 | ---
6 |
7 | ## JavaGuide 是否支持 RSS?
8 |
9 | 必须支持!推荐 RSS 订阅本网站获取最新更新。
10 |
11 | ## JavaGuide 有没有 PDF 版本?
12 |
13 | 由于 JavaGuide 内容在持续完善,所以并没有一个完全与之同步的 PDF 版本提供。如果你想要 PDF 版本的话,可以考虑 **《JavaGuide 面试突击版》** ,这是对 JavaGuide 内容的浓缩总结。
14 |
15 | 《JavaGuide 面试突击版》在我的公众号后台回复“**PDF**”即可获取,免费的。除了 《JavaGuide 面试突击版》之外,还会免费送你多本优质面试 PDF 手册。
16 |
17 | 
18 |
19 | ## 如何看待 JavaGuide 的 star 数量很多?
20 |
21 | [JavaGuide](https://github.com/Snailclimb) 目前已经是 Java 领域 star 数量最多的几个项目之一,登顶过很多次 GitHub Trending。
22 |
23 | 不过,这个真心没啥好嘚瑟的。因为,教程类的含金量其实是比较低的,star 数量比较多主要也是因为受众面比较广,大家觉得不错,点个 star 就相当于收藏了。很多特别优秀的框架,star 数量可能只有几 K。所以,单纯看 star 数量没啥意思,就当看个笑话吧!
24 |
25 | 维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。
26 |
27 | 对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎!
28 |
29 | 开源非常重要的一点就是协作。如果你开源了一个项目之后,就不再维护,别人给你提交 issue/pr,你都不处理,那开源也没啥意义了!
30 |
31 | ## JavaGuide 会不会推出纸质书籍?
32 |
33 | 可以给出一个比较明确的答案:**暂时没有考虑出书** 。
34 |
35 | JavaGuide 这个项目诞生一年左右就有出版社的老师联系我了,由于自知个人能力尚需沉淀,我都婉拒了。这几年的话,由于项目还是有一点知名度的,找我出书的出版社老师更多了,也都被我一一婉拒了。
36 |
37 | **出书既能博名又能赚点钱,我为啥不考虑出书呢?**
38 |
39 | - JavaGuide 的很多内容我还不是很满意,也一直在维护中,细心的小伙伴看我的[提交记录](https://github.com/Snailclimb/JavaGuide/commits/main)就明白了。
40 | - 开源版本更容易维护和修改,也能让更多人更方便地参与到项目的建设中,这也是我最初做这个项目的初衷。
41 | - 我觉得出书是一件神圣的事情,自认能力还不够。
42 | - 个人精力有限,不光有本职工作,还弄了一个[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)赚点外快,还要维护完善 JavaGuide。
43 | - ……
44 |
45 | 这几年一直在默默完善,真心希望 JavaGuide 越来越好,帮助到更多朋友!也欢迎大家参与进来!
46 |
47 | ## JavaGuide 上为什么有一些付费文章?
48 |
49 | 是这样的,JavaGuide 上确实有非常非常少的付费文章,差不多 10 篇不到吧,这对于整个网站的内容来说算是微不足道了。
50 |
51 | 这些付费文章属于[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)专属,是我用来引流知识星球的,对整体阅读其实并没有什么影响的。
52 |
53 | 我也知道大家不喜欢营销,所以我会让自己控制好一个度。我一不割韭菜,二不贩卖焦虑,仅仅赚一份小钱提升家人生活品质。
54 |
55 | **用心做内容,真心希望能帮助到其他人。**
56 |
--------------------------------------------------------------------------------
/docs/distributed-system/images/distributed-id/database-number-segment-mode.drawio:
--------------------------------------------------------------------------------
1 | 7VpZc+MoEP41qtp5sEuHJduPlo9sbe1uTa03O48pImGJBIEG4Wt+/YJAsi6PlcOTqUnKD4EGuqG/vkAxnHlyuGEgjf+iIcSGbYYHw1kYtm1Zpif+SMpRUSaurQgRQ6GedCKs0TeoiaamblEIs9pETinmKK0TA0oIDHiNBhij+/q0DcV1qSmIYIuwDgBuU7+gkMf6FPb4RP8doiguJFveVI0koJisT5LFIKT7CslZGs6cUcpVKznMIZbKK/Si1q3OjJYbY5DwPgu2t8d/zb//WU13iN1aq9uZffw20Fx2AG/1gfVm+bHQACThTCpS9AglgujHPMGiZ4lm9gh5IM9pyk5xQtlpb0/LgmFN43qzN5AmkLOjmLA/6dnVuosrKi5oDGLA0a6OE9BwRyW7UsJnisRObLMwTUfz0YbpFP2CRUa3LIB6VVWvDUb25AIjDlgEeYuRaFSOfSLlsD0BQvuFEIYgi2H4y+E5ei08W4yujKfzbl3youb7Qji6ZAtXhtBtIyY0vNZdynhMI0oAXp6oPqNbEuZ+KKE6zfmT0lQj+wA5P+oUCbacvq4fK+V+51SjnsbyYkd23zSejjr8z8Nc6jEFpAar93Urs7cfUEyZ4czk4aP73yy5RAg3q41Pue5FAUL4YAMShI9qQQIJpmpWIvAOdFswB4kA3i9FbBmCTIwQuG8Olsup2KLEsJSU5dYi5VjjoZseqkPqGHKMUJYAXBnba+eWg46pzMbEwvwgG0gRiETtlRwe+ABgFBE1huGGV0aQMG+ieZrFTvIRzgDJNoJTwZPoI+wpC+vyyoX3IHiMcp8ZNLRvu67SR7XxqSIuhAFlwkIpacoLUZZioIFBBKNiYIMp4I3ZXql8L8oR2jLpU3cJONwJA9M2I0xQmY2a1AoMckeCvo8Rh2sF3mIvSukXx/QdZIL3dx31UI/e2t9sT/crQd8ad0T9pl9WXbvmlE/1QO+sB0rjzIv9HPFFFQRnDOSvSjI3IKg76hlnazhX3ZlaQF8MB92eZ5u9LNesGK9Zsd/WNjIO07NWVpKVxn5e47Oa1fOkbX1dJYd9LeObXC6/Ms7oY3kdtBvaikEq5yWHSN6IhyJ07IMYMD4EhFCex507uUZHyoUOkxjcQ/yZZkgFpgVTZ/VTmecgW+6EjjMtg2k+ojuYmq+Q+5+Pl90TL8u9FmBW1x32I2F/JOxfNmHbzaeLN8/YVscd9ee/8Vz7JvPcl4TLT0zTfhfj17oSWT3eJN5zUnSaDvn2SdH9qKHfTQ3dNL/RW9fQVtcN7vwbZoBBlqHgBwf3H/SmaY6GjfesSb/g3YdVMw9c+WnMGn/gWvic2wRj9FxcO1hdD9f/HkY0+eLC2Zr6Myf2vtrOsfMrYC1ZXI7Pnq7zW4F+6RoT15jNjeXI8OfGdJxTVoYvGqucMvsD7MCN/M5bSL1nL5Q5NvyFMbVkY+Yb02kp6kGIyj8pDwPyxAhfjeZ5rTPXGVRfMDYI4wapqGYCKKsVQZAxHQUAz/RAgsIwr4W70ke9Ps5LIb/Me03h4gC6ThbBV/XnZYZ3/PxXL5LMHv7XykEdLtm/KrI6rimTrrLo6XlJdE9f0pVbnP4fwVn+Dw==
--------------------------------------------------------------------------------
/docs/.vuepress/config.ts:
--------------------------------------------------------------------------------
1 | import { viteBundler } from "@vuepress/bundler-vite";
2 | import { defineUserConfig } from "vuepress";
3 | import theme from "./theme.js";
4 |
5 | export default defineUserConfig({
6 | dest: "./dist",
7 |
8 | title: "JavaGuide",
9 | description:
10 | "「Java 学习指北 + Java 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,复习 Java 知识点,首选 JavaGuide! ",
11 | lang: "zh-CN",
12 |
13 | head: [
14 | // meta
15 | ["meta", { name: "robots", content: "all" }],
16 | ["meta", { name: "author", content: "Guide" }],
17 | [
18 | "meta",
19 | {
20 | "http-equiv": "Cache-Control",
21 | content: "no-cache, no-store, must-revalidate",
22 | },
23 | ],
24 | ["meta", { "http-equiv": "Pragma", content: "no-cache" }],
25 | ["meta", { "http-equiv": "Expires", content: "0" }],
26 | [
27 | "meta",
28 | {
29 | name: "keywords",
30 | content:
31 | "Java基础, 多线程, JVM, 虚拟机, 数据库, MySQL, Spring, Redis, MyBatis, 系统设计, 分布式, RPC, 高可用, 高并发",
32 | },
33 | ],
34 | [
35 | "meta",
36 | {
37 | name: "description",
38 | content:
39 | "「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!",
40 | },
41 | ],
42 | ["meta", { name: "apple-mobile-web-app-capable", content: "yes" }],
43 | // 添加百度统计
44 | [
45 | "script",
46 | {},
47 | `var _hmt = _hmt || [];
48 | (function() {
49 | var hm = document.createElement("script");
50 | hm.src = "https://hm.baidu.com/hm.js?5dd2e8c97962d57b7b8fea1737c01743";
51 | var s = document.getElementsByTagName("script")[0];
52 | s.parentNode.insertBefore(hm, s);
53 | })();`,
54 | ],
55 | ],
56 |
57 | bundler: viteBundler(),
58 |
59 | theme,
60 |
61 | pagePatterns: ["**/*.md", "!**/*.snippet.md", "!.vuepress", "!node_modules"],
62 |
63 | shouldPrefetch: false,
64 | shouldPreload: false,
65 | });
66 |
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/pictures/线性数据结构/栈实现浏览器倒退和前进.drawio:
--------------------------------------------------------------------------------
1 | 7Vpbc6M2FP41PCbDHfNobCedTne60+xMm77JIGN1BaJCvu2vrwTiToLt4Mt0sw8bdJCOpO87+o4koxizaP9MQbL+QgKIFV0N9ooxV3Rd01Sb/xGWQ25xVTU3hBQFslJleEE/oDQW1TYogGmjIiMEM5Q0jT6JY+izhg1QSnbNaiuCm70mIIQdw4sPcNf6JwrYOrdOdKey/wJRuC561mw3fxOBorKcSboGAdnVTMZCMWaUEJY/RfsZxAK8Ape83dMbb8uBURizYxq8vk42//y9/DZPbY8eovTLD8d6kF62AG/khOVg2aFAYLdGDL4kwBflHWdZMbw1izAvafwRpEmO+wrtIe/KWyGMZwQTmjU3VquV7vvcnjJKvsPam8Be2pbN38gxQMrg/s3JaSVkPNYgiSCjB15FNtAdibIMM82W5V1FWhlT6xphpRHIQAlL3xWW/EHCeQK0+jC0MA6mIkZ5KSYxbAJ7Lo4w6ET0IIo1lKwekAobhRgwtG267wNO9vCVIN7xMEmFi5RsqA9lq3ooDzhyW34YoCFkHT8ZjeWsz2fW+GS2RYjpuI/WONyak5tya94tt3wMGYRDan6rGDBai1JXR1rdHUdvhAAnBRxq1RJRIX0naCf9/VQRlXscNb6su42vm2lHmwZzrLhpO7pU3JhXiBv7M24GaDCMkeKm4+hCcVP0c9G4cT7jZmj5tncYZ+vNkVuVD+uNe4W4mQzHDSWbOBBHvrnKaR84Jt7kVGg2gStwHDoTtvPGaEdC9/8AqqU1UXVvjWrR2ZEa52OQpshvItlBTM3+8TdCyF6kI0LZmoQkBnhRWT1/Q7cZY8IRB5Ee/hL0PRpuUX7l5Qf1UXWswjLfS4bz0qFe+gop4shAKo3HCqqu5oLzHlTmLZW39FOcEc89IRhtRxfK2O0BW+rAsPR3ql9Gp7XuDV6ySdedBcDXO3sv5GXmryuKNAGMwlisGx5tIiY9oR7IB3gqX0QoCLKF0KdWTT1bkZjJO17dGunmz25lx64cOT0h3Y6Y8dRI7xJCkp+HD1Mz7ouP027rTswObQDPzhb1VKE+DuWJEVOCe8uMYKoDQn70raHVv9UbeyuunpQQ2lulqySEI24w73+T2fmpoEdGrrzL7Lm5W9jKVFUmE2XhKlNN8Wyx4M4QewGe4y5zRWnDDe0M7juXffuNhVzjSzOvqvs9N2YVX5biTRWXU6ouCWMk+qSsuva6HWWnXVZ9MFUfm0Nvdlpq5RrDNIvf2D58w2m2HF34RzXtiNukn5dYrc3GubR2HF2a1r77LBsL3QzQtkGv/e9GfOfiCVl9kLo45TUwXLHqLX8K5d/MS5qAuNeNoPwhzTgXXjQr2fd4WZiKN1fcmbKYKHxDOLGUxZPizRR3+hIDhGcYRUteGURCbuNlmtS65oDkvTdHxM3Z1JpWMZwPjPMCmBUIWGLW01kGBZ+4k1k4CE457/z/Z8TWm2WJz69gC57Fl1dnwcGtOSKFeTC3jpkpy++shONQSIl89kkkRCXf1NY0QzQi3CNiYh25oojBEmIP+N/DzHf7UM4b9wlR3orQANKeFk8gQlj08AwoiEgcFMOQwKiS6t/LoThqzqeP4vAb31Yac6My/CaioGHx8p1Mw/aHVC9jpLvf1l3LBXflvFh9G5crVvWFobH4Dw==
--------------------------------------------------------------------------------
/docs/database/mysql/images/数据库事务示意图.drawio:
--------------------------------------------------------------------------------
1 | 7Zpbc5s4GIZ/jS6TscCAuAQb0sm0s9tmOtvuTUcBGdPIyAtyYu+vX0kIc3TidJOYepLMJNKnE0iP3k8HgDlbba9yvF5+YjGhwJjEW2DOgWHAieGKf9KyKy3uxCwNSZ7GOlNtuEn/JVVJbd2kMSlaGTljlKfrtjFiWUYi3rLhPGcP7WwLRtutrnFCeoabCNO+9a805svSigyntn8gabKsWoa2fuFbHN0lOdtkuj1gmKEdhiEqk1e4qku/aLHEMXtomMwAmLOcMV6GVtsZobJvq24ry4UHUvfPnZOMH1OAJjfh359XhXPNrY9WEH0prr9cyAKymntMN6R6D/W0fFf1kHpHImuBwPQfliknN2scydQHwYSwLfmK6uQFy7geZGiJ+P6tJzJyR3i01JFFSumMUZarVsy5FaD5VGbiObsjVUrGMqKrDfEqpZKya8L9HKdZIZ7zE8tY1Szb5OqplpwLeAzL9MQf0R/yj8xQXCaMJZTgdVpcRmylEqJCZQ0XZe0i2KzfMnzdQr+79Qjck5yTbcOku/+KsBXhuahysq2mRllCzxRHRx8a2CFtWzaQM21txBr1ZF9zPdwioEf8GaNv98aaxGJy6CjL+ZIlLMM0qK1+TYMcxDrPR8bWmoGfhPOdhgBvOGsTIvov333T5VXku4xcWlV0vm0mzncVPAdJKompZq8xblyKqtlDg6Llk+M8IfyRfFaZT47Yo/DlhGKe3rfl7sVRMgd0xKZc93ULMvufDasSLgqFiej5CXTW2zpRhBL1P7CAPwNiXoiAmEBeCIIp8D2AVBLygAerlkA5bvuiPbgpFV6FHCFibWmKMUGL6JA0PaJw46XweNGCVlu19v6sIVvQGJAt57VUC55Eto53bOclRy8uM7ronyxVuqAxc6ZtzGDX6ZV6qEt1CNo/xv+AyjmJL9ym/Fsj3PCEIlY7Qhmp/OA7iK8LYkfvTPM4EL08x7tGtrXMUBxux+4Ab1hWe/n+RP7quep5UD7Bi84K66V3B23HulgsjOgXHGtCcVGck5PdQ9ZVv4aT3e+Ym04Wuq/mZWFvqEflZUc87k9KmXPkEh+Naonv9MTg5vNHENjANQGaq2X5HLizPjdiEvD2MA/v8RvioE2YpkkmopHoYiLsvpxSaYSppxNWaRzTQyv6No1ngdYzJKVz2gDRwHHDgKIYryYofd/xpqcN9QHDd9A8Xxg+bTgLWp4UInSkEFWuZyRKhI5Toj5w70o0AiUyzFMr0eQ4frJ3fsbIjwlPzU//sPNS/fwmvOSMC5Fmshb38ZP18+AHdfRn6OLlTfk54L8sgCzgIRC4AJkqYAPkAs8BAZLH3GimLEieg5dn3274myB35oh1D2fgyV2c20NM+beZBEr6N6SuVFTA87T367ImYBQZoLT4U+BZ76yNgrXuAaV1YtaM/nLqpe7+BJOhUjt15SdofL/7e0vUHLsjaye/+9u/w2vcM7s+cAMJnS8C3tuztkAR+ZXj8PNgzenI2uQNWfPx2vpw95XAmJtft1v7jx8/0osB1PQSbabYmAHXUZYQ+CIQKot3je/xlfymraLlNj+KSltQqXDsgemo3SiUAU+A6e6b+imaUp/PXUZj3apSfEuov/9SbuCrrspz2zremA+++m1vWFrwwxHB3yN9YD4chH8Kp22hHdjiwiGnDp8Pv4jWHx2WF4X1l51m8B8=
--------------------------------------------------------------------------------
/docs/distributed-system/images/zookeeper/znode-structure.drawio:
--------------------------------------------------------------------------------
1 | 7Vrfc5s4EP5r9HgZQAiLR7DN3fSuc53Lw7VPHRVkzAUjV8iJ3b/+JBC/iYlTO3ZmmszE0mq1Et+utN8SAzjf7H/nZLv+yCKaAsuI9gAugGWZpuHIDyU5lJIZdktBzJNIKzWC++QH1UJDS3dJRPOOomAsFcm2KwxZltFQdGSEc/bUVVuxtLvqlsR0ILgPSTqU/ptEYl1KsTVr5H/QJF5XK5uOfr5vJHyIOdtlej1gwcAJggCXwxtS2dIPmq9JxJ5aIrgEcM4ZE2Vrs5/TVGFbwVbOC54ZrffNaSZeMmE/u//7wyHA8wP9fvhq/vmPTb7/pq3k4lDhQSMJj+4yLtYsZhlJl43UD3f8kSqjpuwUABQ9Q/aaCX8xttUq/1EhDtrxZCeYFK3FJtWjK5YJPWg6sp8Lzh5qV0iU/HKLal/PPnn1GGzHQ3rkcZEOMMJjKo7ozWr/yLinbEMFP8h5nKZEJI/dfRAdgHGt1zhBNrQfTvCJdXWfSFz54bOaf4eq7hdtrugs9p3eQfdu0pf4mr6Ev3x5Tl86P+nLYqrHOTm0FLYsyUTesvxJCaSCznEQ6htcZzi7f9H29E37qL5slDtooqp+lNcHmn31QLvJgHHfQ8Ag5L59wGgEH0m6oxWBCVIWPuSDSGpCQ/n5aZ0Ier8lhX+eJCk8HgarJE3nLGW8sAUjQvEqrMOjGslYRusIeaRc0P3xGBn6VE+wcBd8iPTReGrYnWlonXWL2dnOhXKAcwTp4tO4KOKGgSEOLoi424t2R2Wa60I+m4J8yHvPCfnctpGNLhnk/RRzA5jjKcyHvPZdYQ7x7WHuTmGevW/MkXV7mFcvLjqg97lXFnnq3UQDRkTydY16C2El/0SEoDwrJJYBR7lT2xP4BC41hLYFHBrBrZKdRpEGnMbuZwUMuyZKiqdnHSNH5oShkgMODJ2LJ5nm2BlLondOkxz71miSORseo8kS5mrl8fCEdqqplx7PF5Q6pr5eJmsdNO7wy9Y6yOjFETxe6/Rro57+ZWodE78itG7jNcxFq+gXh5b5zGXyxrE1UUc77lH9C8WWNZYfzpscRpNAL2OskPrVk1vy8uc8ScNGXYDrMuR6SQNeg4x1b4Nbp2IOdivSXHEoF1aSU+nYiLHZwNilKdnYG5VfDLznqVn/Nqzq11Ndjs0JQ5d291iV+7y7w5TkeRJ2ndw9sRPkje4T8bnV/tKkbdlrErXqVHm6E11nT9FXuzp69bflvDKGHNg39LZVnDVSxS0d4BnAd8ESA+wBLCUz9dd3B+ElU6boBtRkStYikiaxuldC6Xkq5b5KwElIUk8PbJIoKvjmGCfohm2fFpwho/fLQFleDzK6MxJf0Hg+lH7un98jdEo5KgA4AEsb+Bh43ojHli7AEPgLpexipV8qy7uqnmUZPzIWUWDNR0zWg3ICUiPahA88VBidA/XNFiMrNOqNIOAtgLxpR2LISVXMfOOyFavWxKLtByjWkrZdu/skGPizQoKAvwTYVhLPBB5Wy3pSzXvpsqxetzRePwouNmAr+9Km6xWrSIlc0VANvADespq1KDYghWaxN9lARUMuJ6t5w9zc8EkKyCZJVdh/oMLnJMlkJWJ8lLhUJ626mtdCbOUYghI4pKi9/KMU8ruYsTilZJvkdyHbFANhXqgGq9K6bLbtI8tvr3DesyzpeecsI2fIzuu3ae3DjNHJh1l2m28ulZd08/UwuPwf
--------------------------------------------------------------------------------
/docs/database/redis/images/aof-work-process.drawio:
--------------------------------------------------------------------------------
1 | 7Vptc+MmEP41fIxH6F0fJce69iZpO5N27u5Th0hY1kUWroRj+359AYElLDnxxXHsyWUy48ACC2If9tlFAtZ4vv5UocXslqS4AKaRroF1DUwTQsNl/7hk00g8P2gEWZWnslMruMt/YCk0pHSZp7jWOlJCCpovdGFCyhInVJOhqiIrvduUFPqsC5ThnuAuQUVf+iVP6ayR+qbXyn/DeTZTM0NXPt89Sh6yiixLOR8wrdiN49hvmudI6ZIPWs9QSlYdkTUB1rgihDal+XqMC763atuacfGe1u26K1zSQwag4N+x/8et+c/vf3+d3qR3FN4WV7ZcG92o/cAp2x5ZJRWdkYyUqJi00kg8M+ZaDVZr+9wQsmBCyITfMaUbaWu0pISJZnReyFa24GrzVY4XlW+8MnJU9XrdbbzeyNqUlDRG87zggs+YRhXKy5ot/5aURLbfkWWV8GlnlDIEmY4Vsh+2KfyHd6hHGSFZgdEir0cJmYuGpBZd42mjnRW7+h0zkjPUtCIPW5wwE0bN/vFN22sWKarVyvbZQqEfVRmmT/Qzt+BhhxKTOWZ7xMZVuEA0f9TXgeTpyLb9WoSwggTJTwBGnvZHVCzVsywWmJ2BIRzdoHvmLTTboyLPSlZO2PbgigkecUVzdhxD2TDP07SBGa7zH+he6OPWX5CcWY8rdyLgXCt7NyCD9kXgo+APHG0dw5gUpBLboVyDAgx/arwGAw5OPnHrN7pQ2n+G+3iQ2q+MkdkoOhggUtdffMM7Xch0WjNg7iJoO+XLQQV7oAITBwQQRNdgYoMoAqENJj6IYiFxgB+C0OhBrnVMHGmrWU7x3QIJa68YeelA7ILH5fW8KDr2ShH2p8n2yKuWkpT4IpC2F0Y9z7MXGVBRsGRuy5b1VcuD0JCyWYcDbfdEzsX7YKOLYSPzQDayzslGfs9xrCp26j/I6Gxk5D1HRtAIoO52Lp2dzB7Iwj9jMPFANAaBJejIBZGgLH8MovCkvGQYvuXH75qXLPPSeCk4Ly+1VPRNY6JfkpesA3kJGsMge6mfkeD07B1wupauolmYHHWCULkfK0/rTZl8UN7ZKC94Nv+CvqeBBh5HeUqzzqOBPv50fGgNZGuMDC2ep/FCBIJYsqLvgInLU7XIPxdhTv0EJ+87kXN2fdIQYVpvSZgqs9yNmVwQMFB4MqmPXDCJOSh8gY4QgnDMCwFDkK+a+tz7mujAMHWw977RAT0WQHTxYfsD+PCcAXwYp8JHP6buE1iZhvx+n5NVgeo6T3TL6gHWLhc9H6Cd37gvj5P6xu6Y0hk46Up2JOW4ju5pHHMHIU341ot++oqCHUXGjqI9YRRDBNp0usmg5PAFO8aT6/LMI/sbWn9WaFb8ujFgn4Er/HHxcd4oEO55LdMNA6EesR15L78ZHHDCW3pnEF5nSoO3bU+kwZcFy9O+PJRvck+fFx9H/P33hwVB6YffOp/fcp70W8YImratua2rI/3WG3gqux9eTgKeePji9SELPsL4pHnFL/D60LGtkacnFo7v9BML0xy9aWrhDaQWbkHltmomd/9bEtVwVQtrsk02oLtYiz1S7ayUif/8xsIRWaotLjM8IWGJqifT1SD8jB7RJ/5Nk5r1vjpyTo+/9A6gSJFZZhxsp/rOphKfT42SUs0GGnBsR++CnNmb6kgeRmgHzlJ0uO8dOjp6HLDH03WOh3a2WL1ztiLxJ3RS5oBIKZXWD5gmM1VRX1tdxpX4K5w3c+eWx/YGsnh/IPeDP3/UWLX9MK3xyu3Xf9bkfw==
--------------------------------------------------------------------------------
/docs/cs-basics/algorithms/common-data-structures-leetcode-recommendations.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 常见数据结构经典LeetCode题目推荐
3 | category: 计算机基础
4 | tag:
5 | - 算法
6 | ---
7 |
8 | ## 数组
9 |
10 | 704.二分查找:
11 |
12 | 80.删除有序数组中的重复项 II:
13 |
14 | 977.有序数组的平方:
15 |
16 | ## 链表
17 |
18 | 707.设计链表:
19 |
20 | 206.反转链表:
21 |
22 | 92.反转链表 II:
23 |
24 | 61.旋转链表:
25 |
26 | ## 栈与队列
27 |
28 | 232.用栈实现队列:
29 |
30 | 225.用队列实现栈:
31 |
32 | 347.前 K 个高频元素:
33 |
34 | 239.滑动窗口最大值:
35 |
36 | ## 二叉树
37 |
38 | 105.从前序与中序遍历构造二叉树:
39 |
40 | 117.填充每个节点的下一个右侧节点指针 II:
41 |
42 | 236.二叉树的最近公共祖先:
43 |
44 | 129.求根节点到叶节点数字之和:
45 |
46 | 102.二叉树的层序遍历:
47 |
48 | 530.二叉搜索树的最小绝对差:
49 |
50 | ## 图
51 |
52 | 200.岛屿数量:
53 |
54 | 207.课程表:
55 |
56 | 210.课程表 II:
57 |
58 | ## 堆
59 |
60 | 215.数组中的第 K 个最大元素:
61 |
62 | 216.数据流的中位数:
63 |
64 | 217.前 K 个高频元素:
65 |
--------------------------------------------------------------------------------
/docs/high-availability/redundancy.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 冗余设计详解
3 | category: 高可用
4 | icon: cluster
5 | ---
6 |
7 | 冗余设计是保证系统和数据高可用的最常的手段。
8 |
9 | 对于服务来说,冗余的思想就是相同的服务部署多份,如果正在使用的服务突然挂掉的话,系统可以很快切换到备份服务上,大大减少系统的不可用时间,提高系统的可用性。
10 |
11 | 对于数据来说,冗余的思想就是相同的数据备份多份,这样就可以很简单地提高数据的安全性。
12 |
13 | 实际上,日常生活中就有非常多的冗余思想的应用。
14 |
15 | 拿我自己来说,我对于重要文件的保存方法就是冗余思想的应用。我日常所使用的重要文件都会同步一份在 GitHub 以及个人云盘上,这样就可以保证即使电脑硬盘损坏,我也可以通过 GitHub 或者个人云盘找回自己的重要文件。
16 |
17 | 高可用集群(High Availability Cluster,简称 HA Cluster)、同城灾备、异地灾备、同城多活和异地多活是冗余思想在高可用系统设计中最典型的应用。
18 |
19 | - **高可用集群** : 同一份服务部署两份或者多份,当正在使用的服务突然挂掉的话,可以切换到另外一台服务,从而保证服务的高可用。
20 | - **同城灾备**:一整个集群可以部署在同一个机房,而同城灾备中相同服务部署在同一个城市的不同机房中。并且,备用服务不处理请求。这样可以避免机房出现意外情况比如停电、火灾。
21 | - **异地灾备**:类似于同城灾备,不同的是,相同服务部署在异地(通常距离较远,甚至是在不同的城市或者国家)的不同机房中
22 | - **同城多活**:类似于同城灾备,但备用服务可以处理请求,这样可以充分利用系统资源,提高系统的并发。
23 | - **异地多活** : 将服务部署在异地的不同机房中,并且,它们可以同时对外提供服务。
24 |
25 | 高可用集群单纯是服务的冗余,并没有强调地域。同城灾备、异地灾备、同城多活和异地多活实现了地域上的冗余。
26 |
27 | 同城和异地的主要区别在于机房之间的距离。异地通常距离较远,甚至是在不同的城市或者国家。
28 |
29 | 和传统的灾备设计相比,同城多活和异地多活最明显的改变在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。
30 |
31 | 光做好冗余还不够,必须要配合上 **故障转移** 才可以! 所谓故障转移,简单来说就是实现不可用服务快速且自动地切换到可用服务,整个过程不需要人为干涉。
32 |
33 | 举个例子:哨兵模式的 Redis 集群中,如果 Sentinel(哨兵) 检测到 master 节点出现故障的话, 它就会帮助我们实现故障转移,自动将某一台 slave 升级为 master,确保整个 Redis 系统的可用性。整个过程完全自动,不需要人工介入。我在[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)的「技术面试题篇」中的数据库部分详细介绍了 Redis 集群相关的知识点&面试题,感兴趣的小伙伴可以看看。
34 |
35 | 再举个例子:Nginx 可以结合 Keepalived 来实现高可用。如果 Nginx 主服务器宕机的话,Keepalived 可以自动进行故障转移,备用 Nginx 主服务器升级为主服务。并且,这个切换对外是透明的,因为使用的虚拟 IP,虚拟 IP 不会改变。我在[《Java 面试指北》](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)的「技术面试题篇」中的「服务器」部分详细介绍了 Nginx 相关的知识点&面试题,感兴趣的小伙伴可以看看。
36 |
37 | 异地多活架构实施起来非常难,需要考虑的因素非常多。本人不才,实际项目中并没有实践过异地多活架构,我对其了解还停留在书本知识。
38 |
39 | 如果你想要深入学习异地多活相关的知识,我这里推荐几篇我觉得还不错的文章:
40 |
41 | - [搞懂异地多活,看这篇就够了- 水滴与银弹 - 2021](https://mp.weixin.qq.com/s/T6mMDdtTfBuIiEowCpqu6Q)
42 | - [四步构建异地多活](https://mp.weixin.qq.com/s/hMD-IS__4JE5_nQhYPYSTg)
43 | - [《从零开始学架构》— 28 | 业务高可用的保障:异地多活架构](http://gk.link/a/10pKZ)
44 |
45 | 不过,这些文章大多也都是在介绍概念知识。目前,网上还缺少真正介绍具体要如何去实践落地异地多活架构的资料。
46 |
47 |
48 |
--------------------------------------------------------------------------------
/docs/about-the-author/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 个人介绍 Q&A
3 | category: 走近作者
4 | ---
5 |
6 |
7 |
8 | 这篇文章我会通过 Q&A 的形式简单介绍一下我自己。
9 |
10 | ## 我是什么时候毕业的?
11 |
12 | 很多老读者应该比较清楚,我是 19 年本科毕业的,刚毕业就去了某家外企“养老”。
13 |
14 | 我的学校背景是比较差的,高考失利,勉强过了一本线 20 来分,去了荆州的一所很普通的双非一本。不过,还好我没有因为学校而放弃自己,反倒是比身边的同学都要更努力,整个大学还算过的比较充实。
15 |
16 | 下面这张是当时拍的毕业照(后排最中间的就是我):
17 |
18 | 
19 |
20 | ## 我坚持写了多久博客?
21 |
22 | 时间真快啊!我自己是从大二开始写博客的。那时候就是随意地在博客平台上发发自己的学习笔记和自己写的程序。就比如 [谢希仁老师的《计算机网络》内容总结](../cs-basics/network/computer-network-xiexiren-summary.md) 这篇文章就是我在大二学习计算机网络这门课的时候对照着教材总结的。
23 |
24 | 身边也有很多小伙伴经常问我:“我现在写博客还晚么?”
25 |
26 | 我觉得哈!如果你想做什么事情,尽量少问迟不迟,多问自己值不值得,只要你觉得有意义,就尽快开始做吧!人生很奇妙,我们每一步的重大决定,都会对自己未来的人生轨迹产生影响。是好还是坏,也只有我们自己知道了!
27 |
28 | 对我自己来说,坚持写博客这一项决定对我人生轨迹产生的影响是非常正面的!所以,我也推荐大家养成坚持写博客的习惯。
29 |
30 | ## 我在大学期间赚了多少钱?
31 |
32 | 在校期间,我还通过办培训班、接私活、技术培训、编程竞赛等方式变现 20w+,成功实现“经济独立”。我用自己赚的钱去了重庆、三亚、恩施、青岛等地旅游,还给家里补贴了很多,减轻了父母的负担。
33 |
34 | 下面这张是我大一下学期办补习班的时候拍的(离开前的最后一顿饭):
35 |
36 | 
37 |
38 | 下面这张是我大三去三亚的时候拍的:
39 |
40 | 
41 |
42 | 其实,我在大学就这么努力地开始赚钱,也主要是因为家庭条件太一般,父母赚钱都太辛苦了!也正是因为我自己迫切地想要减轻父母的负担,所以才会去尝试这么多赚钱的方法。
43 |
44 | 我发现做咱们程序员这行的,很多人的家庭条件都挺一般的,选择这个行业的很大原因不是因为自己喜欢,而是为了多赚点钱。
45 |
46 | 如果你也想通过接私活变现的话,可以在我的公众号后台回复“**接私活**”来了解一些我的个人经验分享。
47 |
48 | ::: center
49 |
50 | 
51 |
52 | :::
53 |
54 | ## 为什么自称 Guide?
55 |
56 | 可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide 哥**。
57 |
58 | 后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide**。
59 |
60 | 我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思,给大家拆解一下就清楚了。SnailClimb=Snail(蜗牛)+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁
61 |
62 | 
63 |
64 | ## 后记
65 |
66 | 凡心所向,素履所往,生如逆旅,一苇以航。
67 |
68 | 生活本就是有苦有甜。共勉!
69 |
70 | 
71 |
--------------------------------------------------------------------------------
/docs/database/redis/images/redis-event-handler.drawio:
--------------------------------------------------------------------------------
1 | 7Vtbc6s2EP41ekyG++XR2DjnnPa0meah7VNHARmTYOSCnNj99ZWEMGDJSZz4QjJMZhxpdQPtp0+7KwTM8WJ9U8Dl/CeOUQYMLV4DcwIMQ9c1h/5jkk0lcT2/EiRFGotKjeAu/Q8JoSakqzRGZaciwTgj6bIrjHCeo4h0ZLAo8HO32gxn3VGXMEGS4C6CmSz9M43JvH4vx28KvqE0mddDO7ZVldzD6DEp8CoXAwLDnDrT6dSrihew7ky8aTmHMX5uicwQmOMCY1KlFusxytjk1vNWtZvuKd0+eIFy8pYGqHzI/7m6/QNOYkxulsFVsfnlSvTyBLMVql+DPyzZ1DPEXxGxTnRgBs/zlKC7JYxY6TPFBJXNySITxTEs59u6M5yTKVykGcPGD0SCAqZ5SXv/iXMsyu/wquB9zQmhKjdsc0R/6EuwH1ahvE4wTjIEl2l5HeEFL4hKXnU6q3qnyXb/thGIEUpS4MetYumUB/Ks1VOACoLWLZGYxRuEF4gUdBCtLvWERgXkdUvkn1sAqrU+b2HH0oQQCtAm274bvdGEUN0BajRkNYY2GNnAd0HoAC9kaSaZMMmuhul7k64aq3kb4wwXVJLjHDF1pVm2I4JZmuQ0G9HZRFQesFlM6eoaiYJFGsdsGCVuGmRpKugIsjC0XkDpCMAxtB3gODJwPAVujJPBRpOwgGJKjyKLCzLHCc5hFjbSHa01dX7FeCm094AI2Qj1wRXBXXDRCSw2f4n2PPM3y1zbdXaybhdONiLXwoTu9AITB9BLWT/IPl2YYvODRYLIC/XE8mV6ehFzBcogSZ+629zREWRKxFPi6BERXQZWltE9fR8VtOAhqblFO3SPjSHyZtFejro4Jo6xwfh2hye2vNHmCVvmCfdkPKFQ58ATl+EJ61I8wZuOigJuWhWWOKVz0+r5lgkaKJt6d8szzR0j9bD6NFE9QYPl7au8H97WHhKTbeGBxN5NYubFSUyhztOT2NcmI/skJCOxgqWpWWHbRcWGolWDk4PZyuqOY7n2y2xlXYCt7D1s9dvAVsdzzSyFT39WtnIkLcvqzeMRi4A1qui40DtRmVtIqIuec4mhmUoi+ERe96uU01KcrfCpa9kHmckw3evuPmfteusViUrcpOqqSyb+20juWLximIOR35d91X2jke8de//9EGe5Emd9p/38TkU89mgBfwRCDwQuGE2FxJuA0AW+BUYeS9BfL2BFwQh4UwmPB4WiJTLrbmqzGXKir72pSWaTwgTXVQFH51S7mifvaqEDfAd4LggtEAQgcHhixHGwldjAo8hwWOWACkMm8X0Gl9NCZGZ8cYg4ft8g4r9u+AwnUjta9J2uFnVToUVHoUXrZPZrHcfpLHXVwmabgMU3AY2v8H0LezikOg8j+F7XntVdBZZ0BZZOdkqly/G5wRfqoS+kazvhENt7pyuka6a/41bZ9nm9IV0Os3Bu0kEwEfxFmYtas9SUDfghe6ADzziE0d5rqqhCNEiPbeR+aVPFd3dOxWoVtYnJPKepoiuCNAqMUEkA/LDl8QwYORNGlObseTEiO8XcB55yRLQ+zaGWkc8Rwb7RsQaMnA8j3sUxonKLKX14jEEqHqEwUaJmwMhZMGIpvtQ6L0YMS7Z5h+jsZaKzYnm9Gp3Vj348+jEI2QOEPh2EnH5ByBkg9Okg1K8vRg35+/MBQn2HUL/OGQ2FvWw4GRHz3wGX8+8K1wVXJdck1YamO8t1U0hTCf/PDpqoUT3mVveY356w2UEki/BMuWT0Az7BG3ZpqR7yvmiau8zzp/4/c+MCZorXrR5oK37V6TrK64agQsO2dT8j3hm8R1mwveuksPbr9eGJfMtVCPgf75NQYOBcdFo+IhLN60x9MarnYda3uw+22Q2EGqobQqpTNf1w94FmmztkVfSzualnhv8D
--------------------------------------------------------------------------------
/docs/.vuepress/theme.ts:
--------------------------------------------------------------------------------
1 | import { getDirname, path } from "vuepress/utils";
2 | import { hopeTheme } from "vuepress-theme-hope";
3 |
4 | import navbar from "./navbar.js";
5 | import sidebar from "./sidebar/index.js";
6 |
7 | const __dirname = getDirname(import.meta.url);
8 |
9 | export default hopeTheme({
10 | hostname: "https://javaguide.cn/",
11 | logo: "/logo.png",
12 | favicon: "/favicon.ico",
13 |
14 | author: {
15 | name: "Guide",
16 | url: "https://javaguide.cn/article/",
17 | },
18 |
19 | repo: "https://github.com/Snailclimb/JavaGuide",
20 | docsDir: "docs",
21 | pure: true,
22 | focus: false,
23 | breadcrumb: false,
24 | navbar,
25 | sidebar,
26 | footer:
27 | '鄂ICP备2020015769号-1',
28 | displayFooter: true,
29 |
30 | pageInfo: ["Author", "Category", "Tag", "Original", "Word", "ReadingTime"],
31 |
32 | blog: {
33 | intro: "/about-the-author/",
34 | sidebarDisplay: "mobile",
35 | medias: {
36 | Zhihu: "https://www.zhihu.com/people/javaguide",
37 | Github: "https://github.com/Snailclimb",
38 | Gitee: "https://gitee.com/SnailClimb",
39 | },
40 | },
41 |
42 | markdown: {
43 | align: true,
44 | codeTabs: true,
45 | gfm: true,
46 | include: {
47 | resolvePath: (file, cwd) => {
48 | if (file.startsWith("@"))
49 | return path.resolve(
50 | __dirname,
51 | "../snippets",
52 | file.replace("@", "./"),
53 | );
54 |
55 | return path.resolve(cwd, file);
56 | },
57 | },
58 | tasklist: true,
59 | },
60 |
61 | plugins: {
62 | blog: true,
63 |
64 | copyright: {
65 | author: "JavaGuide(javaguide.cn)",
66 | license: "MIT",
67 | triggerLength: 100,
68 | maxLength: 700,
69 | canonical: "https://javaguide.cn/",
70 | global: true,
71 | },
72 |
73 | feed: {
74 | atom: true,
75 | json: true,
76 | rss: true,
77 | },
78 |
79 | icon: {
80 | assets: "//at.alicdn.com/t/c/font_2922463_o9q9dxmps9.css",
81 | },
82 |
83 | search: {
84 | isSearchable: (page) => page.path !== "/",
85 | maxSuggestions: 10,
86 | },
87 | },
88 | });
89 |
--------------------------------------------------------------------------------
/docs/high-quality-technical-articles/advanced-programmer/programmer-quickly-learn-new-technology.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 程序员如何快速学习新技术
3 | category: 技术文章精选集
4 | tag:
5 | - 练级攻略
6 | ---
7 |
8 | > **推荐语**:这是[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)练级攻略篇中的一篇文章,分享了我对于如何快速学习一门新技术的看法。
9 | >
10 | > 
11 |
12 | 很多时候,我们因为工作原因需要快速学习某项技术,进而在项目中应用。或者说,我们想要去面试的公司要求的某项技术我们之前没有接触过,为了应对面试需要,我们需要快速掌握这项技术。
13 |
14 | 作为一个人纯自学出生的程序员,这篇文章简单聊聊自己对于如何快速学习某项技术的看法。
15 |
16 | 学习任何一门技术的时候,一定要先搞清楚这个技术是为了解决什么问题的。深入学习这个技术的之前,一定先从全局的角度来了解这个技术,思考一下它是由哪些模块构成的,提供了哪些功能,和同类的技术想必它有什么优势。
17 |
18 | 比如说我们在学习 Spring 的时候,通过 Spring 官方文档你就可以知道 Spring 最新的技术动态,Spring 包含哪些模块 以及 Spring 可以帮你解决什么问题。
19 |
20 | 
21 |
22 | 再比如说我在学习消息队列的时候,我会先去了解这个消息队列一般在系统中有什么作用,帮助我们解决了什么问题。消息队列的种类很多,具体学习研究某个消息队列的时候,我会将其和自己已经学习过的消息队列作比较。像我自己在学习 RocketMQ 的时候,就会先将其和自己曾经学习过的第 1 个消息队列 ActiveMQ 进行比较,思考 RocketMQ 相对于 ActiveMQ 有了哪些提升,解决了 ActiveMQ 的哪些痛点,两者有哪些相似的地方,又有哪些不同的地方。
23 |
24 | **学习一个技术最有效最快的办法就是将这个技术和自己之前学到的技术建立连接,形成一个网络。**
25 |
26 | 然后,我建议你先去看看官方文档的教程,运行一下相关的 Demo ,做一些小项目。
27 |
28 | 不过,官方文档通常是英文的,通常只有国产项目以及少部分国外的项目提供了中文文档。并且,官方文档介绍的往往也比较粗糙,不太适合初学者作为学习资料。
29 |
30 | 如果你看不太懂官网的文档,你也可以搜索相关的关键词找一些高质量的博客或者视频来看。 **一定不要一上来就想着要搞懂这个技术的原理。**
31 |
32 | 就比如说我们在学习 Spring 框架的时候,我建议你在搞懂 Spring 框架所解决的问题之后,不是直接去开始研究 Spring 框架的原理或者源码,而是先实际去体验一下 Spring 框架提供的核心功能 IoC(Inverse of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程),使用 Spring 框架写一些 Demo,甚至是使用 Spring 框架做一些小项目。
33 |
34 | 一言以蔽之, **在研究这个技术的原理之前,先要搞懂这个技术是怎么使用的。**
35 |
36 | 这样的循序渐进的学习过程,可以逐渐帮你建立学习的快感,获得即时的成就感,避免直接研究原理性的知识而被劝退。
37 |
38 | **研究某个技术原理的时候,为了避免内容过于抽象,我们同样可以动手实践。**
39 |
40 | 比如说我们学习 Tomcat 原理的时候,我们发现 Tomcat 的自定义线程池挺有意思,那我们自己也可以手写一个定制版的线程池。再比如我们学习 Dubbo 原理的时候,可以自己动手造一个简易版的 RPC 框架。
41 |
42 | 另外,学习项目中需要用到的技术和面试中需要用到的技术其实还是有一些差别的。
43 |
44 | 如果你学习某一项技术是为了在实际项目中使用的话,那你的侧重点就是学习这项技术的使用以及最佳实践,了解这项技术在使用过程中可能会遇到的问题。你的最终目标就是这项技术为项目带来了实际的效果,并且,这个效果是正面的。
45 |
46 | 如果你学习某一项技术仅仅是为了面试的话,那你的侧重点就应该放在这项技术在面试中最常见的一些问题上,也就是我们常说的八股文。
47 |
48 | 很多人一提到八股文,就是一脸不屑。在我看来,如果你不是死记硬背八股文,而是去所思考这些面试题的本质。那你在准备八股文的过程中,同样也能让你加深对这项技术的了解。
49 |
50 | 最后,最重要同时也是最难的还是 **知行合一!知行合一!知行合一!** 不论是编程还是其他领域,最重要不是你知道的有多少,而是要尽量做到知行合一。
51 |
--------------------------------------------------------------------------------
/docs/high-quality-technical-articles/work/32-tips-improving-career.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 32条总结教你提升职场经验
3 | category: 技术文章精选集
4 | tag:
5 | - 工作
6 | ---
7 |
8 | > **推荐语**:阿里开发者的一篇职场经验的分享。
9 | >
10 | > **原文地址:**
11 |
12 | ## 成长的捷径
13 |
14 | - 入职伊始谦逊的态度是好的,但不要把“我是新人”作为心理安全线;
15 | - 写一篇技术博客大概需要两周左右,但可能是最快的成长方式;
16 | - 一定要读两本书:金字塔原理、高效能人士的七个习惯(这本书名字像成功学,实际讲的是如何塑造性格);
17 | - 多问是什么、为什么,追本溯源把问题解决掉,试图绕过的问题永远会在下个路口等着你;
18 | - 不要沉迷于忙碌带来的虚假安全感中,目标的确定和追逐才是最真实的安全;
19 | - 不用过于计较一时的得失,在公平的环境中,吃亏是福不是鸡汤;
20 | - 思维和技能不要受限于前端、后端、测试等角色,把自己定位成业务域问题的终结者;
21 | - 好奇和热爱是成长最大的捷径,长期主义者会认同自己的工作价值,甚至要高于组织当下给的认同(KPI)。
22 |
23 | ## 功夫在日常
24 |
25 | - 每行代码要代表自己当下的最高水平,你觉得无所谓的小细节,有可能就是在晋升场上伤害你的暗箭;
26 | - 双周报不是工作日志流水账,不要被时间推着走,最起码要知道下次双周报里会有什么(小目标驱动);
27 | - 觉得日常都是琐碎工作、不技术、给师兄打杂等,可以尝试对手头事情做一下分类,想象成每个分类都是个小格子,这些格子连起来的终点就是自己的目标,这样每天不再是机械的做需求,而是有规划的填格子、为目标努力,甚至会给自己加需求,因为自己看清楚了要去哪里;
28 | - 日常的言行举止是能力的显微镜,大部分人可能意识不到,自己的强大和虚弱是那么的明显,不要无谓的试图掩盖,更不存在蒙混过关。
29 |
30 | > 最后一条大概意思就是有时候我们会在意自己在聚光灯下(述职、晋升、周报、汇报等)的表现,以为大家会根据这个评价自己。实际上日常是怎么完成业务需求、帮助身边同学、创造价值的,才是大家评价自己的依据,而且每个人是什么样的特质,合作过三次的伙伴就可以精准评价,在聚光灯下的表演只能骗自己。
31 |
32 | ## 学会被管理
33 |
34 | > 上级、主管是泛指,开发对口的 PD 主管等也在范围内。
35 |
36 | - 不要传播负面情绪,不要总是抱怨;
37 | - 对上级不卑不亢更容易获得尊重,但不要当众反驳对方观点,分歧私下沟通;
38 | - 好好做向上管理,尤其是对齐预期,沟通绩效出现 Surprise 双方其实都有责任,但倒霉的是自己;
39 | - 尽量站在主管角度想问题:
40 |
41 | - - 这样能理解很多过去感觉匪夷所思的决策;
42 | - 不要在意谁执行、功劳是谁的等,为团队分忧赢得主管信任的重要性远远高于这些;
43 | - 不要把这个原则理解为唯上,这种最让人不齿。
44 |
45 | ## 思维转换
46 |
47 | - 定义问题是个高阶能力,尽早形成 发现问题->定义问题->解决问题->消灭问题 的思维闭环;
48 | - 定事情价值导向,做事情结果导向,讲事情问题导向;
49 | - 讲不清楚,大概率不是因为自己是实干型,而是没想清楚,在晋升场更加明显;
50 | - 当一个人擅长解决某一场景的问题的时候,时间越久也许越离不开这个场景(被人贴上一个标签很难,撕掉一个标签更难)。
51 |
52 | ## 要栓住情绪
53 |
54 | - 学会控制情绪,没人会认真听一个愤怒的人在说什么;
55 | - 再委屈、再愤怒也要保持理智,不要让自己成为需要被哄着的那种人;
56 | - 足够自信的人才会坦率的承认自己的问题,很多时候我们被激怒了,只是因为对方指出了自己藏在深处的自卑;
57 | - 伤害我们最深的既不是别人的所作所为,也不是自己犯的错误,而是我们对错误的回应。
58 |
59 | ## 成为 Leader
60 |
61 | > Manager 有下属,Leader 有追随者,管理者不需要很多,但人人都可以是 Leader。
62 |
63 | - 让你信服、愿意追随的人不是职务上的 Manager,而是在帮助自己的那个人,自己想服众的话道理一样;
64 | - 不要轻易对人做负面评价,片面认知下的评价可能不准确,不经意的传播更是会给对方带来极大的困扰;
65 | - Leader 如果不认同公司的使命、愿景、价值观,会过的特别痛苦;
66 | - 困难时候不要否定自己的队友,多给及时、正向的反馈;
67 | - 船长最重要的事情不是造船,而是激发水手对大海的向往;
68 | - Leader 的天然职责是让团队活下去,唯一的途径是实现上级、老板、公司经营者的目标,越是艰难的时候越明显;
69 | - Leader 的重要职责是识别团队需要被做的事情,并坚定信念,使众人行,越是艰难的时候越要坚定;
70 | - Leader 应该让自己遇到的每个人都感觉自己很重要、被需要。
71 |
72 |
73 |
--------------------------------------------------------------------------------
/docs/.vuepress/sidebar/high-quality-technical-articles.ts:
--------------------------------------------------------------------------------
1 | import { arraySidebar } from "vuepress-theme-hope";
2 |
3 | export const highQualityTechnicalArticles = arraySidebar([
4 | {
5 | text: "练级攻略",
6 | icon: "et-performance",
7 | prefix: "advanced-programmer/",
8 | collapsible: false,
9 | children: [
10 | "programmer-quickly-learn-new-technology",
11 | "the-growth-strategy-of-the-technological-giant",
12 | "ten-years-of-dachang-growth-road",
13 | "meituan-three-year-summary-lesson-10",
14 | "seven-tips-for-becoming-an-advanced-programmer",
15 | "20-bad-habits-of-bad-programmers",
16 | "thinking-about-technology-and-business-after-five-years-of-work",
17 | ],
18 | },
19 | {
20 | text: "个人经历",
21 | icon: "experience",
22 | prefix: "personal-experience/",
23 | collapsible: false,
24 | children: [
25 | "four-year-work-in-tencent-summary",
26 | "two-years-of-back-end-develop--experience-in-didi-and-toutiao",
27 | "8-years-programmer-work-summary",
28 | "huawei-od-275-days",
29 | ],
30 | },
31 | {
32 | text: "程序员",
33 | icon: "code",
34 | prefix: "programmer/",
35 | collapsible: false,
36 | children: [
37 | "high-value-certifications-for-programmers",
38 | "how-do-programmers-publish-a-technical-book",
39 | "efficient-book-publishing-and-practice-guide",
40 | ],
41 | },
42 | {
43 | text: "面试",
44 | icon: "interview",
45 | prefix: "interview/",
46 | collapsible: true,
47 | children: [
48 | "the-experience-of-get-offer-from-over-20-big-companies",
49 | "the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer",
50 | "technical-preliminary-preparation",
51 | "screen-candidates-for-packaging",
52 | "summary-of-spring-recruitment",
53 | "my-personal-experience-in-2021",
54 | "how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology",
55 | "some-secrets-about-alibaba-interview",
56 | ],
57 | },
58 | {
59 | text: "工作",
60 | icon: "work",
61 | prefix: "work/",
62 | collapsible: true,
63 | children: [
64 | "get-into-work-mode-quickly-when-you-join-a-company",
65 | "32-tips-improving-career",
66 | "employee-performance",
67 | ],
68 | },
69 | ]);
70 |
--------------------------------------------------------------------------------
/docs/distributed-system/images/distributed-id/nosql.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/high-performance/data-cold-hot-separation.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 数据冷热分离详解
3 | category: 高性能
4 | head:
5 | - - meta
6 | - name: keywords
7 | content: 数据冷热分离,冷数据迁移,冷数据存储
8 | - - meta
9 | - name: description
10 | content: 数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。
11 | ---
12 |
13 | ## 什么是数据冷热分离?
14 |
15 | 数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。
16 |
17 | ### 冷数据和热数据
18 |
19 | 热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据。
20 |
21 | 冷热数据到底如何区分呢?有两个常见的区分方法:
22 |
23 | 1. **时间维度区分**:按照数据的创建时间、更新时间、过期时间等,将一定时间段内的数据视为热数据,超过该时间段的数据视为冷数据。例如,订单系统可以将 1 年前的订单数据作为冷数据,1 年内的订单数据作为热数据。这种方法适用于数据的访问频率和时间有较强的相关性的场景。
24 | 2. **访问频率区分**:将高频访问的数据视为热数据,低频访问的数据视为冷数据。例如,内容系统可以将浏览量非常低的文章作为冷数据,浏览量较高的文章作为热数据。这种方法需要记录数据的访问频率,成本较高,适合访问频率和数据本身有较强的相关性的场景。
25 |
26 | 几年前的数据并不一定都是冷数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。
27 |
28 | 这两种区分冷热数据的方法各有优劣,实际项目中,可以将两者结合使用。
29 |
30 | ### 冷热分离的思想
31 |
32 | 冷热分离的思想非常简单,就是对数据进行分类,然后分开存储。冷热分离的思想可以应用到很多领域和场景中,而不仅仅是数据存储,例如:
33 |
34 | - 邮件系统中,可以将近期的比较重要的邮件放在收件箱,将比较久远的不太重要的邮件存入归档。
35 | - 日常生活中,可以将常用的物品放在显眼的位置,不常用的物品放入储藏室或者阁楼。
36 | - 图书馆中,可以将最受欢迎和最常借阅的图书单独放在一个显眼的区域,将较少借阅的书籍放在不起眼的位置。
37 | - ……
38 |
39 | ### 数据冷热分离的优缺点
40 |
41 | - 优点:热数据的查询性能得到优化(用户的绝大部分操作体验会更好)、节约成本(可以冷热数据的不同存储需求,选择对应的数据库类型和硬件配置,比如将热数据放在 SSD 上,将冷数据放在 HDD 上)
42 | - 缺点:系统复杂性和风险增加(需要分离冷热数据,数据错误的风险增加)、统计效率低(统计的时候可能需要用到冷库的数据)。
43 |
44 | ## 冷数据如何迁移?
45 |
46 | 冷数据迁移方案:
47 |
48 | 1. 业务层代码实现:当有对数据进行写操作时,触发冷热分离的逻辑,判断数据是冷数据还是热数据,冷数据就入冷库,热数据就入热库。这种方案会影响性能且冷热数据的判断逻辑不太好确定,还需要修改业务层代码,因此一般不会使用。
49 | 2. 任务调度:可以利用 xxl-job 或者其他分布式任务调度平台定时去扫描数据库,找出满足冷数据条件的数据,然后批量地将其复制到冷库中,并从热库中删除。这种方法修改的代码非常少,非常适合按照时间区分冷热数据的场景。
50 | 3. 监听数据库的变更日志 binlog :将满足冷数据条件的数据从 binlog 中提取出来,然后复制到冷库中,并从热库中删除。这种方法可以不用修改代码,但不适合按照时间维度区分冷热数据的场景。
51 |
52 | 如果你的公司有 DBA 的话,也可以让 DBA 进行冷数据的人工迁移,一次迁移完成冷数据到冷库。然后,再搭配上面介绍的方案实现后续冷数据的迁移工作。
53 |
54 | ## 冷数据如何存储?
55 |
56 | 冷数据的存储要求主要是容量大,成本低,可靠性高,访问速度可以适当牺牲。
57 |
58 | 冷数据存储方案:
59 |
60 | - 中小厂:直接使用 MySQL/PostgreSQL 即可(不改变数据库选型和项目当前使用的数据库保持一致),比如新增一张表来存储某个业务的冷数据或者使用单独的冷库来存放冷数据(涉及跨库查询,增加了系统复杂性和维护难度)
61 | - 大厂:Hbase(常用)、RocksDB、Doris、Cassandra
62 |
63 | 如果公司成本预算足的话,也可以直接上 TiDB 这种分布式关系型数据库,直接一步到位。TiDB 6.0 正式支持数据冷热存储分离,可以降低 SSD 使用成本。使用 TiDB 6.0 的数据放置功能,可以在同一个集群实现海量数据的冷热存储,将新的热数据存入 SSD,历史冷数据存入 HDD。
64 |
65 | ## 案例分享
66 |
67 | - [如何快速优化几千万数据量的订单表 - 程序员济癫 - 2023](https://www.cnblogs.com/fulongyuanjushi/p/17910420.html)
68 | - [海量数据冷热分离方案与实践 - 字节跳动技术团队 - 2022](https://mp.weixin.qq.com/s/ZKRkZP6rLHuTE1wvnqmAPQ)
69 |
--------------------------------------------------------------------------------
/docs/cs-basics/data-structure/red-black-tree.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 红黑树
3 | category: 计算机基础
4 | tag:
5 | - 数据结构
6 | ---
7 |
8 | ## 红黑树介绍
9 |
10 | 红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。
11 |
12 | 由于其自平衡的特性,保证了最坏情形下在 O(logn) 时间复杂度内完成查找、增加、删除等操作,性能表现稳定。
13 |
14 | 在 JDK 中,`TreeMap`、`TreeSet` 以及 JDK1.8 的 `HashMap` 底层都用到了红黑树。
15 |
16 | ## 为什么需要红黑树?
17 |
18 | 红黑树的诞生就是为了解决二叉查找树的缺陷。
19 |
20 | 二叉查找树是一种基于比较的数据结构,它的每个节点都有一个键值,而且左子节点的键值小于父节点的键值,右子节点的键值大于父节点的键值。这样的结构可以方便地进行查找、插入和删除操作,因为只需要比较节点的键值就可以确定目标节点的位置。但是,二叉查找树有一个很大的问题,就是它的形状取决于节点插入的顺序。如果节点是按照升序或降序的方式插入的,那么二叉查找树就会退化成一个线性结构,也就是一个链表。这样的情况下,二叉查找树的性能就会大大降低,时间复杂度就会从 O(logn) 变为 O(n)。
21 |
22 | 红黑树的诞生就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。
23 |
24 | ## **红黑树特点**
25 |
26 | 1. 每个节点非红即黑。黑色决定平衡,红色不决定平衡。这对应了 2-3 树中一个节点内可以存放 1~2 个节点。
27 | 2. 根节点总是黑色的。
28 | 3. 每个叶子节点都是黑色的空节点(NIL 节点)。这里指的是红黑树都会有一个空的叶子节点,是红黑树自己的规则。
29 | 4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定)。通常这条规则也叫不会有连续的红色节点。一个节点最多临时会有 3 个子节点,中间是黑色节点,左右是红色节点。
30 | 5. 从任意节点到它的叶子节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。每一层都只是有一个节点贡献了树高决定平衡性,也就是对应红黑树中的黑色节点。
31 |
32 | 正是这些特点才保证了红黑树的平衡,让红黑树的高度不会超过 2log(n+1)。
33 |
34 | ## 红黑树数据结构
35 |
36 | 建立在 BST 二叉搜索树的基础上,AVL、2-3 树、红黑树都是自平衡二叉树(统称 B-树)。但相比于 AVL 树,高度平衡所带来的时间复杂度,红黑树对平衡的控制要宽松一些,红黑树只需要保证黑色节点平衡即可。
37 |
38 | ## 红黑树结构实现
39 |
40 | ```java
41 | public class Node {
42 |
43 | public Class> clazz;
44 | public Integer value;
45 | public Node parent;
46 | public Node left;
47 | public Node right;
48 |
49 | // AVL 树所需属性
50 | public int height;
51 | // 红黑树所需属性
52 | public Color color = Color.RED;
53 |
54 | }
55 | ```
56 |
57 | ### 1.左倾染色
58 |
59 | 
60 |
61 | - 染色时根据当前节点的爷爷节点,找到当前节点的叔叔节点。
62 | - 再把父节点染黑、叔叔节点染黑,爷爷节点染红。但爷爷节点染红是临时的,当平衡树高操作后会把根节点染黑。
63 |
64 | ### 2.右倾染色
65 |
66 | 
67 |
68 | ### 3.左旋调衡
69 |
70 | #### 3.1 一次左旋
71 |
72 | 
73 |
74 | #### 3.2 右旋+左旋
75 |
76 | 
77 |
78 | ### 4.右旋调衡
79 |
80 | #### 4.1 一次右旋
81 |
82 | 
83 |
84 | #### 4.2 左旋+右旋
85 |
86 | 
87 |
88 | ## 文章推荐
89 |
90 | - [《红黑树深入剖析及 Java 实现》 - 美团点评技术团队](https://zhuanlan.zhihu.com/p/24367771)
91 | - [漫画:什么是红黑树? - 程序员小灰](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)
92 |
93 |
94 |
--------------------------------------------------------------------------------
/docs/distributed-system/images/distributed-id/the-primary-key-of-the-database-increases-automatically.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/vertical-slicing-database.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/high-quality-technical-articles/README.md:
--------------------------------------------------------------------------------
1 | # 程序人生
2 |
3 |
4 |
5 | 这里主要会收录一些我看到的或者我自己写的和程序员密切相关的非技术类的优质文章,每一篇都值得你阅读 3 遍以上!常看常新!
6 |
7 | ## 练级攻略
8 |
9 | - [程序员如何快速学习新技术](./advanced-programmer/programmer-quickly-learn-new-technology.md)
10 | - [程序员的技术成长战略](./advanced-programmer/the-growth-strategy-of-the-technological-giant.md)
11 | - [十年大厂成长之路](./advanced-programmer/ten-years-of-dachang-growth-road.md)
12 | - [美团三年,总结的 10 条血泪教训](./advanced-programmer/meituan-three-year-summary-lesson-10.md)
13 | - [给想成长为高级别开发同学的七条建议](./advanced-programmer/seven-tips-for-becoming-an-advanced-programmer.md)
14 | - [糟糕程序员的 20 个坏习惯](./advanced-programmer/20-bad-habits-of-bad-programmers.md)
15 | - [工作五年之后,对技术和业务的思考](./advanced-programmer/thinking-about-technology-and-business-after-five-years-of-work.md)
16 |
17 | ## 个人经历
18 |
19 | - [从校招入职腾讯的四年工作总结](./personal-experience/four-year-work-in-tencent-summary.md)
20 | - [我在滴滴和头条的两年后端研发工作经验分享](./personal-experience/two-years-of-back-end-develop--experience-in-didi-and-toutiao.md)
21 | - [一个中科大差生的 8 年程序员工作总结](./personal-experience/8-years-programmer-work-summary.md)
22 | - [华为 OD 275 天后,我进了腾讯!](./personal-experience/huawei-od-275-days.md)
23 |
24 | ## 程序员
25 |
26 | - [程序员最该拿的几种高含金量证书](./programmer/high-value-certifications-for-programmers.md)
27 | - [程序员怎样出版一本技术书](./programmer/how-do-programmers-publish-a-technical-book.md)
28 | - [程序员高效出书避坑和实践指南](./programmer/efficient-book-publishing-and-practice-guide.md)
29 |
30 | ## 面试
31 |
32 | - [斩获 20+ 大厂 offer 的面试经验分享](./interview/the-experience-of-get-offer-from-over-20-big-companies.md)
33 | - [一位大龄程序员所经历的面试的历炼和思考](./interview/the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer.md)
34 | - [从面试官和候选者的角度谈如何准备技术初试](./interview/technical-preliminary-preparation.md)
35 | - [包装严重的 IT 行业,作为面试官,我是如何甄别应聘者的包装程度](./interview/screen-candidates-for-packaging.md)
36 | - [普通人的春招总结(阿里、腾讯 offer)](./interview/summary-of-spring-recruitment.md)
37 | - [2021 校招我的个人经历和经验](./interview/my-personal-experience-in-2021.md)
38 | - [如何在技术初试中考察程序员的技术能力](./interview/how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology.md)
39 | - [阿里技术面试的一些秘密](./interview/some-secrets-about-alibaba-interview.md)
40 |
41 | ## 工作
42 |
43 | - [新入职一家公司如何快速进入工作状态](./work/get-into-work-mode-quickly-when-you-join-a-company.md)
44 | - [32 条总结教你提升职场经验](./work/32-tips-improving-career.md)
45 | - [聊聊大厂的绩效考核](./work/employee-performance.md)
46 |
47 |
48 |
--------------------------------------------------------------------------------
/docs/java/jvm/jvm-in-action.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: JVM线上问题排查和性能调优案例
3 | category: Java
4 | tag:
5 | - JVM
6 | ---
7 |
8 | JVM 线上问题排查和性能调优也是面试常问的一个问题,尤其是社招中大厂的面试。
9 |
10 | 这篇文章,我会分享一些我看到的相关的案例。
11 |
12 | 下面是正文。
13 |
14 | [一次线上 OOM 问题分析 - 艾小仙 - 2023](https://juejin.cn/post/7205141492264976445)
15 |
16 | - **现象**:线上某个服务有接口非常慢,通过监控链路查看发现,中间的 GAP 时间非常大,实际接口并没有消耗很多时间,并且在那段时间里有很多这样的请求。
17 | - **分析**:使用 JDK 自带的`jvisualvm`分析 dump 文件(MAT 也能分析)。
18 | - **建议**:对于 SQL 语句,如果监测到没有`where`条件的全表查询应该默认增加一个合适的`limit`作为限制,防止这种问题拖垮整个系统
19 | - **资料**:[实战案例:记一次 dump 文件分析历程转载 - HeapDump - 2022](https://heapdump.cn/article/3489050)。
20 |
21 | [生产事故-记一次特殊的 OOM 排查 - 程语有云 - 2023](https://www.cnblogs.com/mylibs/p/production-accident-0002.html)
22 |
23 | - **现象**:网络没有问题的情况下,系统某开放接口从 2023 年 3 月 10 日 14 时许开始无法访问和使用。
24 | - **临时解决办法**:紧急回滚至上一稳定版本。
25 | - **分析**:使用 MAT (Memory Analyzer Tool)工具分析 dump 文件。
26 | - **建议**:正常情况下,`-Xmn`参数(控制 Young 区的大小)总是应当小于`-Xmx`参数(控制堆内存的最大大小),否则就会触发 OOM 错误。
27 | - **资料**:[最重要的 JVM 参数总结 - JavaGuide - 2023](https://javaguide.cn/java/jvm/jvm-parameters-intro.html)
28 |
29 | [一次大量 JVM Native 内存泄露的排查分析(64M 问题) - 掘金 - 2022](https://juejin.cn/post/7078624931826794503)
30 |
31 | - **现象**:线上项目刚启动完使用 top 命令查看 RES 占用了超过 1.5G。
32 | - **分析**:整个分析流程用到了较多工作,可以跟着作者思路一步一步来,值得学习借鉴。
33 | - **建议**:远离 Hibernate。
34 | - **资料**:[Linux top 命令里的内存相关字段(VIRT, RES, SHR, CODE, DATA)](https://liam.page/2020/07/17/memory-stat-in-TOP/)
35 |
36 | [YGC 问题排查,又让我涨姿势了! - IT 人的职场进阶 - 2021](https://www.heapdump.cn/article/1661497)
37 |
38 | - **现象**:广告服务在新版本上线后,收到了大量的服务超时告警。
39 | - **分析**:使用 MAT (Memory Analyzer Tool) 工具分析 dump 文件。
40 | - **建议**:学会 YGC(Young GC) 问题的排查思路,掌握 YGC 的相关知识点。
41 |
42 | [听说 JVM 性能优化很难?今天我小试了一把! - 陈树义 - 2021](https://shuyi.tech/archives/have-a-try-in-jvm-combat)
43 |
44 | 通过观察 GC 频率和停顿时间,来进行 JVM 内存空间调整,使其达到最合理的状态。调整过程记得小步快跑,避免内存剧烈波动影响线上服务。 这其实是最为简单的一种 JVM 性能调优方式了,可以算是粗调吧。
45 |
46 | [你们要的线上 GC 问题案例来啦 - 编了个程 - 2021](https://mp.weixin.qq.com/s/df1uxHWUXzhErxW1sZ6OvQ)
47 |
48 | - **案例 1**:使用 guava cache 的时候,没有设置最大缓存数量和弱引用,导致频繁触发 Young GC
49 | - **案例 2**: 对于一个查询和排序分页的 SQL,同时这个 SQL 需要 join 多张表,在分库分表下,直接调用 SQL 性能很差。于是,查单表,再在内存排序分页,用了一个 List 来保存数据,而有些数据量大,造成了这个现象。
50 |
51 | [Java 中 9 种常见的 CMS GC 问题分析与解决 - 美团技术团 - 2020](https://tech.meituan.com/2020/11/12/java-9-cms-gc.html)
52 |
53 | 这篇文章共 2w+ 字,详细介绍了 GC 基础,总结了 CMS GC 的一些常见问题分析与解决办法。
54 |
55 | [给祖传系统做了点 GC 调优,暂停时间降低了 90% - 京东云技术团队 - 2023](https://juejin.cn/post/7311623433817571365)
56 |
57 | 这篇文章提到了一个在规则引擎系统中遇到的 GC(垃圾回收)问题,主要表现为系统在启动后发生了一次较长的 Young GC(年轻代垃圾回收)导致性能下降。经过分析,问题的核心在于动态对象年龄判定机制,它导致了过早的对象晋升,引起了长时间的垃圾回收。
58 |
59 |
60 |
--------------------------------------------------------------------------------
/docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 某培训机构盗我文章做成视频还上了B站热门
3 | category: 走近作者
4 | tag:
5 | - 杂谈
6 | ---
7 |
8 | 时间回到 2021-02-25,我在刷哔哩哔哩的时候发现,哔哩哔哩某 UP 主(某培训机构),擅自将我在知乎的一个回答做成了视频。
9 |
10 | 原滋原味啊!我艹。甚至,连我开头的自我调侃还加上了!真的牛皮!
11 |
12 | 你盗我原创,视频你用心做好点也行啊!至少也可以让这么优质的内容得到传播嘛!
13 |
14 | 结果,好家伙,视频做的像坨屎一样,配音也贼违和!
15 |
16 | 麻烦这个培训机构看到这篇文章之后可以考虑换一个人做类似恶心的事情哈!这人完全没脑子啊!
17 |
18 | 
19 |
20 | 
21 |
22 | 
23 |
24 | 
25 |
26 | 我随便找了一个视频看,发现也还是盗用别人的原创。
27 |
28 | 
29 |
30 | 
31 |
32 | 其他的视频就不用多看了,是否还是剽窃别人的原创,原封不动地做成视频,大家心里应该有数。
33 |
34 | 他们这样做的目的就是一个:**引流到自己的 QQ 群,然后忽悠你买课程。**
35 |
36 | 我并不认为是这完全都是培训机构的问题。培训机构的员工为了流量而做这种恶心的事情,也导致了现在这种事情被越来越频繁地发生。
37 |
38 | 所以,你会发现,哔哩哔哩和知乎上有越来越多培训机构的小号,到处剽窃原创,盗发。
39 |
40 | 我身边很多原创号主的文章都经常被某些培训机构盗发。
41 |
42 | 有时候真的会比较生气,毕竟你自己辛辛苦苦的原创,别人复制粘贴一下就白嫖了!
43 |
44 | 但是,我相信,这种靠剽窃别人原创来吸引流量的行为,终究只是跳梁小丑的行为罢了!
45 |
46 | 只有那些用心输出内容的创作者,才能走的更远,更安稳!
47 |
48 | 后来,我在我的公众号上发了一篇名为[《好家伙!某培训机构盗我文章做成视频还上了热门》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247500005&idx=1&sn=7351e22619654492d3cf567bff9d87f0&chksm=cea18f2ef9d606384e0265b9318e004646c03b8a69f2801698d2f9e0e6bdfec0a1185ac3ab17&token=2146952532&lang=zh_CN&scene=21#wechat_redirect) 的文章,吐槽自己的原创被某机构白嫖。
49 |
50 | 谁能想到,培训机构的人竟然找人来让我删文章了!讲真,这俩人是真的奇葩啊!
51 |
52 | 
53 |
54 | 
55 |
56 | 还让我格局大点?我去你丫的!明明就是我的原创,你自己不删,反而找人联系我删除!有脑子不?
57 |
58 | 其实,我这人是比较好说话的,现实生活中脾气也是出了名的好(前提是没有触犯到我的原则的情况)。
59 |
60 | 搞笑的是!他们在让我删文的同时,他们 B 站盗发的视频还都在,还在继续为他们引流。
61 |
62 | 
63 |
64 | 
65 |
66 | 如果他们把账号注销了,我或许还能考虑放一手。但是,文章是肯定不会删的。
67 |
68 | 现在,看后续情况吧!我随时可以动用法律来维护自己的权益,只是看我想不想,毕竟也挺麻烦对吧!
69 |
70 | 大家不用担心,这都是小事,我女朋友就是学法律的,国内的某法学双一流学校。
71 |
72 | 咱不怕事!凎!!!
73 |
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/read-and-write-separation.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/high-availability/high-availability-system-design.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 高可用系统设计指南
3 | category: 高可用
4 | icon: design
5 | ---
6 |
7 | ## 什么是高可用?可用性的判断标准是啥?
8 |
9 | 高可用描述的是一个系统在大部分时间都是可用的,可以为我们提供服务的。高可用代表系统即使在发生硬件故障或者系统升级的时候,服务仍然是可用的。
10 |
11 | 一般情况下,我们使用多少个 9 来评判一个系统的可用性,比如 99.9999% 就是代表该系统在所有的运行时间中只有 0.0001% 的时间是不可用的,这样的系统就是非常非常高可用的了!当然,也会有系统如果可用性不太好的话,可能连 9 都上不了。
12 |
13 | 除此之外,系统的可用性还可以用某功能的失败次数与总的请求次数之比来衡量,比如对网站请求 1000 次,其中有 10 次请求失败,那么可用性就是 99%。
14 |
15 | ## 哪些情况会导致系统不可用?
16 |
17 | 1. 黑客攻击;
18 | 2. 硬件故障,比如服务器坏掉。
19 | 3. 并发量/用户请求量激增导致整个服务宕掉或者部分服务不可用。
20 | 4. 代码中的坏味道导致内存泄漏或者其他问题导致程序挂掉。
21 | 5. 网站架构某个重要的角色比如 Nginx 或者数据库突然不可用。
22 | 6. 自然灾害或者人为破坏。
23 | 7. ……
24 |
25 | ## 有哪些提高系统可用性的方法?
26 |
27 | ### 注重代码质量,测试严格把关
28 |
29 | 我觉得这个是最最最重要的,代码质量有问题比如比较常见的内存泄漏、循环依赖都是对系统可用性极大的损害。大家都喜欢谈限流、降级、熔断,但是我觉得从代码质量这个源头把关是首先要做好的一件很重要的事情。如何提高代码质量?比较实际可用的就是 CodeReview,不要在乎每天多花的那 1 个小时左右的时间,作用可大着呢!
30 |
31 | 另外,安利几个对提高代码质量有实际效果的神器:
32 |
33 | - [Sonarqube](https://www.sonarqube.org/);
34 | - Alibaba 开源的 Java 诊断工具 [Arthas](https://arthas.aliyun.com/doc/);
35 | - [阿里巴巴 Java 代码规范](https://github.com/alibaba/p3c)(Alibaba Java Code Guidelines);
36 | - IDEA 自带的代码分析等工具。
37 |
38 | ### 使用集群,减少单点故障
39 |
40 | 先拿常用的 Redis 举个例子!我们如何保证我们的 Redis 缓存高可用呢?答案就是使用集群,避免单点故障。当我们使用一个 Redis 实例作为缓存的时候,这个 Redis 实例挂了之后,整个缓存服务可能就挂了。使用了集群之后,即使一台 Redis 实例挂了,不到一秒就会有另外一台 Redis 实例顶上。
41 |
42 | ### 限流
43 |
44 | 流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。——来自 [alibaba-Sentinel](https://github.com/alibaba/Sentinel "Sentinel") 的 wiki。
45 |
46 | ### 超时和重试机制设置
47 |
48 | 一旦用户请求超过某个时间的得不到响应,就抛出异常。这个是非常重要的,很多线上系统故障都是因为没有进行超时设置或者超时设置的方式不对导致的。我们在读取第三方服务的时候,尤其适合设置超时和重试机制。一般我们使用一些 RPC 框架的时候,这些框架都自带的超时重试的配置。如果不进行超时设置可能会导致请求响应速度慢,甚至导致请求堆积进而让系统无法再处理请求。重试的次数一般设为 3 次,再多次的重试没有好处,反而会加重服务器压力(部分场景使用失败重试机制会不太适合)。
49 |
50 | ### 熔断机制
51 |
52 | 超时和重试机制设置之外,熔断机制也是很重要的。 熔断机制说的是系统自动收集所依赖服务的资源使用情况和性能指标,当所依赖的服务恶化或者调用失败次数达到某个阈值的时候就迅速失败,让当前系统立即切换依赖其他备用服务。 比较常用的流量控制和熔断降级框架是 Netflix 的 Hystrix 和 alibaba 的 Sentinel。
53 |
54 | ### 异步调用
55 |
56 | 异步调用的话我们不需要关心最后的结果,这样我们就可以用户请求完成之后就立即返回结果,具体处理我们可以后续再做,秒杀场景用这个还是蛮多的。但是,使用异步之后我们可能需要 **适当修改业务流程进行配合**,比如**用户在提交订单之后,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功**。除了可以在程序中实现异步之外,我们常常还使用消息队列,消息队列可以通过异步处理提高系统性能(削峰、减少响应所需时间)并且可以降低系统耦合性。
57 |
58 | ### 使用缓存
59 |
60 | 如果我们的系统属于并发量比较高的话,如果我们单纯使用数据库的话,当大量请求直接落到数据库可能数据库就会直接挂掉。使用缓存缓存热点数据,因为缓存存储在内存中,所以速度相当地快!
61 |
62 | ### 其他
63 |
64 | - **核心应用和服务优先使用更好的硬件**
65 | - **监控系统资源使用情况增加报警设置。**
66 | - **注意备份,必要时候回滚。**
67 | - **灰度发布:** 将服务器集群分成若干部分,每天只发布一部分机器,观察运行稳定没有故障,第二天继续发布一部分机器,持续几天才把整个集群全部发布完毕,期间如果发现问题,只需要回滚已发布的一部分服务器即可
68 | - **定期检查/更换硬件:** 如果不是购买的云服务的话,定期还是需要对硬件进行一波检查的,对于一些需要更换或者升级的硬件,要及时更换或者升级。
69 | - ……
70 |
71 |
72 |
--------------------------------------------------------------------------------
/docs/cs-basics/algorithms/classical-algorithm-problems-recommendations.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 经典算法思想总结(含LeetCode题目推荐)
3 | category: 计算机基础
4 | tag:
5 | - 算法
6 | ---
7 |
8 | ## 贪心算法
9 |
10 | ### 算法思想
11 |
12 | 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。
13 |
14 | ### 一般解题步骤
15 |
16 | - 将问题分解为若干个子问题
17 | - 找出适合的贪心策略
18 | - 求解每一个子问题的最优解
19 | - 将局部最优解堆叠成全局最优解
20 |
21 | ### LeetCode
22 |
23 | 455.分发饼干:
24 |
25 | 121.买卖股票的最佳时机:
26 |
27 | 122.买卖股票的最佳时机 II:
28 |
29 | 55.跳跃游戏:
30 |
31 | 45.跳跃游戏 II:
32 |
33 | ## 动态规划
34 |
35 | ### 算法思想
36 |
37 | 动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。
38 |
39 | 经典题目:01 背包、完全背包
40 |
41 | ### 一般解题步骤
42 |
43 | - 确定 dp 数组(dp table)以及下标的含义
44 | - 确定递推公式
45 | - dp 数组如何初始化
46 | - 确定遍历顺序
47 | - 举例推导 dp 数组
48 |
49 | ### LeetCode
50 |
51 | 509.斐波那契数:
52 |
53 | 746.使用最小花费爬楼梯:
54 |
55 | 416.分割等和子集:
56 |
57 | 518.零钱兑换:
58 |
59 | 647.回文子串:
60 |
61 | 516.最长回文子序列:
62 |
63 | ## 回溯算法
64 |
65 | ### 算法思想
66 |
67 | 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条
68 |
69 | 件时,就“回溯”返回,尝试别的路径。其本质就是穷举。
70 |
71 | 经典题目:8 皇后
72 |
73 | ### 一般解题步骤
74 |
75 | - 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。
76 | - 确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间 。
77 | - 以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。
78 |
79 | ### leetcode
80 |
81 | 77.组合:
82 |
83 | 39.组合总和:
84 |
85 | 40.组合总和 II:
86 |
87 | 78.子集:
88 |
89 | 90.子集 II:
90 |
91 | 51.N 皇后:
92 |
93 | ## 分治算法
94 |
95 | ### 算法思想
96 |
97 | 将一个规模为 N 的问题分解为 K 个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
98 |
99 | 经典题目:二分查找、汉诺塔问题
100 |
101 | ### 一般解题步骤
102 |
103 | - 将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
104 | - 若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
105 | - 将各个子问题的解合并为原问题的解。
106 |
107 | ### LeetCode
108 |
109 | 108.将有序数组转换成二叉搜索数:
110 |
111 | 148.排序列表:
112 |
113 | 23.合并 k 个升序链表:
114 |
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/read-and-write-separation-proxy.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/high-performance/images/read-and-write-separation-and-library-subtable/two-forms-of-sub-table.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/distributed-system/images/distributed-id/id-after-the-sub-table-not-conflict.drawio:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/docs/zhuanlan/java-mian-shi-zhi-bei.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 《Java 面试指北》
3 | category: 知识星球
4 | star: 5
5 | ---
6 |
7 | 我花费了三年的时间,写了一本针对 Java 面试的《Java 面试指北》,内容质量非常高,非常适合准备 Java 面试的朋友使用!
8 |
9 | 目前的成绩:累计阅读 **270w+** ,点赞 **3550+** ,评论 **1130+** (几乎每一条提问类型的评论我看到后都会用心回复)。
10 |
11 | 
12 |
13 | ## 介绍
14 |
15 | **《Java 面试指北》** 是我的[知识星球](../about-the-author/zhishixingqiu-two-years.md)的一个内部小册,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补。相比于开源版本来说,《Java 面试指北》添加了下面这些内容(不仅仅是这些内容):
16 |
17 | - 17+ 篇文章手把手教你如何准备面试,50+ 准备面试过程中的常见问题详细解读,让你更高效地准备 Java 面试。
18 | - 更全面的八股文面试题(系统设计、场景题、常见框架、分布式&微服务、高并发 ……)。
19 | - 优质面经精选(相比于牛客网或者其他网站的面经,《Java 面试指北》中整理的面经质量更高,并且,我会提供优质的参考资料)。
20 | - 技术面试题自测(高效准备技术八股文的技巧之一在于多多自测,查漏补缺)。
21 | - 练级攻略(有助于个人成长的经验分享)。
22 |
23 | 《Java 面试指北》 会根据每一年的面试情况对内容进行更新完善,保证内容质量的时效性。并且,只需要加入[知识星球](../about-the-author/zhishixingqiu-two-years.md)一次,即可永久获取《Java 面试指北》的访问权限,持续同步更新完善。
24 |
25 | ## 内容概览
26 |
27 | 
28 |
29 | ### 面试准备篇
30 |
31 | 在 **「面试准备篇」** ,我写了 17+ 篇文章手把手教你如何准备面试,50+ 准备面试过程中的常见问题详细解读。准备面试过程中常见的疑问这里都有解答,内容涵盖项目经验、简历编写、源码学习、算法准备、面试资源等等。
32 |
33 | 
34 |
35 | 另外,考虑到很多小伙伴缺少项目经历,我还推荐了很多小众但优质的实战项目,有视频也有开源项目,有业务系统,也有各种含金量比较高的轮子类项目。
36 |
37 | 
38 |
39 | ### 技术面试题篇
40 |
41 | **「技术面试题篇」** 的内容和 JavaGuide 开源版本互补,不仅仅包括最基本的 Java、常见框架等八股文,还包括系统设计、分布式、高并发等进阶内容。
42 |
43 | 
44 |
45 | ### 面经篇
46 |
47 | 古人云:“**他山之石,可以攻玉**” 。善于学习借鉴别人的面试的成功经验或者失败的教训,可以让自己少走许多弯路。
48 |
49 | **「面经篇」** 主要会分享一些高质量的 Java 后端面经,有校招的,也有社招的,有大厂的,也有中小厂的。
50 |
51 | 如果你是非科班的同学,也能在这些文章中找到对应的非科班的同学写的面经。
52 |
53 | 
54 |
55 | 相比于牛客网或者其他网站的面经,《Java 面试指北》中整理的面经质量更高,并且,我会提供优质的参考资料。
56 |
57 | 另外,[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)还有专门分享面经和面试题的专题,里面会分享很多优质的面经和面试题。
58 |
59 | 
60 |
61 | ### 技术面试题自测篇
62 |
63 | 为了让小伙伴们自测以检查自己的掌握情况,我还推出了 **「技术面试题自测」** 系列。不过,目前只更新了 Java 和数据库的自测,正在持续更新中。
64 |
65 | 
66 |
67 | 高效准备技术八股文的技巧之一在于多多自测,查漏补缺。
68 |
69 | ### 练级攻略篇
70 |
71 | **「练级攻略篇」** 这个系列主要内容一些有助于个人成长的经验分享。
72 |
73 | 
74 |
75 | 每一篇内容都非常干货,不少球友看了之后表示收获满满。不过,最重要的还是知行合一。
76 |
77 | ### 工作篇
78 |
79 | **「工作篇」** 这个系列主要内容是分享有助于个人以及职场发展的内容以及在工作中经常会遇到的问题。
80 |
81 | 
82 |
83 |
84 |
--------------------------------------------------------------------------------
/docs/about-the-author/feelings-after-one-month-of-induction-training.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 入职培训一个月后的感受
3 | category: 走近作者
4 | tag:
5 | - 个人经历
6 | ---
7 |
8 | 不知不觉已经入职一个多月了,在入职之前我没有在某个公司实习过或者工作过,所以很多东西刚入职工作的我来说还是比较新颖的。学校到职场的转变,带来了角色的转变,其中的差别因人而异。对我而言,在学校的时候课堂上老师课堂上教的东西,自己会根据自己的兴趣选择性接受,甚至很多课程你不想去上的话,还可以逃掉。到了公司就不一样了,公司要求你会的技能你不得不学,除非你不想干了。在学校的时候大部分人编程的目的都是为了通过考试或者找到一份好工作,真正靠自己兴趣支撑起来的很少,到了工作岗位之后我们编程更多的是因为工作的要求,相比于学校的来说会一般会更有挑战而且压力更大。在学校的时候,我们最重要的就是对自己负责,我们不断学习知识去武装自己,但是到了公司之后我们不光要对自己负责,更要对公司负责,毕竟公司出钱请你过来,不是让你一直 on beach 的。
9 |
10 | 刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows 确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外,Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
11 |
12 | 不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训,与往年不同的是,今年的培训多了中国本地班(TWU-C)。作为本地班的第一期学员,说句心里话还是很不错。8 周的培训,除了工作需要用到的基本技术比如 ES6、SpringBoot 等等之外,还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动,比如 Weekend Trip、 City Tour、Cake time 等等。最后三周还会有一个实际的模拟项目,这个项目基本和我们正式工作的实际项目差不多,我个人感觉很不错。目前这个项目已经正式完成了一个迭代,我觉得在做项目的过程中,收获最大的不是项目中使用的技术,而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
13 |
14 | ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责,Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责 5 - 6 个人。Trainer 不定期都会给我们最近表现的 Feedback (反馈) ,我个人觉得这个并不是这是走走形式,Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
15 |
16 | 另外,ThoughtWorks 也是一家非常提倡 Feedback (反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。
17 |
18 | 
19 |
20 | 工作之后,平时更新公众号、专栏还有维护 Github 的时间变少了。实际上,很多时候下班回来后,都有自己的时间来干自己的事情,但是自己也总是找工作太累或者时间比较零散的接口来推掉了。到了今天,翻看 Github 突然发现 14 天前别人在 Github 上给我提的 PR 我还没有处理。这一点确实是自己没有做好的地方,没有合理安排好自己的时间。实际上自己有很多想写的东西,后面会慢慢将他们提上日程。工作之后,更加发现下班后的几个小时如何度过确实很重要 ,如果你觉得自己没有完成好自己白天该做的工作的话,下班后你可以继续忙白天没有忙完的工作,如果白天的工作对于你游刃有余的话,下班回来之后,你大可去干自己感兴趣的事情,学习自己感兴趣的技术。做任何事情都要基于自身的基础,切不可好高骛远。
21 |
22 | 工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController`、`@Autowried`、`@Pathvairable`、`@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
23 |
24 | 这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。
25 |
--------------------------------------------------------------------------------
/docs/distributed-system/distributed-lock.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 分布式锁介绍
3 | category: 分布式
4 | ---
5 |
6 |
7 |
8 | 网上有很多分布式锁相关的文章,写了一个相对简洁易懂的版本,针对面试和工作应该够用了。
9 |
10 | 这篇文章我们先介绍一下分布式锁的基本概念。
11 |
12 | ## 为什么需要分布式锁?
13 |
14 | 在多线程环境中,如果多个线程同时访问共享资源(例如商品库存、外卖订单),会发生数据竞争,可能会导致出现脏数据或者系统问题,威胁到程序的正常运行。
15 |
16 | 举个例子,假设现在有 100 个用户参与某个限时秒杀活动,每位用户限购 1 件商品,且商品的数量只有 3 个。如果不对共享资源进行互斥访问,就可能出现以下情况:
17 |
18 | - 线程 1、2、3 等多个线程同时进入抢购方法,每一个线程对应一个用户。
19 | - 线程 1 查询用户已经抢购的数量,发现当前用户尚未抢购且商品库存还有 1 个,因此认为可以继续执行抢购流程。
20 | - 线程 2 也执行查询用户已经抢购的数量,发现当前用户尚未抢购且商品库存还有 1 个,因此认为可以继续执行抢购流程。
21 | - 线程 1 继续执行,将库存数量减少 1 个,然后返回成功。
22 | - 线程 2 继续执行,将库存数量减少 1 个,然后返回成功。
23 | - 此时就发生了超卖问题,导致商品被多卖了一份。
24 |
25 | 
26 |
27 | 为了保证共享资源被安全地访问,我们需要使用互斥操作对共享资源进行保护,即同一时刻只允许一个线程访问共享资源,其他线程需要等待当前线程释放后才能访问。这样可以避免数据竞争和脏数据问题,保证程序的正确性和稳定性。
28 |
29 | **如何才能实现共享资源的互斥访问呢?** 锁是一个比较通用的解决方案,更准确点来说是悲观锁。
30 |
31 | 悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,**共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程**。
32 |
33 | 对于单机多线程来说,在 Java 中,我们通常使用 `ReentrantLock` 类、`synchronized` 关键字这类 JDK 自带的 **本地锁** 来控制一个 JVM 进程内的多个线程对本地共享资源的访问。
34 |
35 | 下面是我对本地锁画的一张示意图。
36 |
37 | 
38 |
39 | 从图中可以看出,这些线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到本地锁访问共享资源。
40 |
41 | 分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。于是,**分布式锁** 就诞生了。
42 |
43 | 举个例子:系统的订单服务一共部署了 3 份,都对外提供服务。用户下订单之前需要检查库存,为了防止超卖,这里需要加锁以实现对检查库存操作的同步访问。由于订单服务位于不同的 JVM 进程中,本地锁在这种情况下就没办法正常工作了。我们需要用到分布式锁,这样的话,即使多个线程不在同一个 JVM 进程中也能获取到同一把锁,进而实现共享资源的互斥访问。
44 |
45 | 下面是我对分布式锁画的一张示意图。
46 |
47 | 
48 |
49 | 从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。
50 |
51 | ## 分布式锁应该具备哪些条件?
52 |
53 | 一个最基本的分布式锁需要满足:
54 |
55 | - **互斥**:任意一个时刻,锁只能被一个线程持有。
56 | - **高可用**:锁服务是高可用的,当一个锁服务出现问题,能够自动切换到另外一个锁服务。并且,即使客户端的释放锁的代码逻辑出现问题,锁最终一定还是会被释放,不会影响其他线程对共享资源的访问。这一般是通过超时机制实现的。
57 | - **可重入**:一个节点获取了锁之后,还可以再次获取锁。
58 |
59 | 除了上面这三个基本条件之外,一个好的分布式锁还需要满足下面这些条件:
60 |
61 | - **高性能**:获取和释放锁的操作应该快速完成,并且不应该对整个系统的性能造成过大影响。
62 | - **非阻塞**:如果获取不到锁,不能无限期等待,避免对系统正常运行造成影响。
63 |
64 | ## 分布式锁的常见实现方式有哪些?
65 |
66 | 常见分布式锁实现方案如下:
67 |
68 | - 基于关系型数据库比如 MySQL 实现分布式锁。
69 | - 基于分布式协调服务 ZooKeeper 实现分布式锁。
70 | - 基于分布式键值存储系统比如 Redis 、Etcd 实现分布式锁。
71 |
72 | 关系型数据库的方式一般是通过唯一索引或者排他锁实现。不过,一般不会使用这种方式,问题太多比如性能太差、不具备锁失效机制。
73 |
74 | 基于 ZooKeeper 或者 Redis 实现分布式锁这两种实现方式要用的更多一些,我专门写了一篇文章来详细介绍这两种方案:[分布式锁常见实现方案总结](./distributed-lock-implementations.md)。
75 |
76 | ## 总结
77 |
78 | 这篇文章我们主要介绍了:
79 |
80 | - 分布式锁的用途:分布式系统下,不同的服务/客户端通常运行在独立的 JVM 进程上。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。
81 | - 分布式锁的应该具备的条件:互斥、高可用、可重入、高性能、非阻塞。
82 | - 分布式锁的常见实现方式:关系型数据库比如 MySQL、分布式协调服务 ZooKeeper、分布式键值存储系统比如 Redis 、Etcd 。
83 |
84 |
85 |
--------------------------------------------------------------------------------
/docs/interview-preparation/key-points-of-interview.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Java面试重点总结(重要)
3 | category: 面试准备
4 | icon: star
5 | ---
6 |
7 | ::: tip 友情提示
8 | 本文节选自 **[《Java 面试指北》](../zhuanlan/java-mian-shi-zhi-bei.md)**。这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ……)、优质面经等内容。
9 | :::
10 |
11 | ## Java 后端面试哪些知识点是重点?
12 |
13 | **准备面试的时候,具体哪些知识点是重点呢?如何把握重点?**
14 |
15 | 给你几点靠谱的建议:
16 |
17 | 1. Java 基础、集合、并发、MySQL、Redis 、Spring、Spring Boot 这些 Java 后端开发必备的知识点(MySQL + Redis >= Java > Spring + Spring Boot)。大厂以及中小厂的面试问的比较多的就是这些知识点。Spring 和 Spring Boot 这俩框架类的知识点相对前面的知识点来说重要性要稍低一些,但一般面试也会问一些,尤其是中小厂。并发知识一般中大厂提问更多也更难,尤其是大厂喜欢深挖底层,很容易把人问倒。计算机基础相关的内容会在下面提到。
18 | 2. 你的项目经历涉及到的知识点是重中之重,有水平的面试官都是会根据你的项目经历来问的。举个例子,你的项目经历使用了 Redis 来做限流,那 Redis 相关的八股文(比如 Redis 常见数据结构)以及限流相关的八股文(比如常见的限流算法)你就应该多花更多心思来搞懂吃透!你把项目经历上的知识点吃透之后,再把你简历上哪些写熟练掌握的技术给吃透,最后再去花时间准备其他知识点。
19 | 3. 针对自身找工作的需求,你又可以适当地调整复习的重点。像中小厂一般问计算机基础比较少一些,有些大厂比如字节比较重视计算机基础尤其是算法。这样的话,如果你的目标是中小厂的话,计算机基础就准备面试来说不是那么重要了。如果复习时间不够的话,可以暂时先放放,腾出时间给其他重要的知识点。
20 | 4. 一般校招的面试不会强制要求你会分布式/微服务、高并发的知识(不排除个别岗位有这方面的硬性要求),所以到底要不要掌握还是要看你个人当前的实际情况。如果你会这方面的知识的话,对面试相对来说还是会更有利一些(想要让项目经历有亮点,还是得会一些性能优化的知识。性能优化的知识这也算是高并发知识的一个小分支了)。如果你的技能介绍或者项目经历涉及到分布式/微服务、高并发的知识,那建议你尽量也要抽时间去认真准备一下,面试中很可能会被问到,尤其是项目经历用到的时候。不过,也还是主要准备写在简历上的那些知识点就好。
21 | 5. JVM 相关的知识点,一般是大厂(例如美团、阿里)和一些不错的中厂(例如携程、顺丰、招银网络)才会问到,面试国企、差一点的中厂和小厂就没必要准备了。JVM 面试中比较常问的是 [Java 内存区域](https://javaguide.cn/java/jvm/memory-area.html)、[JVM 垃圾回收](https://javaguide.cn/java/jvm/jvm-garbage-collection.html)、[类加载器和双亲委派模型](https://javaguide.cn/java/jvm/classloader.html) 以及 JVM 调优和问题排查(我之前分享过一些[常见的线上问题案例](https://t.zsxq.com/0bsAac47U),里面就有 JVM 相关的)。
22 | 6. 不同的大厂面试侧重点也会不同。比如说你要去阿里这种公司的话,项目和八股文就是重点,阿里笔试一般会有代码题,进入面试后就很少问代码题了,但是对原理性的问题问的比较深,经常会问一些你对技术的思考。再比如说你要面试字节这种公司,那计算机基础,尤其是算法是重点,字节的面试十分注重代码功底,有时候开始面试就会直接甩给你一道代码题,写出来再谈别的。也会问面试八股文,以及项目,不过,相对来说要少很多。建议你看一下这篇文章 [为了解开互联网大厂秋招内幕,我把他们全面了一遍](https://mp.weixin.qq.com/s/pBsGQNxvRupZeWt4qZReIA),了解一下常见大厂的面试题侧重点。
23 | 7. 多去找一些面经看看,尤其你目标公司或者类似公司对应岗位的面经。这样可以实现针对性的复习,还能顺便自测一波,检查一下自己的掌握情况。
24 |
25 | 看似 Java 后端八股文很多,实际把复习范围一缩小,重要的东西就是那些。考虑到时间问题,你不可能连一些比较冷门的知识点也给准备了。这没必要,主要精力先放在那些重要的知识点即可。
26 |
27 | ## 如何更高效地准备八股文?
28 |
29 | 对于技术八股文来说,尽量不要死记硬背,这种方式非常枯燥且对自身能力提升有限!但是!想要一点不背是不太现实的,只是说要结合实际应用场景和实战来理解记忆。
30 |
31 | 我一直觉得面试八股文最好是和实际应用场景和实战相结合。很多同学现在的方向都错了,上来就是直接背八股文,硬生生学成了文科,那当然无趣了。
32 |
33 | 举个例子:你的项目中需要用到 Redis 来做缓存,你对照着官网简单了解并实践了简单使用 Redis 之后,你去看了 Redis 对应的八股文。你发现 Redis 可以用来做限流、分布式锁,于是你去在项目中实践了一下并掌握了对应的八股文。紧接着,你又发现 Redis 内存不够用的情况下,还能使用 Redis Cluster 来解决,于是你就又去实践了一下并掌握了对应的八股文。
34 |
35 | **一定要记住你的主要目标是理解和记关键词,而不是像背课文一样一字一句地记下来,这样毫无意义!效率最低,对自身帮助也最小!**
36 |
37 | 还要注意适当“投机取巧”,不要单纯死记八股,有些技术方案的实现有很多种,例如分布式 ID、分布式锁、幂等设计,想要完全记住所有方案不太现实,你就重点记忆你项目的实现方案以及选择该种实现方案的原因就好了。当然,其他方案还是建议你简单了解一下,不然也没办法和你选择的方案进行对比。
38 |
39 | 想要检测自己是否搞懂或者加深印象,记录博客或者用自己的理解把对应的知识点讲给别人听也是一个不错的选择。
40 |
41 | 另外,准备八股文的过程中,强烈建议你花个几个小时去根据你的简历(主要是项目经历部分)思考一下哪些地方可能被深挖,然后把你自己的思考以面试问题的形式体现出来。面试之后,你还要根据当下的面试情况复盘一波,对之前自己整理的面试问题进行完善补充。这个过程对于个人进一步熟悉自己的简历(尤其是项目经历)部分,非常非常有用。这些问题你也一定要多花一些时间搞懂吃透,能够流畅地表达出来。面试问题可以参考 [Java 面试常见问题总结(2024 最新版)](https://t.zsxq.com/0eRq7EJPy),记得根据自己项目经历去深入拓展即可!
42 |
43 | 最后,准备技术面试的同学一定要定期复习(自测的方式非常好),不然确实会遗忘的。
44 |
--------------------------------------------------------------------------------
/docs/high-quality-technical-articles/interview/some-secrets-about-alibaba-interview.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 阿里技术面试的一些秘密
3 | category: 技术文章精选集
4 | author: 龙叔
5 | tag:
6 | - 面试
7 | ---
8 |
9 | > **推荐语**:详细介绍了求职者在面试中应该具备哪些能力才会有更大概率脱颖而出。
10 | >
11 | > **原文地址:**
12 |
13 | 最近我的工作稍微轻松些,就被安排去校招面试了
14 |
15 | 当时还是有些**激动**的,以前都是被面试的,现在我自己也成为一个面试别人的面试官
16 |
17 | 接下来就谈谈我的面试心得(谈谈阿里面试的秘籍)
18 |
19 | ## 我是怎么筛选简历的?
20 |
21 | 面试之前都是要筛选简历,这个大家应该知道
22 |
23 | 阿里对待招聘非常负责任,面试官必须对每位同学的简历进行查看和筛选,如果不合适还需要写清楚理由
24 |
25 | 对于校招生来说,第一份工作非常重要,而且校招的面试机会也只有一次,一旦收到大家的简历意味着大家非常认可和喜爱阿里这家公司
26 |
27 | 所以我们对每份简历都会认真看,大家可以非常放心,不会无缘无故挂掉大家的简历
28 |
29 | 尽管我们报以非常负责任的态度,但有些同学们的简历实在是难以下看
30 |
31 | 关于如何写简历,我之前写过类似的文章,这里就把之前的文章放这里让大家看看 [一份好的简历应该有哪些内容](https://mp.weixin.qq.com/s?__biz=MzI4MDYzNDc1Mg==&mid=2247484010&idx=1&sn=afbe90c8446f5f21631cae750431d3ee&scene=21#wechat_redirect)
32 |
33 | 在筛选简历的时候会有以下信息非常重要,大家一定要认真写
34 |
35 | - **项目经历**,具体写法可以看上面提到的文章
36 | - **个人含金量比较高的奖项**,比如 ACM 奖牌、计算机竞赛等
37 | - **个人技能** 这块会看,但是大多数简历写法都差不多,尽量写得**言简意赅**
38 | - **重要期刊论文发表、开源项目** 加分项
39 |
40 | 这些信息非常重要,我筛选简历的时候这些信息占整份简历的比重 4/5 左右
41 |
42 | ## 面试的时候我会注重哪些方面?
43 |
44 | ### **表达要清楚**
45 |
46 | 这点是硬伤,在面试的时候有些同学半天说不清楚自己做的项目,我都在替你着急
47 |
48 | 描述项目有个简单的方法论,我自己总结的 大家看看适不适合自己
49 |
50 | - 最好言简意赅的描述一下你的项目背景,让面试官很快知道项目干了啥(让面试官很快对项目感兴趣)
51 | - 说下项目用了哪些技术,做技术的用了哪些技术得说清楚,面试官会对你的技术比较感兴趣
52 | - 解决了什么问题,做项目肯定是为了解决问题,总不能为了做项目而做项目吧(解决问题的能力非常重要)
53 | - 遇到哪些难题,如何突破这些难题,项目遇到困难问题很正常,突破困难才是一次好的成长
54 | - 项目还有哪些完善的地方,不可能设计出完美的执行方案,有待改进说明你对项目认识深刻,思考深入
55 |
56 | 一场面试时间一般 60—80 分钟,好的表达有助于彼此之间了解更多的问题
57 |
58 | ### **基础知识要扎实**
59 |
60 | 校招非常注重基础知识,所以这块问的问题比较多,我一般会结合你项目去问,看看同学对技术是停留在用的阶段还是有自己的深入思考
61 |
62 | 每个方向对基础知识要求不同,但有些基础知识是通用的
63 |
64 | 比如**数据结构与算法**、**操作系统**、**计算机网络** 等
65 |
66 | 这些基础技术知识一定要掌握扎实,技术岗位都会或多或少去问这些基础
67 |
68 | ### **动手能力很重要**
69 |
70 | action,action,action ,重要的事情说三遍,做技术的不可能光靠一张嘴,能落地才是最重要的
71 |
72 | 面试官除了问你基础知识和项目还会去考考你的动手能力,面试时间一般不会太长,根据岗位的不同一般会让同学们写一些算法题目
73 |
74 | 阿里面试,不会给你出非常变态的算法题目
75 |
76 | 主要还是考察大家的动手能力、思考问题的能力、数据结构的应用能力
77 |
78 | 在写代码的过程中,我也总结了自己的方法论:
79 |
80 | - 上来不要先写,审题、问清楚题目意图,不要自以为是的去理解思路,工作中 沟通需求、明确需求、提出质疑和建议是非常好的习惯
81 | - 接下来说思路 思路错了写到一半再去改会非常浪费时间
82 | - 描述清楚之后,先写代码思路的步骤注释,一边写注释,脑子里迭代一遍自己的思路是否正确,是否是最优解
83 | - 最后,代码规范
84 |
85 | ## 除了上面这些常规的方面
86 |
87 | 其实,现在面试已经非常**卷**了,上面说的这些很多都是 **八股文**
88 |
89 | 有些学生会拿到很多面试题目和答案,反复的去记忆,面试官问问题他就开始在脑子里面检索答案
90 |
91 | 我一般问几个问题就知道该学生是不是在背八股文了。
92 |
93 | 对于背八股文的同学,我真的非常难过。
94 |
95 | 尽管你背的很好,但不能给你过啊,得对得起自己职责,得对公司负责啊!
96 |
97 | 背的在好,不如理解一个知识点,理解一个知识点会有助于你去理解很多其他的知识点,很多知识点连起来就是一个知识体系。
98 |
99 | 当面试官问你体系中的任何一个问题,都可以把这个体系讲给他听,不是**背诵** 。
100 |
101 | 深入理解问题,我会比较关注。
102 |
103 | 我在面试过程中,会通过一个问题去问一串问题,慢慢就把整体体系串起来。
104 |
105 | 你的**比赛**和**论文**是你的亮点,这些东西是非常重要的加分项。
106 |
107 | 我也会在面试中穿插一些**开放性题目**,都是思考题 考验一个同学思考问题的方式。
108 |
109 | ## 最后
110 |
111 | 作为一个面试官,我很想对大家说,每个企业都非常渴望人才,都希望找到最适合企业发展的人
112 |
113 | 面试的时候面试官会尽量去挖掘你的价值。
114 |
115 | 但是,面试时间有限,同学们一定要在有限的时间里展现出自己的**能力**和**无限的潜力** 。
116 |
117 | 最后,祝愿优秀的你能找到自己理想的工作!
118 |
119 |
120 |
--------------------------------------------------------------------------------
/docs/database/redis/redis-delayed-task.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 如何基于Redis实现延时任务
3 | category: 数据库
4 | tag:
5 | - Redis
6 | ---
7 |
8 | 基于 Redis 实现延时任务的功能无非就下面两种方案:
9 |
10 | 1. Redis 过期事件监听
11 | 2. Redisson 内置的延时队列
12 |
13 | 面试的时候,你可以先说自己考虑了这两种方案,但最后发现 Redis 过期事件监听这种方案存在很多问题,因此你最终选择了 Redisson 内置的 DelayedQueue 这种方案。
14 |
15 | 这个时候面试官可能会追问你一些相关的问题,我们后面会提到,提前准备就好了。
16 |
17 | 另外,除了下面介绍到的这些问题之外,Redis 相关的常见问题建议你都复习一遍,不排除面试官会顺带问你一些 Redis 的其他问题。
18 |
19 | ### Redis 过期事件监听实现延时任务功能的原理?
20 |
21 | Redis 2.0 引入了发布订阅 (pub/sub) 功能。在 pub/sub 中,引入了一个叫做 **channel(频道)** 的概念,有点类似于消息队列中的 **topic(主题)**。
22 |
23 | pub/sub 涉及发布者(publisher)和订阅者(subscriber,也叫消费者)两个角色:
24 |
25 | - 发布者通过 `PUBLISH` 投递消息给指定 channel。
26 | - 订阅者通过`SUBSCRIBE`订阅它关心的 channel。并且,订阅者可以订阅一个或者多个 channel。
27 |
28 | 
29 |
30 | 在 pub/sub 模式下,生产者需要指定消息发送到哪个 channel 中,而消费者则订阅对应的 channel 以获取消息。
31 |
32 | Redis 中有很多默认的 channel,这些 channel 是由 Redis 本身向它们发送消息的,而不是我们自己编写的代码。其中,`__keyevent@0__:expired` 就是一个默认的 channel,负责监听 key 的过期事件。也就是说,当一个 key 过期之后,Redis 会发布一个 key 过期的事件到`__keyevent@__:expired`这个 channel 中。
33 |
34 | 我们只需要监听这个 channel,就可以拿到过期的 key 的消息,进而实现了延时任务功能。
35 |
36 | 这个功能被 Redis 官方称为 **keyspace notifications** ,作用是实时监控 Redis 键和值的变化。
37 |
38 | ### Redis 过期事件监听实现延时任务功能有什么缺陷?
39 |
40 | **1、时效性差**
41 |
42 | 官方文档的一段介绍解释了时效性差的原因,地址: 。
43 |
44 | 
45 |
46 | 这段话的核心是:过期事件消息是在 Redis 服务器删除 key 时发布的,而不是一个 key 过期之后就会就会直接发布。
47 |
48 | 我们知道常用的过期数据的删除策略就两个:
49 |
50 | 1. **惰性删除**:只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
51 | 2. **定期删除**:每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
52 |
53 | 定期删除对内存更加友好,惰性删除对 CPU 更加友好。两者各有千秋,所以 Redis 采用的是 **定期删除+惰性/懒汉式删除** 。
54 |
55 | 因此,就会存在我设置了 key 的过期时间,但到了指定时间 key 还未被删除,进而没有发布过期事件的情况。
56 |
57 | **2、丢消息**
58 |
59 | Redis 的 pub/sub 模式中的消息并不支持持久化,这与消息队列不同。在 Redis 的 pub/sub 模式中,发布者将消息发送给指定的频道,订阅者监听相应的频道以接收消息。当没有订阅者时,消息会被直接丢弃,在 Redis 中不会存储该消息。
60 |
61 | **3、多服务实例下消息重复消费**
62 |
63 | Redis 的 pub/sub 模式目前只有广播模式,这意味着当生产者向特定频道发布一条消息时,所有订阅相关频道的消费者都能够收到该消息。
64 |
65 | 这个时候,我们需要注意多个服务实例重复处理消息的问题,这会增加代码开发量和维护难度。
66 |
67 | ### Redisson 延迟队列原理是什么?有什么优势?
68 |
69 | Redisson 是一个开源的 Java 语言 Redis 客户端,提供了很多开箱即用的功能,比如多种分布式锁的实现、延时队列。
70 |
71 | 我们可以借助 Redisson 内置的延时队列 RDelayedQueue 来实现延时任务功能。
72 |
73 | Redisson 的延迟队列 RDelayedQueue 是基于 Redis 的 SortedSet 来实现的。SortedSet 是一个有序集合,其中的每个元素都可以设置一个分数,代表该元素的权重。Redisson 利用这一特性,将需要延迟执行的任务插入到 SortedSet 中,并给它们设置相应的过期时间作为分数。
74 |
75 | Redisson 使用 `zrangebyscore` 命令扫描 SortedSet 中过期的元素,然后将这些过期元素从 SortedSet 中移除,并将它们加入到就绪消息列表中。就绪消息列表是一个阻塞队列,有消息进入就会被监听到。这样做可以避免对整个 SortedSet 进行轮询,提高了执行效率。
76 |
77 | 相比于 Redis 过期事件监听实现延时任务功能,这种方式具备下面这些优势:
78 |
79 | 1. **减少了丢消息的可能**:DelayedQueue 中的消息会被持久化,即使 Redis 宕机了,根据持久化机制,也只可能丢失一点消息,影响不大。当然了,你也可以使用扫描数据库的方法作为补偿机制。
80 | 2. **消息不存在重复消费问题**:每个客户端都是从同一个目标队列中获取任务的,不存在重复消费的问题。
81 |
82 | 跟 Redisson 内置的延时队列相比,消息队列可以通过保障消息消费的可靠性、控制消息生产者和消费者的数量等手段来实现更高的吞吐量和更强的可靠性,实际项目中首选使用消息队列的延时消息这种方案。
83 |
--------------------------------------------------------------------------------
/docs/cs-basics/network/http-status-codes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: HTTP 常见状态码总结(应用层)
3 | category: 计算机基础
4 | tag:
5 | - 计算机网络
6 | ---
7 |
8 | HTTP 状态码用于描述 HTTP 请求的结果,比如 2xx 就代表请求被成功处理。
9 |
10 | 
11 |
12 | ### 1xx Informational(信息性状态码)
13 |
14 | 相比于其他类别状态码来说,1xx 你平时你大概率不会碰到,所以这里直接跳过。
15 |
16 | ### 2xx Success(成功状态码)
17 |
18 | - **200 OK**:请求被成功处理。例如,发送一个查询用户数据的 HTTP 请求到服务端,服务端正确返回了用户数据。这个是我们平时最常见的一个 HTTP 状态码。
19 | - **201 Created**:请求被成功处理并且在服务端创建了~~一个新的资源~~。例如,通过 POST 请求创建一个新的用户。
20 | - **202 Accepted**:服务端已经接收到了请求,但是还未处理。例如,发送一个需要服务端花费较长时间处理的请求(如报告生成、Excel 导出),服务端接收了请求但尚未处理完毕。
21 | - **204 No Content**:服务端已经成功处理了请求,但是没有返回任何内容。例如,发送请求删除一个用户,服务器成功处理了删除操作但没有返回任何内容。
22 |
23 | 🐛 修正(参见:[issue#2458](https://github.com/Snailclimb/JavaGuide/issues/2458)):201 Created 状态码更准确点来说是创建一个或多个新的资源,可以参考:。
24 |
25 | 
26 |
27 | 这里格外提一下 204 状态码,平时学习/工作中见到的次数并不多。
28 |
29 | [HTTP RFC 2616 对 204 状态码的描述](https://tools.ietf.org/html/rfc2616#section-10.2.5)如下:
30 |
31 | > The server has fulfilled the request but does not need to return an
32 | > entity-body, and might want to return updated metainformation. The
33 | > response MAY include new or updated metainformation in the form of
34 | > entity-headers, which if present SHOULD be associated with the
35 | > requested variant.
36 | >
37 | > If the client is a user agent, it SHOULD NOT change its document view
38 | > from that which caused the request to be sent. This response is
39 | > primarily intended to allow input for actions to take place without
40 | > causing a change to the user agent's active document view, although
41 | > any new or updated metainformation SHOULD be applied to the document
42 | > currently in the user agent's active view.
43 | >
44 | > The 204 response MUST NOT include a message-body, and thus is always
45 | > terminated by the first empty line after the header fields.
46 |
47 | 简单来说,204 状态码描述的是我们向服务端发送 HTTP 请求之后,只关注处理结果是否成功的场景。也就是说我们需要的就是一个结果:true/false。
48 |
49 | 举个例子:你要追一个女孩子,你问女孩子:“我能追你吗?”,女孩子回答:“好!”。我们把这个女孩子当做是服务端就很好理解 204 状态码了。
50 |
51 | ### 3xx Redirection(重定向状态码)
52 |
53 | - **301 Moved Permanently**:资源被永久重定向了。比如你的网站的网址更换了。
54 | - **302 Found**:资源被临时重定向了。比如你的网站的某些资源被暂时转移到另外一个网址。
55 |
56 | ### 4xx Client Error(客户端错误状态码)
57 |
58 | - **400 Bad Request**:发送的 HTTP 请求存在问题。比如请求参数不合法、请求方法错误。
59 | - **401 Unauthorized**:未认证却请求需要认证之后才能访问的资源。
60 | - **403 Forbidden**:直接拒绝 HTTP 请求,不处理。一般用来针对非法请求。
61 | - **404 Not Found**:你请求的资源未在服务端找到。比如你请求某个用户的信息,服务端并没有找到指定的用户。
62 | - **409 Conflict**:表示请求的资源与服务端当前的状态存在冲突,请求无法被处理。
63 |
64 | ### 5xx Server Error(服务端错误状态码)
65 |
66 | - **500 Internal Server Error**:服务端出问题了(通常是服务端出 Bug 了)。比如你服务端处理请求的时候突然抛出异常,但是异常并未在服务端被正确处理。
67 | - **502 Bad Gateway**:我们的网关将请求转发到服务端,但是服务端返回的却是一个错误的响应。
68 |
69 | ### 参考
70 |
71 | -
72 | -
73 | -
74 | -
75 |
76 |
77 |
--------------------------------------------------------------------------------
/docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 访问网页的全过程(知识串联)
3 | category: 计算机基础
4 | tag:
5 | - 计算机网络
6 | ---
7 |
8 | 开发岗中总是会考很多计算机网络的知识点,但如果让面试官只考一道题,便涵盖最多的计网知识点,那可能就是 **网页浏览的全过程** 了。本篇文章将带大家从头到尾过一遍这道被考烂的面试题,必会!!!
9 |
10 | 总的来说,网络通信模型可以用下图来表示,也就是大家只要熟记网络结构五层模型,按照这个体系,很多知识点都能顺出来了。访问网页的过程也是如此。
11 |
12 | 
13 |
14 | 开始之前,我们先简单过一遍完整流程:
15 |
16 | 1. 在浏览器中输入指定网页的 URL。
17 | 2. 浏览器通过 DNS 协议,获取域名对应的 IP 地址。
18 | 3. 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
19 | 4. 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
20 | 5. 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
21 | 6. 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
22 | 7. 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
23 |
24 | ## 应用层
25 |
26 | 一切的开始——打开浏览器,在地址栏输入 URL,回车确认。那么,什么是 URL?访问 URL 有什么用?
27 |
28 | ### URL
29 |
30 | URL(Uniform Resource Locators),即统一资源定位器。网络上的所有资源都靠 URL 来定位,每一个文件就对应着一个 URL,就像是路径地址。理论上,文件资源和 URL 一一对应。实际上也有例外,比如某些 URL 指向的文件已经被重定位到另一个位置,这样就有多个 URL 指向同一个文件。
31 |
32 | ### URL 的组成结构
33 |
34 | 
35 |
36 | 1. 协议。URL 的前缀通常表示了该网址采用了何种应用层协议,通常有两种——HTTP 和 HTTPS。当然也有一些不太常见的前缀头,比如文件传输时用到的`ftp:`。
37 | 2. 域名。域名便是访问网址的通用名,这里也有可能是网址的 IP 地址,域名可以理解为 IP 地址的可读版本,毕竟绝大部分人都不会选择记住一个网址的 IP 地址。
38 | 3. 端口。如果指明了访问网址的端口的话,端口会紧跟在域名后面,并用一个冒号隔开。
39 | 4. 资源路径。域名(端口)后紧跟的就是资源路径,从第一个`/`开始,表示从服务器上根目录开始进行索引到的文件路径,上图中要访问的文件就是服务器根目录下`/path/to/myfile.html`。早先的设计是该文件通常物理存储于服务器主机上,但现在随着网络技术的进步,该文件不一定会物理存储在服务器主机上,有可能存放在云上,而文件路径也有可能是虚拟的(遵循某种规则)。
40 | 5. 参数。参数是浏览器在向服务器提交请求时,在 URL 中附带的参数。服务器解析请求时,会提取这些参数。参数采用键值对的形式`key=value`,每一个键值对使用`&`隔开。参数的具体含义和请求操作的具体方法有关。
41 | 6. 锚点。锚点顾名思义,是在要访问的页面上的一个锚。要访问的页面大部分都多于一页,如果指定了锚点,那么在客户端显示该网页是就会定位到锚点处,相当于一个小书签。值得一提的是,在 URL 中,锚点以`#`开头,并且**不会**作为请求的一部分发送给服务端。
42 |
43 | ### DNS
44 |
45 | 键入了 URL 之后,第一个重头戏登场——DNS 服务器解析。DNS(Domain Name System)域名系统,要解决的是 **域名和 IP 地址的映射问题** 。毕竟,域名只是一个网址便于记住的名字,而网址真正存在的地址其实是 IP 地址。
46 |
47 | 传送门:[DNS 域名系统详解(应用层)](https://javaguide.cn/cs-basics/network/dns.html)
48 |
49 | ### HTTP/HTTPS
50 |
51 | 利用 DNS 拿到了目标主机的 IP 地址之后,浏览器便可以向目标 IP 地址发送 HTTP 报文,请求需要的资源了。在这里,根据目标网站的不同,请求报文可能是 HTTP 协议或安全性增强的 HTTPS 协议。
52 |
53 | 传送门:
54 |
55 | - [HTTP vs HTTPS(应用层)](https://javaguide.cn/cs-basics/network/http-vs-https.html)
56 | - [HTTP 1.0 vs HTTP 1.1(应用层)](https://javaguide.cn/cs-basics/network/http1.0-vs-http1.1.html)
57 | - [HTTP 常见状态码总结(应用层)](https://javaguide.cn/cs-basics/network/http-status-codes.html)
58 |
59 | ## 传输层
60 |
61 | 由于 HTTP 协议是基于 TCP 协议的,在应用层的数据封装好以后,要交给传输层,经 TCP 协议继续封装。
62 |
63 | TCP 协议保证了数据传输的可靠性,是数据包传输的主力协议。
64 |
65 | 传送门:
66 |
67 | - [TCP 三次握手和四次挥手(传输层)](https://javaguide.cn/cs-basics/network/tcp-connection-and-disconnection.html)
68 | - [TCP 传输可靠性保障(传输层)](https://javaguide.cn/cs-basics/network/tcp-reliability-guarantee.html)
69 |
70 | ## 网络层
71 |
72 | 终于,来到网络层,此时我们的主机不再是和另一台主机进行交互了,而是在和中间系统进行交互。也就是说,应用层和传输层都是端到端的协议,而网络层及以下都是中间件的协议了。
73 |
74 | **网络层的的核心功能——转发与路由**,必会!!!如果面试官问到了网络层,而你恰好又什么都不会的话,最最起码要说出这五个字——**转发与路由**。
75 |
76 | - 转发:将分组从路由器的输入端口转移到合适的输出端口。
77 | - 路由:确定分组从源到目的经过的路径。
78 |
79 | 所以到目前为止,我们的数据包经过了应用层、传输层的封装,来到了网络层,终于开始准备在物理层面传输了,第一个要解决的问题就是——**往哪里传输?或者说,要把数据包发到哪个路由器上?** 这便是 BGP 协议要解决的问题。
80 |
--------------------------------------------------------------------------------
/docs/cs-basics/network/nat.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: NAT 协议详解(网络层)
3 | category: 计算机基础
4 | tag:
5 | - 计算机网络
6 | ---
7 |
8 | ## 应用场景
9 |
10 | **NAT 协议(Network Address Translation)** 的应用场景如同它的名称——网络地址转换,应用于内部网到外部网的地址转换过程中。具体地说,在一个小的子网(局域网,Local Area Network,LAN)内,各主机使用的是同一个 LAN 下的 IP 地址,但在该 LAN 以外,在广域网(Wide Area Network,WAN)中,需要一个统一的 IP 地址来标识该 LAN 在整个 Internet 上的位置。
11 |
12 | 这个场景其实不难理解。随着一个个小型办公室、家庭办公室(Small Office, Home Office, SOHO)的出现,为了管理这些 SOHO,一个个子网被设计出来,从而在整个 Internet 中的主机数量将非常庞大。如果每个主机都有一个“绝对唯一”的 IP 地址,那么 IPv4 地址的表达能力可能很快达到上限($2^{32}$)。因此,实际上,SOHO 子网中的 IP 地址是“相对的”,这在一定程度上也缓解了 IPv4 地址的分配压力。
13 |
14 | SOHO 子网的“代理人”,也就是和外界的窗口,通常由路由器扮演。路由器的 LAN 一侧管理着一个小子网,而它的 WAN 接口才是真正参与到 Internet 中的接口,也就有一个“绝对唯一的地址”。NAT 协议,正是在 LAN 中的主机在与 LAN 外界通信时,起到了地址转换的关键作用。
15 |
16 | ## 细节
17 |
18 | 
19 |
20 | 假设当前场景如上图。中间是一个路由器,它的右侧组织了一个 LAN,网络号为`10.0.0/24`。LAN 侧接口的 IP 地址为`10.0.0.4`,并且该子网内有至少三台主机,分别是`10.0.0.1`,`10.0.0.2`和`10.0.0.3`。路由器的左侧连接的是 WAN,WAN 侧接口的 IP 地址为`138.76.29.7`。
21 |
22 | 首先,针对以上信息,我们有如下事实需要说明:
23 |
24 | 1. 路由器的右侧子网的网络号为`10.0.0/24`,主机号为`10.0.0/8`,三台主机地址,以及路由器的 LAN 侧接口地址,均由 DHCP 协议规定。而且,该 DHCP 运行在路由器内部(路由器自维护一个小 DHCP 服务器),从而为子网内提供 DHCP 服务。
25 | 2. 路由器的 WAN 侧接口地址同样由 DHCP 协议规定,但该地址是路由器从 ISP(网络服务提供商)处获得,也就是该 DHCP 通常运行在路由器所在区域的 DHCP 服务器上。
26 |
27 | 现在,路由器内部还运行着 NAT 协议,从而为 LAN-WAN 间通信提供地址转换服务。为此,一个很重要的结构是 **NAT 转换表**。为了说明 NAT 的运行细节,假设有以下请求发生:
28 |
29 | 1. 主机`10.0.0.1`向 IP 地址为`128.119.40.186`的 Web 服务器(端口 80)发送了 HTTP 请求(如请求页面)。此时,主机`10.0.0.1`将随机指派一个端口,如`3345`,作为本次请求的源端口号,将该请求发送到路由器中(目的地址将是`128.119.40.186`,但会先到达`10.0.0.4`)。
30 | 2. `10.0.0.4`即路由器的 LAN 接口收到`10.0.0.1`的请求。路由器将为该请求指派一个新的源端口号,如`5001`,并将请求报文发送给 WAN 接口`138.76.29.7`。同时,在 NAT 转换表中记录一条转换记录**138.76.29.7:5001——10.0.0.1:3345**。
31 | 3. 请求报文到达 WAN 接口,继续向目的主机`128.119.40.186`发送。
32 |
33 | 之后,将会有如下响应发生:
34 |
35 | 1. 主机`128.119.40.186`收到请求,构造响应报文,并将其发送给目的地`138.76.29.7:5001`。
36 | 2. 响应报文到达路由器的 WAN 接口。路由器查询 NAT 转换表,发现`138.76.29.7:5001`在转换表中有记录,从而将其目的地址和目的端口转换成为`10.0.0.1:3345`,再发送到`10.0.0.4`上。
37 | 3. 被转换的响应报文到达路由器的 LAN 接口,继而被转发至目的地`10.0.0.1`。
38 |
39 | 
40 |
41 | 🐛 修正(参见:[issue#2009](https://github.com/Snailclimb/JavaGuide/issues/2009)):上图第四步的 Dest 值应该为 `10.0.0.1:3345` 而不是~~`138.76.29.7:5001`~~,这里笔误了。
42 |
43 | ## 划重点
44 |
45 | 针对以上过程,有以下几个重点需要强调:
46 |
47 | 1. 当请求报文到达路由器,并被指定了新端口号时,由于端口号有 16 位,因此,通常来说,一个路由器管理的 LAN 中的最大主机数 $≈65500$($2^{16}$ 的地址空间),但通常 SOHO 子网内不会有如此多的主机数量。
48 | 2. 对于目的服务器来说,从来不知道“到底是哪个主机给我发送的请求”,它只知道是来自`138.76.29.7:5001`的路由器转发的请求。因此,可以说,**路由器在 WAN 和 LAN 之间起到了屏蔽作用,**所有内部主机发送到外部的报文,都具有同一个 IP 地址(不同的端口号),所有外部发送到内部的报文,也都只有一个目的地(不同端口号),是经过了 NAT 转换后,外部报文才得以正确地送达内部主机。
49 | 3. 在报文穿过路由器,发生 NAT 转换时,如果 LAN 主机 IP 已经在 NAT 转换表中注册过了,则不需要路由器新指派端口,而是直接按照转换记录穿过路由器。同理,外部报文发送至内部时也如此。
50 |
51 | 总结 NAT 协议的特点,有以下几点:
52 |
53 | 1. NAT 协议通过对 WAN 屏蔽 LAN,有效地缓解了 IPv4 地址分配压力。
54 | 2. LAN 主机 IP 地址的变更,无需通告 WAN。
55 | 3. WAN 的 ISP 变更接口地址时,无需通告 LAN 内主机。
56 | 4. LAN 主机对 WAN 不可见,不可直接寻址,可以保证一定程度的安全性。
57 |
58 | 然而,NAT 协议由于其独特性,存在着一些争议。比如,可能你已经注意到了,**NAT 协议在 LAN 以外,标识一个内部主机时,使用的是端口号,因为 IP 地址都是相同的。**这种将端口号作为主机寻址的行为,可能会引发一些误会。此外,路由器作为网络层的设备,修改了传输层的分组内容(修改了源 IP 地址和端口号),同样是不规范的行为。但是,尽管如此,NAT 协议作为 IPv4 时代的产物,极大地方便了一些本来棘手的问题,一直被沿用至今。
59 |
60 |
61 |
--------------------------------------------------------------------------------
/sw.js:
--------------------------------------------------------------------------------
1 | /* ===========================================================
2 | * docsify sw.js
3 | * ===========================================================
4 | * Copyright 2016 @huxpro
5 | * Licensed under Apache 2.0
6 | * Register service worker.
7 | * ========================================================== */
8 |
9 | const RUNTIME = 'docsify'
10 | const HOSTNAME_WHITELIST = [
11 | self.location.hostname,
12 | 'fonts.gstatic.com',
13 | 'fonts.googleapis.com',
14 | 'unpkg.com'
15 | ]
16 |
17 | // The Util Function to hack URLs of intercepted requests
18 | const getFixedUrl = (req) => {
19 | var now = Date.now()
20 | var url = new URL(req.url)
21 |
22 | // 1. fixed http URL
23 | // Just keep syncing with location.protocol
24 | // fetch(httpURL) belongs to active mixed content.
25 | // And fetch(httpRequest) is not supported yet.
26 | url.protocol = self.location.protocol
27 |
28 | // 2. add query for caching-busting.
29 | // GitHub Pages served with Cache-Control: max-age=600
30 | // max-age on mutable content is error-prone, with SW life of bugs can even extend.
31 | // Until cache mode of Fetch API landed, we have to workaround cache-busting with query string.
32 | // Cache-Control-Bug: https://bugs.chromium.org/p/chromium/issues/detail?id=453190
33 | if (url.hostname === self.location.hostname) {
34 | url.search += (url.search ? '&' : '?') + 'cache-bust=' + now
35 | }
36 | return url.href
37 | }
38 |
39 | /**
40 | * @Lifecycle Activate
41 | * New one activated when old isnt being used.
42 | *
43 | * waitUntil(): activating ====> activated
44 | */
45 | self.addEventListener('activate', event => {
46 | event.waitUntil(self.clients.claim())
47 | })
48 |
49 | /**
50 | * @Functional Fetch
51 | * All network requests are being intercepted here.
52 | *
53 | * void respondWith(Promise r)
54 | */
55 | self.addEventListener('fetch', event => {
56 | // Skip some of cross-origin requests, like those for Google Analytics.
57 | if (HOSTNAME_WHITELIST.indexOf(new URL(event.request.url).hostname) > -1) {
58 | // Stale-while-revalidate
59 | // similar to HTTP's stale-while-revalidate: https://www.mnot.net/blog/2007/12/12/stale
60 | // Upgrade from Jake's to Surma's: https://gist.github.com/surma/eb441223daaedf880801ad80006389f1
61 | const cached = caches.match(event.request)
62 | const fixedUrl = getFixedUrl(event.request)
63 | const fetched = fetch(fixedUrl, { cache: 'no-store' })
64 | const fetchedCopy = fetched.then(resp => resp.clone())
65 |
66 | // Call respondWith() with whatever we get first.
67 | // If the fetch fails (e.g disconnected), wait for the cache.
68 | // If there’s nothing in cache, wait for the fetch.
69 | // If neither yields a response, return offline pages.
70 | event.respondWith(
71 | Promise.race([fetched.catch(_ => cached), cached])
72 | .then(resp => resp || fetched)
73 | .catch(_ => { /* eat any errors */ })
74 | )
75 |
76 | // Update the cache with the version we fetched (only for ok status)
77 | event.waitUntil(
78 | Promise.all([fetchedCopy, caches.open(RUNTIME)])
79 | .then(([response, cache]) => response.ok && cache.put(event.request, response))
80 | .catch(_ => { /* eat any errors */ })
81 | )
82 | }
83 | })
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | JavaGuide
6 |
7 |
8 |
12 |
13 |
14 |
15 |
16 |
17 |
24 |
25 |
26 |
27 |
72 |
73 |
74 |
75 |
76 |
77 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/docs/high-availability/timeout-and-retry.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 超时&重试详解
3 | category: 高可用
4 | icon: retry
5 | ---
6 |
7 | 由于网络问题、系统或者服务内部的 Bug、服务器宕机、操作系统崩溃等问题的不确定性,我们的系统或者服务永远不可能保证时刻都是可用的状态。
8 |
9 | 为了最大限度的减小系统或者服务出现故障之后带来的影响,我们需要用到的 **超时(Timeout)** 和 **重试(Retry)** 机制。
10 |
11 | 想要把超时和重试机制讲清楚其实很简单,因为它俩本身就不是什么高深的概念。
12 |
13 | 虽然超时和重试机制的思想很简单,但是它俩是真的非常实用。你平时接触到的绝大部分涉及到远程调用的系统或者服务都会应用超时和重试机制。尤其是对于微服务系统来说,正确设置超时和重试非常重要。单体服务通常只涉及数据库、缓存、第三方 API、中间件等的网络调用,而微服务系统内部各个服务之间还存在着网络调用。
14 |
15 | ## 超时机制
16 |
17 | ### 什么是超时机制?
18 |
19 | 超时机制说的是当一个请求超过指定的时间(比如 1s)还没有被处理的话,这个请求就会直接被取消并抛出指定的异常或者错误(比如 `504 Gateway Timeout`)。
20 |
21 | 我们平时接触到的超时可以简单分为下面 2 种:
22 |
23 | - **连接超时(ConnectTimeout)**:客户端与服务端建立连接的最长等待时间。
24 | - **读取超时(ReadTimeout)**:客户端和服务端已经建立连接,客户端等待服务端处理完请求的最长时间。实际项目中,我们关注比较多的还是读取超时。
25 |
26 | 一些连接池客户端框架中可能还会有获取连接超时和空闲连接清理超时。
27 |
28 | 如果没有设置超时的话,就可能会导致服务端连接数爆炸和大量请求堆积的问题。
29 |
30 | 这些堆积的连接和请求会消耗系统资源,影响新收到的请求的处理。严重的情况下,甚至会拖垮整个系统或者服务。
31 |
32 | 我之前在实际项目就遇到过类似的问题,整个网站无法正常处理请求,服务器负载直接快被拉满。后面发现原因是项目超时设置错误加上客户端请求处理异常,导致服务端连接数直接接近 40w+,这么多堆积的连接直接把系统干趴了。
33 |
34 | ### 超时时间应该如何设置?
35 |
36 | 超时到底设置多长时间是一个难题!超时值设置太高或者太低都有风险。如果设置太高的话,会降低超时机制的有效性,比如你设置超时为 10s 的话,那设置超时就没啥意义了,系统依然可能会出现大量慢请求堆积的问题。如果设置太低的话,就可能会导致在系统或者服务在某些处理请求速度变慢的情况下(比如请求突然增多),大量请求重试(超时通常会结合重试)继续加重系统或者服务的压力,进而导致整个系统或者服务被拖垮的问题。
37 |
38 | 通常情况下,我们建议读取超时设置为 **1500ms** ,这是一个比较普适的值。如果你的系统或者服务对于延迟比较敏感的话,那读取超时值可以适当在 **1500ms** 的基础上进行缩短。反之,读取超时值也可以在 **1500ms** 的基础上进行加长,不过,尽量还是不要超过 **1500ms** 。连接超时可以适当设置长一些,建议在 **1000ms ~ 5000ms** 之内。
39 |
40 | 没有银弹!超时值具体该设置多大,还是要根据实际项目的需求和情况慢慢调整优化得到。
41 |
42 | 更上一层,参考[美团的 Java 线程池参数动态配置](https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html)思想,我们也可以将超时弄成可配置化的参数而不是固定的,比较简单的一种办法就是将超时的值放在配置中心中。这样的话,我们就可以根据系统或者服务的状态动态调整超时值了。
43 |
44 | ## 重试机制
45 |
46 | ### 什么是重试机制?
47 |
48 | 重试机制一般配合超时机制一起使用,指的是多次发送相同的请求来避免瞬态故障和偶然性故障。
49 |
50 | 瞬态故障可以简单理解为某一瞬间系统偶然出现的故障,并不会持久。偶然性故障可以理解为哪些在某些情况下偶尔出现的故障,频率通常较低。
51 |
52 | 重试的核心思想是通过消耗服务器的资源来尽可能获得请求更大概率被成功处理。由于瞬态故障和偶然性故障是很少发生的,因此,重试对于服务器的资源消耗几乎是可以被忽略的。
53 |
54 | ### 常见的重试策略有哪些?
55 |
56 | 常见的重试策略有两种:
57 |
58 | 1. **固定间隔时间重试**:每次重试之间都使用相同的时间间隔,比如每隔 1.5 秒进行一次重试。这种重试策略的优点是实现起来比较简单,不需要考虑重试次数和时间的关系,也不需要维护额外的状态信息。但是这种重试策略的缺点是可能会导致重试过于频繁或过于稀疏,从而影响系统的性能和效率。如果重试间隔太短,可能会对目标系统造成过大的压力,导致雪崩效应;如果重试间隔太长,可能会导致用户等待时间过长,影响用户体验。
59 | 2. **梯度间隔重试**:根据重试次数的增加去延长下次重试时间,比如第一次重试间隔为 1 秒,第二次为 2 秒,第三次为 4 秒,以此类推。这种重试策略的优点是能够有效提高重试成功的几率(随着重试次数增加,但是重试依然不成功,说明目标系统恢复时间比较长,因此可以根据重试次数延长下次重试时间),也能通过柔性化的重试避免对下游系统造成更大压力。但是这种重试策略的缺点是实现起来比较复杂,需要考虑重试次数和时间的关系,以及设置合理的上限和下限值。另外,这种重试策略也可能会导致用户等待时间过长,影响用户体验。
60 |
61 | 这两种适合的场景各不相同。固定间隔时间重试适用于目标系统恢复时间比较稳定和可预测的场景,比如网络波动或服务重启。梯度间隔重试适用于目标系统恢复时间比较长或不可预测的场景,比如网络故障和服务故障。
62 |
63 | ### 重试的次数如何设置?
64 |
65 | 重试的次数不宜过多,否则依然会对系统负载造成比较大的压力。
66 |
67 | 重试的次数通常建议设为 3 次。大部分情况下,我们还是更建议使用梯度间隔重试策略,比如说我们要重试 3 次的话,第 1 次请求失败后,等待 1 秒再进行重试,第 2 次请求失败后,等待 2 秒再进行重试,第 3 次请求失败后,等待 3 秒再进行重试。
68 |
69 | ### 什么是重试幂等?
70 |
71 | 超时和重试机制在实际项目中使用的话,需要注意保证同一个请求没有被多次执行。
72 |
73 | 什么情况下会出现一个请求被多次执行呢?客户端等待服务端完成请求完成超时但此时服务端已经执行了请求,只是由于短暂的网络波动导致响应在发送给客户端的过程中延迟了。
74 |
75 | 举个例子:用户支付购买某个课程,结果用户支付的请求由于重试的问题导致用户购买同一门课程支付了两次。对于这种情况,我们在执行用户购买课程的请求的时候需要判断一下用户是否已经购买过。这样的话,就不会因为重试的问题导致重复购买了。
76 |
77 | ### Java 中如何实现重试?
78 |
79 | 如果要手动编写代码实现重试逻辑的话,可以通过循环(例如 while 或 for 循环)或者递归实现。不过,一般不建议自己动手实现,有很多第三方开源库提供了更完善的重试机制实现,例如 Spring Retry、Resilience4j、Guava Retrying。
80 |
81 | ## 参考
82 |
83 | - 微服务之间调用超时的设置治理:
84 | - 超时、重试和抖动回退:
85 |
86 |
87 |
--------------------------------------------------------------------------------