Skip to content

Commit e29ad07

Browse files
committed
[docs update]内容完善
1 parent a89d33f commit e29ad07

File tree

7 files changed

+85
-37
lines changed

7 files changed

+85
-37
lines changed

docs/database/mysql/mysql-index.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ SELECT * FROM tb1 WHERE id < 500;
8888

8989
AVL 树是计算机科学中最早被发明的自平衡二叉查找树,它的名称来自于发明者 G.M. Adelson-Velsky 和 E.M. Landis 的名字缩写。AVL 树的特点是保证任何节点的左右子树高度之差不超过 1,因此也被称为高度平衡二叉树,它的查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)。
9090

91-
![AVL 树](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/avl-tree.png)
91+
![](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/avl-tree.png)
9292

9393
AVL 树采用了旋转操作来保持平衡。主要有四种旋转操作:LL 旋转、RR 旋转、LR 旋转和 RL 旋转。其中 LL 旋转和 RR 旋转分别用于处理左左和右右失衡,而 LR 旋转和 RL 旋转则用于处理左右和右左失衡。
9494

docs/database/mysql/mysql-questions-01.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,13 @@ InnoDB 使用缓冲池(Buffer Pool)缓存数据页和索引页,MyISAM 使
341341

342342
### MyISAM 和 InnoDB 如何选择?
343343

344-
大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊)。
344+
大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊)。
345345

346346
《MySQL 高性能》上面有一句话这样写到:
347347

348348
> 不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。
349349
350-
一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择 MyISAM 也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。
351-
352-
因此,对于咱们日常开发的业务系统来说,你几乎找不到什么理由再使用 MyISAM 作为自己的 MySQL 数据库的存储引擎。
350+
因此,对于咱们日常开发的业务系统来说,你几乎找不到什么理由使用 MyISAM 了,老老实实用默认的 InnoDB 就可以了!
353351

354352
## MySQL 索引
355353

docs/high-performance/data-cold-hot-separation.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ head:
2323
1. **时间维度区分**:按照数据的创建时间、更新时间、过期时间等,将一定时间段内的数据视为热数据,超过该时间段的数据视为冷数据。例如,订单系统可以将 1 年前的订单数据作为冷数据,1 年内的订单数据作为热数据。这种方法适用于数据的访问频率和时间有较强的相关性的场景。
2424
2. **访问频率区分**:将高频访问的数据视为热数据,低频访问的数据视为冷数据。例如,内容系统可以将浏览量非常低的文章作为冷数据,浏览量较高的文章作为热数据。这种方法需要记录数据的访问频率,成本较高,适合访问频率和数据本身有较强的相关性的场景。
2525

26-
几年前的数据并不一定都是热数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。
26+
几年前的数据并不一定都是冷数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。
2727

2828
这两种区分冷热数据的方法各有优劣,实际项目中,可以将两者结合使用。
2929

docs/java/collection/arraylist-source-code.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,11 @@ public class ArrayList<E> extends AbstractList<E>
305305

