From e29ad07899616303c2bd89dcf444d7a7e0501ef8 Mon Sep 17 00:00:00 2001 From: Guide Date: Sat, 10 Aug 2024 20:38:10 +0800 Subject: [PATCH] =?UTF-8?q?[docs=20update]=E5=86=85=E5=AE=B9=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/mysql/mysql-index.md | 2 +- docs/database/mysql/mysql-questions-01.md | 6 +- .../data-cold-hot-separation.md | 2 +- docs/java/collection/arraylist-source-code.md | 7 +- docs/open-source-project/system-design.md | 3 +- docs/readme.md | 2 +- .../security/data-desensitization.md | 100 +++++++++++++----- 7 files changed, 85 insertions(+), 37 deletions(-) diff --git a/docs/database/mysql/mysql-index.md b/docs/database/mysql/mysql-index.md index c948e88e..03e32ff5 100644 --- a/docs/database/mysql/mysql-index.md +++ b/docs/database/mysql/mysql-index.md @@ -88,7 +88,7 @@ SELECT * FROM tb1 WHERE id < 500; AVL 树是计算机科学中最早被发明的自平衡二叉查找树,它的名称来自于发明者 G.M. Adelson-Velsky 和 E.M. Landis 的名字缩写。AVL 树的特点是保证任何节点的左右子树高度之差不超过 1,因此也被称为高度平衡二叉树,它的查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)。 -![AVL 树](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/avl-tree.png) +![](https://oss.javaguide.cn/github/javaguide/cs-basics/data-structure/avl-tree.png) AVL 树采用了旋转操作来保持平衡。主要有四种旋转操作:LL 旋转、RR 旋转、LR 旋转和 RL 旋转。其中 LL 旋转和 RR 旋转分别用于处理左左和右右失衡,而 LR 旋转和 RL 旋转则用于处理左右和右左失衡。 diff --git a/docs/database/mysql/mysql-questions-01.md b/docs/database/mysql/mysql-questions-01.md index ebc6f4a2..275b51f6 100644 --- a/docs/database/mysql/mysql-questions-01.md +++ b/docs/database/mysql/mysql-questions-01.md @@ -341,15 +341,13 @@ InnoDB 使用缓冲池(Buffer Pool)缓存数据页和索引页,MyISAM 使 ### MyISAM 和 InnoDB 如何选择? -大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊!)。 +大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意 MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊)。 《MySQL 高性能》上面有一句话这样写到: > 不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。 -一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择 MyISAM 也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。 - -因此,对于咱们日常开发的业务系统来说,你几乎找不到什么理由再使用 MyISAM 作为自己的 MySQL 数据库的存储引擎。 +因此,对于咱们日常开发的业务系统来说,你几乎找不到什么理由使用 MyISAM 了,老老实实用默认的 InnoDB 就可以了! ## MySQL 索引 diff --git a/docs/high-performance/data-cold-hot-separation.md b/docs/high-performance/data-cold-hot-separation.md index cf706c68..d7ae70c2 100644 --- a/docs/high-performance/data-cold-hot-separation.md +++ b/docs/high-performance/data-cold-hot-separation.md @@ -23,7 +23,7 @@ head: 1. **时间维度区分**:按照数据的创建时间、更新时间、过期时间等,将一定时间段内的数据视为热数据,超过该时间段的数据视为冷数据。例如,订单系统可以将 1 年前的订单数据作为冷数据,1 年内的订单数据作为热数据。这种方法适用于数据的访问频率和时间有较强的相关性的场景。 2. **访问频率区分**:将高频访问的数据视为热数据,低频访问的数据视为冷数据。例如,内容系统可以将浏览量非常低的文章作为冷数据,浏览量较高的文章作为热数据。这种方法需要记录数据的访问频率,成本较高,适合访问频率和数据本身有较强的相关性的场景。 -几年前的数据并不一定都是热数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。 +几年前的数据并不一定都是冷数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。 这两种区分冷热数据的方法各有优劣,实际项目中,可以将两者结合使用。 diff --git a/docs/java/collection/arraylist-source-code.md b/docs/java/collection/arraylist-source-code.md index 79bcc1f7..a74fd29e 100644 --- a/docs/java/collection/arraylist-source-code.md +++ b/docs/java/collection/arraylist-source-code.md @@ -305,8 +305,11 @@ public class ArrayList extends AbstractList /** * 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。 - * 返回的数组将是“安全的”,因为该列表不保留对它的引用。 (换句话说,这个方法必须分配一个新的数组)。 - * 因此,调用者可以自由地修改返回的数组。 此方法充当基于阵列和基于集合的API之间的桥梁。 + * 返回的数组将是“安全的”,因为该列表不保留对它的引用。 + * (换句话说,这个方法必须分配一个新的数组)。 + * 因此,调用者可以自由地修改返回的数组结构。 + * 注意:如果元素是引用类型,修改元素的内容会影响到原列表中的对象。 + * 此方法充当基于数组和基于集合的API之间的桥梁。 */ public Object[] toArray() { return Arrays.copyOf(elementData, size); diff --git a/docs/open-source-project/system-design.md b/docs/open-source-project/system-design.md index d3a3e92b..f4e62287 100644 --- a/docs/open-source-project/system-design.md +++ b/docs/open-source-project/system-design.md @@ -125,9 +125,8 @@ icon: "xitongsheji" - [Quartz](https://github.com/quartz-scheduler/quartz):一个很火的开源任务调度框架,Java 定时任务领域的老大哥或者说参考标准, 很多其他任务调度框架都是基于 `quartz` 开发的,比如当当网的`elastic-job`就是基于`quartz`二次开发之后的分布式调度解决方案 - [XXL-JOB](https://github.com/xuxueli/xxl-job) :XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 - [Elastic-Job](http://elasticjob.io/index_zh.html):Elastic-Job 是当当网开源的一个基于 Quartz 和 Zookeeper 的分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成,一般我们只要使用 Elastic-Job-Lite 就好。 -- [EasyScheduler](https://github.com/analysys/EasyScheduler "EasyScheduler") (已经更名为 DolphinScheduler,已经成为 Apache 孵化器项目):Easy Scheduler 是一个分布式工作流任务调度系统,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。Easy Scheduler 以 DAG 方式组装任务,可以实时监控任务的运行状态。同时,它支持重试,重新运行等操作... 。 +- [EasyScheduler](https://github.com/analysys/EasyScheduler "EasyScheduler") (已经更名为 DolphinScheduler,已经成为 Apache 孵化器项目):分布式易扩展的可视化工作流任务调度平台,主要解决“复杂任务依赖但无法直接监控任务健康状态”的问题。 - [PowerJob](https://gitee.com/KFCFans/PowerJob):新一代分布式任务调度与计算框架,支持 CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,欢迎各位接入使用! 。 -- [DolphinScheduler](https://github.com/apache/dolphinscheduler):分布式易扩展的可视化工作流任务调度平台。 ## 分布式 diff --git a/docs/readme.md b/docs/readme.md index ec8e0b87..3672755f 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -18,7 +18,7 @@ footer: |- ## 关于网站 -JavaGuide 已经持续维护 5 年多了,累计提交了 **5000+** commit ,共有 **440** 多位朋友参与维护。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友! +JavaGuide 已经持续维护 6 年多了,累计提交了 **5500+** commit ,共有 **520+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友! 如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收货再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。 diff --git a/docs/system-design/security/data-desensitization.md b/docs/system-design/security/data-desensitization.md index 83b186a1..08b5052f 100644 --- a/docs/system-design/security/data-desensitization.md +++ b/docs/system-design/security/data-desensitization.md @@ -368,38 +368,43 @@ FastJSON 实现数据脱敏的方式主要有两种: - 基于注解 `@JSONField` 实现:需要自定义一个用于脱敏的序列化的类,然后在需要脱敏的字段上通过 `@JSONField` 中的 `serializeUsing` 指定为我们自定义的序列化类型即可。 - 基于序列化过滤器:需要实现 `ValueFilter` 接口,重写 `process` 方法完成自定义脱敏,然后在 JSON 转换时使用自定义的转换策略。具体实现可参考这篇文章: 。 -### Mybatis-mate +### Mybatis-Mate -MybatisPlus 也提供了数据脱敏模块 mybatis-mate。mybatis-mate 为 MybatisPlus 企业级模块,使用之前需要配置授权码(付费),旨在更敏捷优雅处理数据。 +先介绍一下 MyBatis、MyBatis-Plus 和 Mybatis-Mate 这三者的关系: -配置内容如下所示: +- MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。 +- MyBatis-Plus 是一个 MyBatis 的增强工具,能够极大地简化持久层的开发工作。 +- Mybatis-Mate 是为 MyBatis-Plus 提供的企业级模块,旨在更敏捷优雅处理数据。不过,使用之前需要配置授权码(付费)。 -```yaml -# Mybatis Mate 配置 -mybatis-mate: - cert: - grant: jxftsdfggggx - license: GKXP9r4MCJhGID/DTGigcBcLmZjb1YZGjE4GXaAoxbtGsPC20sxpEtiUr2F7Nb1ANTUekvF6Syo6DzraA4M4oacwoLVTglzfvaEfadfsd232485eLJK1QsskrSJmreMnEaNh9lsV7Lpbxy9JeGCeM0HPEbRvq8Y+8dUt5bQYLklsa3ZIBexir+4XykZY15uqn1pYIp4pEK0+aINTa57xjJNoWuBIqm7BdFIb4l1TAcPYMTsMXhF5hfMmKD2h391HxWTshJ6jbt4YqdKD167AgeoM+B+DE1jxlLjcpskY+kFs9piOS7RCcmKBBUOgX2BD/JxhR2gQ== +Mybatis-Mate 支持敏感词脱敏,内置手机号、邮箱、银行卡号等 9 种常用脱敏规则。 + +```java +@FieldSensitive("testStrategy") +private String username; + +@Configuration +public class SensitiveStrategyConfig { + + /** + * 注入脱敏策略 + */ + @Bean + public ISensitiveStrategy sensitiveStrategy() { + // 自定义 testStrategy 类型脱敏处理 + return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***"); + } +} + +// 跳过脱密处理,用于编辑场景 +RequestDataTransfer.skipSensitive(); ``` -具体实现可参考 baomidou 提供的如下代码: 。 - ### MyBatis-Flex 类似于 MybatisPlus,MyBatis-Flex 也是一个 MyBatis 增强框架。MyBatis-Flex 同样提供了数据脱敏功能,并且是可以免费使用的。 MyBatis-Flex 提供了 `@ColumnMask()` 注解,以及内置的 9 种脱敏规则,开箱即用: -- 用户名脱敏 -- 手机号脱敏 -- 固定电话脱敏 -- 身份证号脱敏 -- 车牌号脱敏 -- 地址脱敏 -- 邮件脱敏 -- 密码脱敏 -- 银行卡号脱敏 - ```java /** * 内置的数据脱敏方式 @@ -465,14 +470,57 @@ public class Account { 如果这些内置的脱敏规则不满足你的要求的话,你还可以自定义脱敏规则。 +1、通过 `MaskManager` 注册新的脱敏规则: + +```java +MaskManager.registerMaskProcessor("自定义规则名称" + , data -> { + return data; + }) +``` + +2、使用自定义的脱敏规则 + +```java +@Table("tb_account") +public class Account { + + @Id(keyType = KeyType.Auto) + private Long id; + + @ColumnMask("自定义规则名称") + private String userName; +} +``` + +并且,对于需要跳过脱密处理的场景,例如进入编辑页面编辑用户数据,MyBatis-Flex 也提供了对应的支持: + +1. **`MaskManager#execWithoutMask`**(推荐):该方法使用了模版方法设计模式,保障跳过脱敏处理并执行相关逻辑后自动恢复脱敏处理。 +2. **`MaskManager#skipMask`**:跳过脱敏处理。 +3. **`MaskManager#restoreMask`**:恢复脱敏处理,确保后续的操作继续使用脱敏逻辑。 + +`MaskManager#execWithoutMask`方法实现如下: + +```java +public static T execWithoutMask(Supplier supplier) { + try { + skipMask(); + return supplier.get(); + } finally { + restoreMask(); + } +} +``` + +`MaskManager` 的`skipMask`和`restoreMask`方法一般配套使用,推荐`try{...}finally{...}`模式。 + ## 总结 -本文主要介绍了数据脱敏的相关内容,首先介绍了数据脱敏的概念,在此基础上介绍了常用的数据脱敏规则;随后介绍了本文的重点 Hutool 工具及其使用方法,在此基础上进行了实操,分别演示了使用 DesensitizedUtil 工具类、配合 Jackson 通过注解的方式完成数据脱敏;最后,介绍了一些常见的数据脱敏方法,并附上了对应的教程链接供大家参考,本文内容如有不当之处,还请大家批评指正。 +这篇文章主要介绍了: -## 推荐阅读 - -- [Spring Boot 日志、配置文件、接口数据如何脱敏?老鸟们都是这样玩的!](https://mp.weixin.qq.com/s/59osrnjyPJ7BV070x6ABwQ) -- [大厂也在用的 6 种数据脱敏方案,严防泄露数据的“内鬼”](https://mp.weixin.qq.com/s/_Dgekk1AJsIx0TTlnH6kUA) +- 数据脱敏的定义:数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。 +- 常用的脱敏规则:替换、删除、重排、加噪和加密。 +- 常用的脱敏工具:Hutool、Apache ShardingSphere、FastJSON、Mybatis-Mate 和 MyBatis-Flex。 ## 参考