diff --git a/README.md b/README.md index 1bf61a93c71..e97edcb3989 100755 --- a/README.md +++ b/README.md @@ -434,7 +434,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle. **灾备** = 容灾 + 备份。 -- **备份**:将系统所产生的的所有重要数据多备份几份。 +- **备份**:将系统所产生的所有重要数据多备份几份。 - **容灾**:在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。 **异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。 diff --git a/docs/books/java.md b/docs/books/java.md index f886d3c7ffe..b93e77f2e83 100644 --- a/docs/books/java.md +++ b/docs/books/java.md @@ -12,7 +12,7 @@ icon: "java" 《Head First Java》这本书的内容很轻松有趣,可以说是我学习编程初期最喜欢的几本书之一了。同时,这本书也是我的 Java 启蒙书籍。我在学习 Java 的初期多亏了这本书的帮助,自己才算是跨进 Java 语言的大门。 -我觉得我在 Java 这块能够坚持下来,这本书有很大的功劳。我身边的的很多朋友学习 Java 初期都是看的这本书。 +我觉得我在 Java 这块能够坚持下来,这本书有很大的功劳。我身边的很多朋友学习 Java 初期都是看的这本书。 有很多小伙伴就会问了:**这本书适不适合编程新手阅读呢?** diff --git a/docs/cs-basics/network/computer-network-xiexiren-summary.md b/docs/cs-basics/network/computer-network-xiexiren-summary.md index 5d662133d32..b9254d24ca8 100644 --- a/docs/cs-basics/network/computer-network-xiexiren-summary.md +++ b/docs/cs-basics/network/computer-network-xiexiren-summary.md @@ -152,7 +152,7 @@ head: 2. **数据链路(data link)**:把实现控制数据运输的协议的硬件和软件加到链路上就构成了数据链路。 3. **循环冗余检验 CRC(Cyclic Redundancy Check)**:为了保证数据传输的可靠性,CRC 是数据链路层广泛使用的一种检错技术。 4. **帧(frame)**:一个数据链路层的传输单元,由一个数据链路层首部和其携带的封包所组成协议数据单元。 -5. **MTU(Maximum Transfer Uint )**:最大传送单元。帧的数据部分的的长度上限。 +5. **MTU(Maximum Transfer Uint )**:最大传送单元。帧的数据部分的长度上限。 6. **误码率 BER(Bit Error Rate )**:在一段时间内,传输错误的比特占所传输比特总数的比率。 7. **PPP(Point-to-Point Protocol )**:点对点协议。即用户计算机和 ISP 进行通信时所使用的数据链路层协议。以下是 PPP 帧的示意图: ![PPP](https://oss.javaguide.cn/p3-juejin/6b0310d3103c4149a725a28aaf001899~tplv-k3u1fbpfcp-zoom-1.jpeg) @@ -296,7 +296,7 @@ head: ![](https://oss.javaguide.cn/p3-juejin/8e3efca026654874bde8be88c96e1783~tplv-k3u1fbpfcp-zoom-1.jpeg) -9. **代理服务器(Proxy Server)**:代理服务器(Proxy Server)是一种网络实体,它又称为万维网高速缓存。 代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。代理服务器可在客户端或服务器工作,也可以在中间系统工作。 +9. **代理服务器(Proxy Server)**:代理服务器(Proxy Server)是一种网络实体,它又称为万维网高速缓存。 代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。代理服务器可在客户端或服务器工作,也可以在中间系统工作。 10. **简单邮件传输协议(SMTP)** : SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。 通过 SMTP 协议所指定的服务器,就可以把 E-mail 寄到收信人的服务器上了,整个过程只要几分钟。SMTP 服务器则是遵循 SMTP 协议的发送邮件服务器,用来发送或中转发出的电子邮件。 ![一个电子邮件被发送的过程](https://oss.javaguide.cn/p3-juejin/2bdccb760474435aae52559f2ef9652f~tplv-k3u1fbpfcp-zoom-1.png) diff --git a/docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md b/docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md index c484d32ff58..dc61cbb3dc8 100644 --- a/docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md +++ b/docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md @@ -78,7 +78,7 @@ TCP 协议保证了数据传输的可靠性,是数据包传输的主力协议 终于,来到网络层,此时我们的主机不再是和另一台主机进行交互了,而是在和中间系统进行交互。也就是说,应用层和传输层都是端到端的协议,而网络层及以下都是中间件的协议了。 -**网络层的的核心功能——转发与路由**,必会!!!如果面试官问到了网络层,而你恰好又什么都不会的话,最最起码要说出这五个字——**转发与路由**。 +**网络层的核心功能——转发与路由**,必会!!!如果面试官问到了网络层,而你恰好又什么都不会的话,最最起码要说出这五个字——**转发与路由**。 - 转发:将分组从路由器的输入端口转移到合适的输出端口。 - 路由:确定分组从源到目的经过的路径。 diff --git a/docs/database/basis.md b/docs/database/basis.md index 1b4ea1d396b..39d929ce149 100644 --- a/docs/database/basis.md +++ b/docs/database/basis.md @@ -167,7 +167,7 @@ ER 图由下面 3 个要素组成: 为什么不要用外键呢?大部分人可能会这样回答: 1. **增加了复杂性:** a. 每次做 DELETE 或者 UPDATE 都必须考虑外键约束,会导致开发的时候很痛苦, 测试数据极为不方便; b. 外键的主从关系是定的,假如哪天需求有变化,数据库中的这个字段根本不需要和其他表有关联的话就会增加很多麻烦。 -2. **增加了额外工作**:数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的的一致性和正确性,这样会不得不消耗数据库资源。如果在应用层面去维护的话,可以减小数据库压力; +2. **增加了额外工作**:数据库需要增加维护外键的工作,比如当我们做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,保证数据的一致性和正确性,这样会不得不消耗数据库资源。如果在应用层面去维护的话,可以减小数据库压力; 3. **对分库分表不友好**:因为分库分表下外键是无法生效的。 4. …… diff --git a/docs/database/mysql/mysql-query-execution-plan.md b/docs/database/mysql/mysql-query-execution-plan.md index 8866737b934..50c22812457 100644 --- a/docs/database/mysql/mysql-query-execution-plan.md +++ b/docs/database/mysql/mysql-query-execution-plan.md @@ -89,8 +89,8 @@ id 如果相同,从上往下依次执行。id 不同,id 值越大,执行 查询用到的表名,每行都有对应的表名,表名除了正常的表之外,也可能是以下列出的值: - **``** : 本行引用了 id 为 M 和 N 的行的 UNION 结果; -- **``** : 本行引用了 id 为 N 的表所产生的的派生表结果。派生表有可能产生自 FROM 语句中的子查询。 -- **``** : 本行引用了 id 为 N 的表所产生的的物化子查询结果。 +- **``** : 本行引用了 id 为 N 的表所产生的派生表结果。派生表有可能产生自 FROM 语句中的子查询。 +- **``** : 本行引用了 id 为 N 的表所产生的物化子查询结果。 ### type(重要) @@ -111,7 +111,7 @@ system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_su ### possible_keys -possible_keys 列表示 MySQL 执行查询时可能用到的索引。如果这一列为 NULL ,则表示没有可能用到的索引;这种情况下,需要检查 WHERE 语句中所使用的的列,看是否可以通过给这些列中某个或多个添加索引的方法来提高查询性能。 +possible_keys 列表示 MySQL 执行查询时可能用到的索引。如果这一列为 NULL ,则表示没有可能用到的索引;这种情况下,需要检查 WHERE 语句中所使用的列,看是否可以通过给这些列中某个或多个添加索引的方法来提高查询性能。 ### key(重要) diff --git a/docs/database/redis/redis-questions-02.md b/docs/database/redis/redis-questions-02.md index 601aa733798..db3942d84d2 100644 --- a/docs/database/redis/redis-questions-02.md +++ b/docs/database/redis/redis-questions-02.md @@ -578,7 +578,7 @@ CONFIG SET slowlog-max-len 128 5. **客户端信息 (Client IP:Port)**: 执行命令的客户端地址和端口。 6. **客户端名称 (Client Name)**: 如果客户端设置了名称 (CLIENT SETNAME)。 -`SLOWLOG GET` 命令默认返回最近 10 条的的慢查询命令,你也自己可以指定返回的慢查询命令的数量 `SLOWLOG GET N`。 +`SLOWLOG GET` 命令默认返回最近 10 条的慢查询命令,你也自己可以指定返回的慢查询命令的数量 `SLOWLOG GET N`。 下面是其他比较常用的慢查询相关的命令: diff --git a/docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md b/docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md index 955c5d2813a..5208dc5e8fc 100644 --- a/docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md +++ b/docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md @@ -232,8 +232,8 @@ ZooKeeper 集群中的服务器状态有下面几种: ZooKeeper 集群在宕掉几个 ZooKeeper 服务器之后,如果剩下的 ZooKeeper 服务器个数大于宕掉的个数的话整个 ZooKeeper 才依然可用。假如我们的集群中有 n 台 ZooKeeper 服务器,那么也就是剩下的服务数必须大于 n/2。先说一下结论,2n 和 2n-1 的容忍度是一样的,都是 n-1,大家可以先自己仔细想一想,这应该是一个很简单的数学问题了。 -比如假如我们有 3 台,那么最大允许宕掉 1 台 ZooKeeper 服务器,如果我们有 4 台的的时候也同样只允许宕掉 1 台。 -假如我们有 5 台,那么最大允许宕掉 2 台 ZooKeeper 服务器,如果我们有 6 台的的时候也同样只允许宕掉 2 台。 +比如假如我们有 3 台,那么最大允许宕掉 1 台 ZooKeeper 服务器,如果我们有 4 台的时候也同样只允许宕掉 1 台。 +假如我们有 5 台,那么最大允许宕掉 2 台 ZooKeeper 服务器,如果我们有 6 台的时候也同样只允许宕掉 2 台。 综上,何必增加那一个不必要的 ZooKeeper 呢? diff --git a/docs/high-performance/message-queue/disruptor-questions.md b/docs/high-performance/message-queue/disruptor-questions.md index 1881f6c2c79..eaa52b4fd6d 100644 --- a/docs/high-performance/message-queue/disruptor-questions.md +++ b/docs/high-performance/message-queue/disruptor-questions.md @@ -49,7 +49,7 @@ Disruptor 主要解决了 JDK 内置线程安全队列的性能和内存安全 | `LinkedTransferQueue` | 无锁(`CAS`) | 无界 | | `ConcurrentLinkedQueue` | 无锁(`CAS`) | 无界 | -从上表中可以看出:这些队列要不就是加锁有界,要不就是无锁无界。而加锁的的队列势必会影响性能,无界的队列又存在内存溢出的风险。 +从上表中可以看出:这些队列要不就是加锁有界,要不就是无锁无界。而加锁的队列势必会影响性能,无界的队列又存在内存溢出的风险。 因此,一般情况下,我们都是不建议使用 JDK 内置线程安全队列。 diff --git a/docs/high-quality-technical-articles/advanced-programmer/meituan-three-year-summary-lesson-10.md b/docs/high-quality-technical-articles/advanced-programmer/meituan-three-year-summary-lesson-10.md index 3ae2a5eac42..f756e7a1217 100644 --- a/docs/high-quality-technical-articles/advanced-programmer/meituan-three-year-summary-lesson-10.md +++ b/docs/high-quality-technical-articles/advanced-programmer/meituan-three-year-summary-lesson-10.md @@ -25,7 +25,7 @@ tag: > > **原文地址**: -在美团的三年多时光,如同一部悠长的交响曲,高高低低,而今离开已有一段时间。闲暇之余,梳理了三年多的收获与感慨,总结成 10 条,既是对过去一段时光的的一个深情回眸,也是对未来之路的一份期许。 +在美团的三年多时光,如同一部悠长的交响曲,高高低低,而今离开已有一段时间。闲暇之余,梳理了三年多的收获与感慨,总结成 10 条,既是对过去一段时光的一个深情回眸,也是对未来之路的一份期许。 倘若一些感悟能为刚步入职场的年轻人,或是刚在职业生涯中崭露头角的后起之秀,带来一点点启示与帮助,也是莫大的荣幸。 diff --git a/docs/high-quality-technical-articles/personal-experience/four-year-work-in-tencent-summary.md b/docs/high-quality-technical-articles/personal-experience/four-year-work-in-tencent-summary.md index 4630bff560e..774ecabc17b 100644 --- a/docs/high-quality-technical-articles/personal-experience/four-year-work-in-tencent-summary.md +++ b/docs/high-quality-technical-articles/personal-experience/four-year-work-in-tencent-summary.md @@ -74,7 +74,7 @@ PS:还好以前有奖杯,不然一点念想都没了。(现在腾讯似乎 但另一方面,后来我负责了团队内很重要的事情,应该是中心内都算很重要的事,我独自负责一个方向,直接向总监汇报,似乎又有点像。 -网上也有其他说法,一针见血,是不是嫡系,就看钱到不到位,这么说也有道理。我在 7 级时,就发了股票,自我感觉,还是不错的。我当时以为不出意外的话,我以后的钱途和发展是不是就会一帆风顺。不出意外就出了意外,第二年,EPC 不达预期,部门总经理和总监都被换了,中心来了一个新的的总监。 +网上也有其他说法,一针见血,是不是嫡系,就看钱到不到位,这么说也有道理。我在 7 级时,就发了股票,自我感觉,还是不错的。我当时以为不出意外的话,我以后的钱途和发展是不是就会一帆风顺。不出意外就出了意外,第二年,EPC 不达预期,部门总经理和总监都被换了,中心来了一个新的总监。 好吧,又要重新建立信任了。再到后来,是不是嫡系已经不重要了,因为大环境不好,又加上裁员,大家主动的被动的差不多都走了。 diff --git a/docs/home.md b/docs/home.md index 07fc5d8388e..a24fdd30e4d 100644 --- a/docs/home.md +++ b/docs/home.md @@ -384,7 +384,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle. - [Disruptor 常见知识点&面试题总结](./high-performance/message-queue/disruptor-questions.md) - [RabbitMQ 常见知识点&面试题总结](./high-performance/message-queue/rabbitmq-questions.md) - [RocketMQ 常见知识点&面试题总结](./high-performance/message-queue/rocketmq-questions.md) -- [Kafka 常常见知识点&面试题总结](./high-performance/message-queue/kafka-questions-01.md) +- [Kafka 常见知识点&面试题总结](./high-performance/message-queue/kafka-questions-01.md) ## 高可用 @@ -414,7 +414,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle. **灾备** = 容灾 + 备份。 -- **备份**:将系统所产生的的所有重要数据多备份几份。 +- **备份**:将系统所产生的所有重要数据多备份几份。 - **容灾**:在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。 **异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。 diff --git a/docs/java/basis/java-basic-questions-03.md b/docs/java/basis/java-basic-questions-03.md index c656d1df0f3..8f9dcc17073 100644 --- a/docs/java/basis/java-basic-questions-03.md +++ b/docs/java/basis/java-basic-questions-03.md @@ -563,7 +563,7 @@ SPI 将服务接口和具体的服务实现分离开来,将服务调用方和 对于不想进行序列化的变量,使用 `transient` 关键字修饰。 -`transient` 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 `transient` 修饰的变量值不会被持久化和恢复。 +`transient` 关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化;当对象被反序列化时,被 `transient` 修饰的变量值不会被持久化和恢复。 关于 `transient` 还有几点注意: diff --git a/docs/java/basis/serialization.md b/docs/java/basis/serialization.md index 4c12da11c03..a046a06199d 100644 --- a/docs/java/basis/serialization.md +++ b/docs/java/basis/serialization.md @@ -108,7 +108,7 @@ public class RpcRequest implements Serializable { 对于不想进行序列化的变量,可以使用 `transient` 关键字修饰。 -`transient` 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 `transient` 修饰的变量值不会被持久化和恢复。 +`transient` 关键字的作用是:阻止实例中那些用此关键字修饰的变量序列化;当对象被反序列化时,被 `transient` 修饰的变量值不会被持久化和恢复。 关于 `transient` 还有几点注意: diff --git a/docs/java/jvm/class-file-structure.md b/docs/java/jvm/class-file-structure.md index 5040bf7ea5f..3691a7bb65b 100644 --- a/docs/java/jvm/class-file-structure.md +++ b/docs/java/jvm/class-file-structure.md @@ -80,7 +80,7 @@ ClassFile { 每当 Java 发布大版本(比如 Java 8,Java9)的时候,主版本号都会加 1。你可以使用 `javap -v` 命令来快速查看 Class 文件的版本号信息。 -高版本的 Java 虚拟机可以执行低版本编译器生成的 Class 文件,但是低版本的 Java 虚拟机不能执行高版本编译器生成的 Class 文件。所以,我们在实际开发的时候要确保开发的的 JDK 版本和生产环境的 JDK 版本保持一致。 +高版本的 Java 虚拟机可以执行低版本编译器生成的 Class 文件,但是低版本的 Java 虚拟机不能执行高版本编译器生成的 Class 文件。所以,我们在实际开发的时候要确保开发的 JDK 版本和生产环境的 JDK 版本保持一致。 ### 常量池(Constant Pool) @@ -91,7 +91,7 @@ ClassFile { 紧接着主次版本号之后的是常量池,常量池的数量是 `constant_pool_count-1`(**常量池计数器是从 1 开始计数的,将第 0 项常量空出来是有特殊考虑的,索引值为 0 代表“不引用任何一个常量池项”**)。 -常量池主要存放两大常量:字面量和符号引用。字面量比较接近于 Java 语言层面的的常量概念,如文本字符串、声明为 final 的常量值等。而符号引用则属于编译原理方面的概念。包括下面三类常量: +常量池主要存放两大常量:字面量和符号引用。字面量比较接近于 Java 语言层面的常量概念,如文本字符串、声明为 final 的常量值等。而符号引用则属于编译原理方面的概念。包括下面三类常量: - 类和接口的全限定名 - 字段的名称和描述符 diff --git a/docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md b/docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md index 57c8f5fcca0..011dfaa8a07 100644 --- a/docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md +++ b/docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md @@ -283,7 +283,7 @@ JConsole 可以显示当前内存的详细信息。不仅包括堆内存/非堆 点击右边的“执行 GC(G)”按钮可以强制应用程序执行一个 Full GC。 -> - **新生代 GC(Minor GC)**:指发生新生代的的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。 +> - **新生代 GC(Minor GC)**:指发生新生代的垃圾收集动作,Minor GC 非常频繁,回收速度一般也比较快。 > - **老年代 GC(Major GC/Full GC)**:指发生在老年代的 GC,出现了 Major GC 经常会伴随至少一次的 Minor GC(并非绝对),Major GC 的速度一般会比 Minor GC 的慢 10 倍以上。 ![内存监控 ](./pictures/jdk监控和故障处理工具总结/3内存监控.png) diff --git a/docs/java/new-features/java21.md b/docs/java/new-features/java21.md index ff5912f4066..4d58ecdd075 100644 --- a/docs/java/new-features/java21.md +++ b/docs/java/new-features/java21.md @@ -353,7 +353,7 @@ switch (b) { ## JEP 445:未命名类和实例 main 方法 (预览) -这个特性主要简化了 `main` 方法的的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 +这个特性主要简化了 `main` 方法的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 没有使用该特性之前定义一个 `main` 方法: diff --git a/docs/java/new-features/java22-23.md b/docs/java/new-features/java22-23.md index fd6c9b0bd05..183595b447d 100644 --- a/docs/java/new-features/java22-23.md +++ b/docs/java/new-features/java22-23.md @@ -264,7 +264,7 @@ public class Example { ### JEP 477:未命名类和实例 main 方法 (第三次预览) -这个特性主要简化了 `main` 方法的的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 +这个特性主要简化了 `main` 方法的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 没有使用该特性之前定义一个 `main` 方法: diff --git a/docs/java/new-features/java24.md b/docs/java/new-features/java24.md index c0f4930f149..67b207062c9 100644 --- a/docs/java/new-features/java24.md +++ b/docs/java/new-features/java24.md @@ -142,7 +142,7 @@ ScopedValue.where(V, ) ## JEP 495: 简化的源文件和实例主方法(第四次预览) -这个特性主要简化了 `main` 方法的的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 +这个特性主要简化了 `main` 方法的声明。对于 Java 初学者来说,这个 `main` 方法的声明引入了太多的 Java 语法概念,不利于初学者快速上手。 没有使用该特性之前定义一个 `main` 方法: diff --git a/docs/system-design/framework/spring/ioc-and-aop.md b/docs/system-design/framework/spring/ioc-and-aop.md index e58f40f81af..a7ee8ea38e7 100644 --- a/docs/system-design/framework/spring/ioc-and-aop.md +++ b/docs/system-design/framework/spring/ioc-and-aop.md @@ -114,7 +114,7 @@ AOP 可以将横切关注点(如日志记录、事务管理、权限控制、 ![](https://oss.javaguide.cn/github/javaguide/system-design/framework/spring/crosscut-logic-and-businesslogic-separation%20%20%20%20%20%20.png) -以日志记录为例进行介绍,假如我们需要对某些方法进行统一格式的日志记录,没有使用 AOP 技术之前,我们需要挨个写日志记录的逻辑代码,全是重复的的逻辑。 +以日志记录为例进行介绍,假如我们需要对某些方法进行统一格式的日志记录,没有使用 AOP 技术之前,我们需要挨个写日志记录的逻辑代码,全是重复的逻辑。 ```java public CommonResponse method1() { diff --git a/docs/system-design/schedule-task.md b/docs/system-design/schedule-task.md index 99b3d574056..cdedcc56942 100644 --- a/docs/system-design/schedule-task.md +++ b/docs/system-design/schedule-task.md @@ -293,7 +293,7 @@ public class TestJob implements SimpleJob { > Quartz 作为开源作业调度中的佼佼者,是作业调度的首选。但是集群环境中 Quartz 采用 API 的方式对任务进行管理,从而可以避免上述问题,但是同样存在以下问题: > -> - 问题一:调用 API 的的方式操作任务,不人性化; +> - 问题一:调用 API 的方式操作任务,不人性化; > - 问题二:需要持久化业务 QuartzJobBean 到底层数据表中,系统侵入性相当严重。 > - 问题三:调度逻辑和 QuartzJobBean 耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务; > - 问题四:quartz 底层以“抢占式”获取 DB 锁并由抢占成功节点负责运行任务,会导致节点负载悬殊非常大;而 XXL-JOB 通过执行器实现“协同分配式”运行任务,充分发挥集群优势,负载各节点均衡。 diff --git a/docs/system-design/security/advantages-and-disadvantages-of-jwt.md b/docs/system-design/security/advantages-and-disadvantages-of-jwt.md index bbb6d19778f..5a14f1c53bb 100644 --- a/docs/system-design/security/advantages-and-disadvantages-of-jwt.md +++ b/docs/system-design/security/advantages-and-disadvantages-of-jwt.md @@ -147,7 +147,7 @@ JWT 认证的话,我们应该如何解决续签问题呢?查阅了很多资 **2、每次请求都返回新 JWT(不推荐)** -这种方案的的思路很简单,但是,开销会比较大,尤其是在服务端要存储维护 JWT 的情况下。 +这种方案的思路很简单,但是,开销会比较大,尤其是在服务端要存储维护 JWT 的情况下。 **3、JWT 有效期设置到半夜(不推荐)** diff --git a/docs/system-design/security/jwt-intro.md b/docs/system-design/security/jwt-intro.md index 6b8213e9e91..fd9f3f5a474 100644 --- a/docs/system-design/security/jwt-intro.md +++ b/docs/system-design/security/jwt-intro.md @@ -127,7 +127,7 @@ HMACSHA256( ## 如何基于 JWT 进行身份验证? -在基于 JWT 进行身份验证的的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。 +在基于 JWT 进行身份验证的应用程序中,服务器通过 Payload、Header 和 Secret(密钥)创建 JWT 并将 JWT 发送给客户端。客户端接收到 JWT 之后,会将其保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。 ![ JWT 身份验证示意图](https://oss.javaguide.cn/github/javaguide/system-design/jwt/jwt-authentication%20process.png)