From c40ec4c4570468cb484beb6c5d01175c4e83243e Mon Sep 17 00:00:00 2001 From: Guide Date: Sat, 25 Jan 2025 15:37:04 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E4=B8=80=E4=BA=9B=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E7=9A=84=E7=AE=80=E5=8D=95=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/sidebar/index.ts | 1 + docs/.vuepress/theme.ts | 2 +- docs/database/redis/redis-cluster.md | 2 +- docs/distributed-system/distributed-id.md | 16 ++++++++++------ .../fallback-and-circuit-breaker.md | 2 ++ docs/high-availability/idempotency.md | 13 +++++++++++++ docs/java/concurrent/jmm.md | 2 +- docs/open-source-project/tool-library.md | 10 ++++++---- 8 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 docs/high-availability/idempotency.md diff --git a/docs/.vuepress/sidebar/index.ts b/docs/.vuepress/sidebar/index.ts index 4269a602..d2a24458 100644 --- a/docs/.vuepress/sidebar/index.ts +++ b/docs/.vuepress/sidebar/index.ts @@ -582,6 +582,7 @@ export default sidebar({ collapsible: true, children: [ "high-availability-system-design", + "idempotency", "redundancy", "limit-request", "fallback-and-circuit-breaker", diff --git a/docs/.vuepress/theme.ts b/docs/.vuepress/theme.ts index 070ca57b..14f04ed6 100644 --- a/docs/.vuepress/theme.ts +++ b/docs/.vuepress/theme.ts @@ -18,8 +18,8 @@ export default hopeTheme({ repo: "https://github.com/Snailclimb/JavaGuide", docsDir: "docs", - // 纯净模式:https://theme-hope.vuejs.press/zh/guide/interface/pure.html pure: true, + focus: false, breadcrumb: false, navbar, sidebar, diff --git a/docs/database/redis/redis-cluster.md b/docs/database/redis/redis-cluster.md index 60cd7dda..e3ef2efd 100644 --- a/docs/database/redis/redis-cluster.md +++ b/docs/database/redis/redis-cluster.md @@ -7,7 +7,7 @@ tag: **Redis 集群** 相关的面试题为我的 [知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。 -![](https://oss.javaguide.cn/github/javaguide/database/redis/redis-cluster-javamianshizhibei.png) +![](https://oss.javaguide.cn/xingqiu/mianshizhibei-database.png) diff --git a/docs/distributed-system/distributed-id.md b/docs/distributed-system/distributed-id.md index aa7d129f..9920f8f7 100644 --- a/docs/distributed-system/distributed-id.md +++ b/docs/distributed-system/distributed-id.md @@ -228,12 +228,16 @@ UUID.randomUUID() 我们这里重点关注一下这个 Version(版本),不同的版本对应的 UUID 的生成规则是不同的。 -5 种不同的 Version(版本)值分别对应的含义(参考[维基百科对于 UUID 的介绍](https://zh.wikipedia.org/wiki/通用唯一识别码)): +8 种不同的 Version(版本)值分别对应的含义(参考[维基百科对于 UUID 的介绍](https://zh.wikipedia.org/wiki/通用唯一识别码)): -- **版本 1** : UUID 是根据时间和节点 ID(通常是 MAC 地址)生成; -- **版本 2** : UUID 是根据标识符(通常是组或用户 ID)、时间和节点 ID 生成; -- **版本 3、版本 5** : 版本 5 - 确定性 UUID 通过散列(hashing)名字空间(namespace)标识符和名称生成; -- **版本 4** : UUID 使用[随机性](https://zh.wikipedia.org/wiki/随机性)或[伪随机性](https://zh.wikipedia.org/wiki/伪随机性)生成。 +- **版本 1 (基于时间和节点 ID)** : 基于时间戳(通常是当前时间)和节点 ID(通常为设备的 MAC 地址)生成。当包含 MAC 地址时,可以保证全球唯一性,但也因此存在隐私泄露的风险。 +- **版本 2 (基于标识符、时间和节点 ID)** : 与版本 1 类似,也基于时间和节点 ID,但额外包含了本地标识符(例如用户 ID 或组 ID)。 +- **版本 3 (基于命名空间和名称的 MD5 哈希)**:使用 MD5 哈希算法,将命名空间标识符(一个 UUID)和名称字符串组合计算得到。相同的命名空间和名称总是生成相同的 UUID(**确定性生成**)。 +- **版本 4 (基于随机数)**:几乎完全基于随机数生成,通常使用伪随机数生成器(PRNG)或加密安全随机数生成器(CSPRNG)来生成。 虽然理论上存在碰撞的可能性,但理论上碰撞概率极低(2^122 的可能性),可以认为在实际应用中是唯一的。 +- **版本 5 (基于命名空间和名称的 SHA-1 哈希)**:类似于版本 3,但使用 SHA-1 哈希算法。 +- **版本 6 (基于时间戳、计数器和节点 ID)**:改进了版本 1,将时间戳放在最高有效位(Most Significant Bit,MSB),使得 UUID 可以直接按时间排序。 +- **版本 7 (基于时间戳和随机数据)**:基于 Unix 时间戳和随机数据生成。 由于时间戳位于最高有效位,因此支持按时间排序。并且,不依赖 MAC 地址或节点 ID,避免了隐私问题。 +- **版本 8 (自定义)**:允许用户根据自己的需求定义 UUID 的生成方式。其结构和内容由用户决定,提供更大的灵活性。 下面是 Version 1 版本下生成的 UUID 的示例: @@ -261,7 +265,7 @@ int version = uuid.version();// 4 最后,我们再简单分析一下 **UUID 的优缺点** (面试的时候可能会被问到的哦!) : -- **优点**:生成速度比较快、简单易用 +- **优点**:生成速度通常比较快、简单易用 - **缺点**:存储消耗空间大(32 个字符串,128 位)、 不安全(基于 MAC 地址生成 UUID 的算法会造成 MAC 地址泄露)、无序(非自增)、没有具体业务含义、需要解决重复 ID 问题(当机器时间不对的情况下,可能导致会产生重复 ID) #### Snowflake(雪花算法) diff --git a/docs/high-availability/fallback-and-circuit-breaker.md b/docs/high-availability/fallback-and-circuit-breaker.md index e9aa9188..59725fa0 100644 --- a/docs/high-availability/fallback-and-circuit-breaker.md +++ b/docs/high-availability/fallback-and-circuit-breaker.md @@ -6,6 +6,8 @@ icon: circuit **降级&熔断** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。 +![](https://oss.javaguide.cn/xingqiu/mianshizhibei-gaobingfa.png) + diff --git a/docs/high-availability/idempotency.md b/docs/high-availability/idempotency.md new file mode 100644 index 00000000..41384457 --- /dev/null +++ b/docs/high-availability/idempotency.md @@ -0,0 +1,13 @@ +--- +title: 接口幂等方案总结(付费) +category: 高可用 +icon: security-fill +--- + +**接口幂等** 相关的面试题为我的[知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html)中。 + +![](https://oss.javaguide.cn/xingqiu/mianshizhibei-gaobingfa.png) + + + + diff --git a/docs/java/concurrent/jmm.md b/docs/java/concurrent/jmm.md index 0f2bea07..dbc36a35 100644 --- a/docs/java/concurrent/jmm.md +++ b/docs/java/concurrent/jmm.md @@ -67,7 +67,7 @@ Java 源代码会经历 **编译器优化重排 —> 指令并行重排 —> 内 - 对于处理器,通过插入内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)的方式来禁止特定类型的处理器重排序。 -> 内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将主内存的值写入高速缓存,清空无效队列,从而保障变量的可见性。 +> 内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它会在处理器写入值时,强制将写缓冲区中的数据刷新到主内存;在读取值之前,使处理器本地缓存中的相关数据失效,强制从主内存中加载最新值,从而保障变量的可见性。 ## JMM(Java Memory Model) diff --git a/docs/open-source-project/tool-library.md b/docs/open-source-project/tool-library.md index 8609dde1..93f2d730 100644 --- a/docs/open-source-project/tool-library.md +++ b/docs/open-source-project/tool-library.md @@ -39,10 +39,12 @@ icon: codelibrary-fill ### PDF -- [x-easypdf](https://gitee.com/dromara/x-easypdf):一个用搭积木的方式构建 PDF 的框架(基于 pdfbox/fop),支持 PDF 导出和编辑。 -- [pdfbox](https://github.com/apache/pdfbox) :用于处理 PDF 文档的开放源码 Java 工具。该项目允许创建新的 PDF 文档、对现有文档进行操作以及从文档中提取内容。PDFBox 还包括几个命令行实用程序。PDFBox 是在 Apache 2.0 版许可下发布的。 -- [OpenPDF](https://github.com/LibrePDF/OpenPDF):OpenPDF 是一个免费的 Java 库,用于使用 LGPL 和 MPL 开源许可创建和编辑 PDF 文件。OpenPDF 基于 iText 的一个分支。 -- [itext7](https://github.com/itext/itext7):一个用于创建、编辑和增强 PDF 文档的 Java 库。 +对于简单的 PDF 创建需求,OpenPDF 是一个不错的选择,它开源免费,API 简单易用。对于需要解析、转换和提取文本等操作的复杂场景,可以选择 Apache PDFBox。当然了,复杂场景如果不介意 LGPL 许可也可以选择 iText。 + +- [x-easypdf](https://gitee.com/dromara/x-easypdf):一个用搭积木的方式构建 PDF 的框架(基于 pdfbox/fop),支持 PDF 导出和编辑,适合简单的 PDF 文档生成场景。 +- [iText](https://github.com/itext/itext7):一个用于创建、编辑和增强 PDF 文档的 Java 库。iText 7 社区版采用 AGPL 许可证,如果你的项目是闭源商业项目,需要购买商业许可证。 iText 5 仍然是 LGPL 许可,可以免费用于商业用途,但已经停止维护。 +- [OpenPDF](https://github.com/LibrePDF/OpenPDF):完全开源免费 (LGPL/MPL 双重许可),基于 iText 的一个分支,可以作为 iText 的替代品,简单易用,但功能相比于 iText 更少一些(对于大多数场景已经足够)。 +- [Apache PDFBox](https://github.com/apache/pdfbox) :完全开源免费 (Apache 许可证),功能强大,支持 PDF 的创建、解析、转换和提取文本等。不过,由于其功能过于丰富,因此 API 设计相对复杂,学习难度会大一些。 - [FOP](https://xmlgraphics.apache.org/fop/) : Apache FOP 用于将 XSL-FO(Extensible Stylesheet Language Formatting Objects)格式化对象转换为多种输出格式,最常见的是 PDF。 ## 图片处理