306306
/**
307307
* 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
308-
* 返回的数组将是“安全的”,因为该列表不保留对它的引用。 (换句话说,这个方法必须分配一个新的数组)。
309-
* 因此,调用者可以自由地修改返回的数组。 此方法充当基于阵列和基于集合的API之间的桥梁。
308+
* 返回的数组将是“安全的”,因为该列表不保留对它的引用。
309+
* (换句话说,这个方法必须分配一个新的数组)。
310+
* 因此,调用者可以自由地修改返回的数组结构。
311+
* 注意:如果元素是引用类型,修改元素的内容会影响到原列表中的对象。
312+
* 此方法充当基于数组和基于集合的API之间的桥梁。
310313
*/
311314
public Object[] toArray() {
312315
return Arrays.copyOf(elementData, size);

docs/open-source-project/system-design.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,8 @@ icon: "xitongsheji"
125125
- [Quartz](https://github.com/quartz-scheduler/quartz):一个很火的开源任务调度框架,Java 定时任务领域的老大哥或者说参考标准, 很多其他任务调度框架都是基于 `quartz` 开发的,比如当当网的`elastic-job`就是基于`quartz`二次开发之后的分布式调度解决方案
126126
- [XXL-JOB](https://github.com/xuxueli/xxl-job) :XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
127127
- [Elastic-Job](http://elasticjob.io/index_zh.html):Elastic-Job 是当当网开源的一个基于 Quartz 和 Zookeeper 的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好。
128-
- [EasyScheduler](https://github.com/analysys/EasyScheduler "EasyScheduler") (已经更名为 DolphinScheduler,已经成为 Apache 孵化器项目):Easy Scheduler 是一个分布式工作流任务调度系统,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。Easy Scheduler 以 DAG 方式组装任务,可以实时监控任务的运行状态。同时,它支持重试,重新运行等操作...
128+
- [EasyScheduler](https://github.com/analysys/EasyScheduler "EasyScheduler") (已经更名为 DolphinScheduler,已经成为 Apache 孵化器项目):分布式易扩展的可视化工作流任务调度平台,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。
129129
- [PowerJob](https://gitee.com/KFCFans/PowerJob):新一代分布式任务调度与计算框架,支持 CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,欢迎各位接入使用!<http://www.powerjob.tech/>
130-
- [DolphinScheduler](https://github.com/apache/dolphinscheduler):分布式易扩展的可视化工作流任务调度平台。
131130

132131
## 分布式
133132

docs/readme.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ footer: |-
1818

1919
## 关于网站
2020

21-
JavaGuide 已经持续维护 5 年多了,累计提交了 **5000+** commit ,共有 **440** 多位朋友参与维护。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
21+
JavaGuide 已经持续维护 6 年多了,累计提交了 **5500+** commit ,共有 **520+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
2222

2323
如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收货再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
2424

docs/system-design/security/data-desensitization.md

+74-26
Original file line numberDiff line numberDiff line change
@@ -368,38 +368,43 @@ FastJSON 实现数据脱敏的方式主要有两种:
368368
- 基于注解 `@JSONField` 实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过 `@JSONField` 中的 `serializeUsing` 指定为我们自定义的序列化类型即可。
369369
- 基于序列化过滤器:需要实现 `ValueFilter` 接口,重写 `process` 方法完成自定义脱敏,然后在 JSON 转换时使用自定义的转换策略。具体实现可参考这篇文章: <https://juejin.cn/post/7067916686141161479>
370370

371-
### Mybatis-mate
371+
### Mybatis-Mate
372372

373-
MybatisPlus 也提供了数据脱敏模块 mybatis-mate。mybatis-mate 为 MybatisPlus 企业级模块,使用之前需要配置授权码(付费),旨在更敏捷优雅处理数据。
373+
先介绍一下 MyBatis、MyBatis-Plus 和 Mybatis-Mate 这三者的关系:
374374

375-
配置内容如下所示:
375+
- MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
376+
- MyBatis-Plus 是一个 MyBatis 的增强工具,能够极大地简化持久层的开发工作。
377+
- Mybatis-Mate 是为 MyBatis-Plus 提供的企业级模块,旨在更敏捷优雅处理数据。不过,使用之前需要配置授权码(付费)。
376378

377-
```yaml
378-
# Mybatis Mate 配置
379-
mybatis-mate:
380-
cert:
381-
grant: jxftsdfggggx
382-
license: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ==
383-
```
379+
Mybatis-Mate 支持敏感词脱敏,内置手机号、邮箱、银行卡号等 9 种常用脱敏规则。
380+
381+
```java
382+
@FieldSensitive("testStrategy")
383+
private String username;
384+
385+
@Configuration
386+
public class SensitiveStrategyConfig {
387+
388+
/**
389+
* 注入脱敏策略
390+
*/
391+
@Bean
392+
public ISensitiveStrategy sensitiveStrategy() {
393+
// 自定义 testStrategy 类型脱敏处理
394+
return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
395+
}
396+
}
384397

385-
具体实现可参考 baomidou 提供的如下代码:<https://gitee.com/baomidou/mybatis-mate-examples> 。
398+
// 跳过脱密处理,用于编辑场景
399+
RequestDataTransfer.skipSensitive();
400+
```
386401

387402
### MyBatis-Flex
388403

389404
类似于 MybatisPlus,MyBatis-Flex 也是一个 MyBatis 增强框架。MyBatis-Flex 同样提供了数据脱敏功能,并且是可以免费使用的。
390405

391406
MyBatis-Flex 提供了 `@ColumnMask()` 注解,以及内置的 9 种脱敏规则,开箱即用:
392407

393-
- 用户名脱敏
394-
- 手机号脱敏
395-
- 固定电话脱敏
396-
- 身份证号脱敏
397-
- 车牌号脱敏
398-
- 地址脱敏
399-
- 邮件脱敏
400-
- 密码脱敏
401-
- 银行卡号脱敏
402-
403408
```java
404409
/**
405410
* 内置的数据脱敏方式
@@ -465,14 +470,57 @@ public class Account {
465470

466471
如果这些内置的脱敏规则不满足你的要求的话,你还可以自定义脱敏规则。
467472

468-
## 总结
473+
1、通过 `MaskManager` 注册新的脱敏规则:
474+
475+
```java
476+
MaskManager.registerMaskProcessor("自定义规则名称"
477+
, data -> {
478+
return data;
479+
})
480+
```
469481

470-
本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点 Hutool 工具及其使用方法,在此基础上进行了实操,分别演示了使用 DesensitizedUtil 工具类、配合 Jackson 通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据脱敏方法,并附上了对应的教程链接供大家参考,本文内容如有不当之处,还请大家批评指正。
482+
2、使用自定义的脱敏规则
483+
484+
```java
485+
@Table("tb_account")
486+
public class Account {
487+
488+
@Id(keyType = KeyType.Auto)
489+
private Long id;
490+
491+
@ColumnMask("自定义规则名称")
492+
private String userName;
493+
}
494+
```
495+
496+
并且,对于需要跳过脱密处理的场景,例如进入编辑页面编辑用户数据,MyBatis-Flex 也提供了对应的支持:
497+
498+
1. **`MaskManager#execWithoutMask`**(推荐):该方法使用了模版方法设计模式,保障跳过脱敏处理并执行相关逻辑后自动恢复脱敏处理。
499+
2. **`MaskManager#skipMask`**:跳过脱敏处理。
500+
3. **`MaskManager#restoreMask`**:恢复脱敏处理,确保后续的操作继续使用脱敏逻辑。
501+
502+
`MaskManager#execWithoutMask`方法实现如下:
503+
504+
```java
505+
public static <T> T execWithoutMask(Supplier<T> supplier) {
506+
try {
507+
skipMask();
508+
return supplier.get();
509+
} finally {
510+
restoreMask();
511+
}
512+
}
513+
```
514+
515+
`MaskManager``skipMask``restoreMask`方法一般配套使用,推荐`try{...}finally{...}`模式。
516+
517+
## 总结
471518

472-
## 推荐阅读
519+
这篇文章主要介绍了:
473520

474-
- [Spring Boot 日志、配置文件、接口数据如何脱敏?老鸟们都是这样玩的!](https://mp.weixin.qq.com/s/59osrnjyPJ7BV070x6ABwQ)
475-
- [大厂也在用的 6 种数据脱敏方案,严防泄露数据的“内鬼”](https://mp.weixin.qq.com/s/_Dgekk1AJsIx0TTlnH6kUA)
521+
- 数据脱敏的定义:数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。
522+
- 常用的脱敏规则:替换、删除、重排、加噪和加密。
523+
- 常用的脱敏工具:Hutool、Apache ShardingSphere、FastJSON、Mybatis-Mate 和 MyBatis-Flex。
476524

477525
## 参考
478526

0 commit comments

Comments
 (0)