mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
Compare commits
3 Commits
65a56ab31a
...
c40ec4c457
Author | SHA1 | Date | |
---|---|---|---|
|
c40ec4c457 | ||
|
743d9c0877 | ||
|
511ab1109b |
@ -582,6 +582,7 @@ export default sidebar({
|
||||
collapsible: true,
|
||||
children: [
|
||||
"high-availability-system-design",
|
||||
"idempotency",
|
||||
"redundancy",
|
||||
"limit-request",
|
||||
"fallback-and-circuit-breaker",
|
||||
|
@ -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,
|
||||
|
@ -20,7 +20,7 @@ footer: |-
|
||||
|
||||
JavaGuide 已经持续维护 6 年多了,累计提交了 **5600+** commit ,共有 **550+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
|
||||
|
||||
如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收货再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。
|
||||
如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收获再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。
|
||||
|
||||
- [项目介绍](./javaguide/intro.md)
|
||||
- [贡献指南](./javaguide/contribution-guideline.md)
|
||||
|
@ -7,7 +7,7 @@ tag:
|
||||
|
||||
**Redis 集群** 相关的面试题为我的 [知识星球](../../about-the-author/zhishixingqiu-two-years.md)(点击链接即可查看详细介绍以及加入方法)专属内容,已经整理到了[《Java 面试指北》](../../zhuanlan/java-mian-shi-zhi-bei.md)中。
|
||||
|
||||

|
||||

|
||||
|
||||
<!-- @include: @planet.snippet.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(雪花算法)
|
||||
|
@ -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)中。
|
||||
|
||||

|
||||
|
||||
<!-- @include: @planet.snippet.md -->
|
||||
|
||||
<!-- @include: @article-footer.snippet.md -->
|
||||
|
13
docs/high-availability/idempotency.md
Normal file
13
docs/high-availability/idempotency.md
Normal file
@ -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)中。
|
||||
|
||||

|
||||
|
||||
<!-- @include: @planet.snippet.md -->
|
||||
|
||||
<!-- @include: @article-footer.snippet.md -->
|
@ -67,7 +67,7 @@ Java 源代码会经历 **编译器优化重排 —> 指令并行重排 —> 内
|
||||
|
||||
- 对于处理器,通过插入内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)的方式来禁止特定类型的处理器重排序。
|
||||
|
||||
> 内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它也会使处理器写入、读取值之前,将主内存的值写入高速缓存,清空无效队列,从而保障变量的可见性。
|
||||
> 内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是一种 CPU 指令,用来禁止处理器指令发生重排序(像屏障一样),从而保障指令执行的有序性。另外,为了达到屏障的效果,它会在处理器写入值时,强制将写缓冲区中的数据刷新到主内存;在读取值之前,使处理器本地缓存中的相关数据失效,强制从主内存中加载最新值,从而保障变量的可见性。
|
||||
|
||||
## JMM(Java Memory Model)
|
||||
|
||||
|
@ -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。
|
||||
|
||||
## 图片处理
|
||||
|
Loading…
x
Reference in New Issue
Block a user