1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-05 20:31:37 +08:00

Compare commits

...

9 Commits

Author SHA1 Message Date
Guide
294fe56b60 [docs update]完善认证授权相关的开源项目 2023-12-22 13:25:10 +08:00
Guide
8c20a9b3e9 [docs update&fix]开源项目推荐完善&修复RocketMQ面试题图片问题 2023-12-21 14:15:20 +08:00
Guide
44acf3b8cc
Merge pull request #2226 from simeis147/patch-2
typo: Update java-basic-questions-02.md
2023-12-19 20:08:10 +08:00
Guide
643f24fa6e
Merge pull request #2222 from Roiocam/give-a-clarity-example
[docs update] 增加缓存类比和更清晰的说明
2023-12-19 20:07:31 +08:00
Guide
80ca6f5ad2
Merge pull request #2225 from simeis147/patch-1
typo: Update java-basic-questions-01.md
2023-12-19 20:06:58 +08:00
Dongcp
ec4898916d
typo: Update java-basic-questions-02.md
对象实例通常存储在Java中的堆内存中,对象引用存储在栈内存中
2023-12-19 19:13:50 +08:00
Dongcp
011c886422
typo: Update java-basic-questions-01.md
符 没有加厚
2023-12-19 18:54:24 +08:00
JingZhang Chen
d36a1c922e [docs update] 重新组织语言 2023-12-15 14:21:45 +08:00
JingZhang Chen
52a19c4af8 [docs update] 增加缓存类比和更清晰的说明 2023-12-15 14:15:45 +08:00
8 changed files with 41 additions and 12 deletions

View File

@ -768,7 +768,7 @@ public class ConsumerAddViewHistory implements RocketMQListener<Message> {
### 传统 IO 方式
![3](https://img1.imgtp.com/2023/08/15/9DQUZuL7.png)
![](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/31699457085_.pic.jpg)
传统的 IO 读写其实就是 read + write 的操作,整个过程会分为如下几步
@ -791,7 +791,7 @@ mmapmemory map是一种内存映射文件的方法即将一个文件或
简单地说就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次 CPU 拷贝。基于此上述架构图可变为:
![4](https://img1.imgtp.com/2023/08/15/CHmGd0II.png)
![](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/41699457086_.pic.jpg)
基于 mmap IO 读写其实就变成 mmap + write 的操作,也就是用 mmap 替代传统 IO 中的 read 操作。
@ -808,7 +808,7 @@ MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRI
sendfile()跟 mmap()一样,也会减少一次 CPU 拷贝,但是它同时也会减少两次上下文切换。
![5](https://img1.imgtp.com/2023/08/15/jqLgCEBY.png)
![](https://oss.javaguide.cn/github/javaguide/high-performance/message-queue/51699457087_.pic.jpg)
如图,用户在发起 sendfile()调用时会发生切换 1之后数据通过 DMA 拷贝到内核缓冲区,之后再将内核缓冲区的数据 CPU 拷贝到 Socket 缓冲区最后拷贝到网卡sendfile()返回,发生切换 2。发生了 3 次拷贝和两次切换。Java 也提供了相应 api

View File

@ -244,7 +244,7 @@ ShardingSphere 的优势如下(摘自 ShardingSphere 官方文档:<https://s
另外ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
艿艿之前写了一篇分库分表的实战文章,各位朋友可以看看:[《芋道 Spring Boot 分库分表入门》](https://mp.weixin.qq.com/s/A2MYOFT7SP-7kGOon8qJaw) 。
不过,还是要多提一句:**现在很多公司都是用的类似于 TiDB 这种分布式关系型数据库,不需要我们手动进行分库分表(数据库层面已经帮我们做了),也不需要解决手动分库分表引入的各种问题,直接一步到位,内置很多实用的功能(如无感扩容和缩容、冷热存储分离)!如果公司条件允许的话,个人也是比较推荐这种方式!**
### 分库分表后,数据怎么迁移呢?
@ -266,6 +266,7 @@ ShardingSphere 的优势如下(摘自 ShardingSphere 官方文档:<https://s
- 读写分离基于主从复制MySQL 主从复制是依赖于 binlog 。
- **分库** 就是将数据库中的数据分散到不同的数据库上。**分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
- 引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
- ShardingSphere 绝对可以说是当前分库分表的首选ShardingSphere 的功能完善除了支持读写分离和分库分表还提供分布式事务、数据库治理等功能。另外ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
- 现在很多公司都是用的类似于 TiDB 这种分布式关系型数据库,不需要我们手动进行分库分表(数据库层面已经帮我们做了),也不需要解决手动分库分表引入的各种问题,直接一步到位,内置很多实用的功能(如无感扩容和缩容、冷热存储分离)!如果公司条件允许的话,个人也是比较推荐这种方式!
- 如果必须要手动分库分表的话ShardingSphere 是首选ShardingSphere 的功能完善除了支持读写分离和分库分表还提供分布式事务、数据库治理等功能。另外ShardingSphere 的生态体系完善,社区活跃,文档完善,更新和发布比较频繁。
<!-- @include: @article-footer.snippet.md -->

View File

@ -29,7 +29,7 @@ icon: path
你会发现大厂面试你会用到,以后工作之后你也会用到。我分别列举 2 个例子吧!
- **面试中**:像字节、腾讯这些大厂的技术面试以及几乎所有公司的笔试都会考操作系统相关的问题。
- **工作中**:在实际使用缓存的时候,你会发现在操作系统中可以找到很多缓存思想的影子。比如 CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。再比如操作系统在页表方案基础之上引入了快表来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器Cache
- **工作中**:在实际使用缓存的时候,软件层次而言的缓存思想则是源自数据库速度、Redis内存中间件速度、本地内存速度之间的不匹配而在计算机存储层次结构设计中我们也能发现同样的问题及缓存思想的使用内存用于解决磁盘访问速度过慢的问题CPU 用三级缓存缓解寄存器和内存之间的速度差异。它们面临的都是同一个问题(速度不匹配)和同一个思想,那么计算机先驱者在存储层次结构设计上对缓存性能的优化措施,同样也适用于软件层次缓存的性能优化
**如何求职为导向学习呢?** 简答来说就是:根据招聘要求整理一份目标岗位的技能清单,然后按照技能清单去学习和提升。

View File

@ -240,7 +240,7 @@ Java 中的注释有三种:
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了 **标识符** 。简单来说, **标识符就是一个名字**
有一些标识符Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 **关键字** 。简单来说,**关键字是被赋予特殊含义的标识** 。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
有一些标识符Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 **关键字** 。简单来说,**关键字是被赋予特殊含义的标识** 。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
### Java 语言关键字有哪些?

View File

@ -87,8 +87,7 @@ public class Main {
### 创建一个对象用什么运算符?对象实体与对象引用有何不同?
new 运算符new 创建对象实例(对象实例在
内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
new 运算符new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
- 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
- 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

View File

@ -267,7 +267,7 @@ public E take() throws InterruptedException {
}
}
} finally {
//收尾逻辑:如果leader不为空且q有元素则说明有任务没人认领直接发起通知唤醒因为锁被当前消费者持有而导致阻塞的生产者(即调用put、add、offer的线程)
//收尾逻辑:当leader为null并且队列中有任务时唤醒等待的获取元素的线程。
if (leader == null && q.peek() != null)
available.signal();
//释放锁

View File

@ -13,6 +13,7 @@ icon: project
- [SmartAdmin](https://gitee.com/lab1024/smart-admin) : 一套简洁、易用的低代码中后台解决方案。
- [EuBackend](https://gitee.com/zhaoeryu/eu-backend):基于 SpringBoot 开发的轻量级快速开发平台。
- [RuoYi-Vue-Pro](https://github.com/YunaiV/ruoyi-vue-pro)RuoYi-Vue 全新 Pro 版本优化重构所有功能支持数据权限、SaaS 多租户、Flowable 工作流、三方登录、支付等功能。
- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus)RuoYi-Vue 全新 Plus 版本,重写了 RuoYi-Vue 所有功能,集成了 Sa-Token、Mybatis-Plus、Jackson、SpringDoc、Hutool、OSS 定期同步等。
- [pig](https://gitee.com/log4j/pig "pig"):基于 Spring Boot + Spring Cloud + OAuth2 的 RBAC 权限管理系统。
- [Guns](https://gitee.com/stylefeng/guns):现代化的 Java 应用开发基础框架。
- [JeecgBoot](https://github.com/zhangdaiscott/jeecg-boot):一款基于代码生成器的 J2EE 低代码快速开发平台,支持生成前后端分离架构的项目。

View File

@ -36,16 +36,30 @@ icon: "xitongsheji"
## 认证授权
### 权限认证
- [Sa-Token](https://github.com/dromara/sa-token):轻量级 Java 权限认证框架。支持认证授权、单点登录、踢人下线、自动续签等功能。相比于 Spring Security 和 Shiro 来说Sa-Token 内置的开箱即用的功能更多,使用也更简单。
- [Spring Security](https://github.com/spring-projects/spring-security)Spring 官方安全框架,能够用于身份验证、授权、加密和会话管理,是目前使用最广泛的 Java 安全框架。
- [Shiro](https://github.com/apache/shiro)Java 安全框架,功能和 Spring Security 类似,但使用起来更简单。
### 第三方登录
- [WxJava](https://github.com/Wechat-Group/WxJava) : WxJava (微信开发 Java SDK支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的后端开发。
- [Sa-Token](https://github.com/dromara/sa-token):轻量级 Java 权限认证框架。支持认证授权、单点登录、踢人下线、自动续签等功能。
- [JustAuth](https://github.com/justauth/JustAuth)小而全而美的第三方登录开源组件。目前已经集成了诸如GitHub、Gitee、支付宝、新浪微博、微信、Google、Facebook、Twitter、StackOverflow 等国内外数十家第三方平台。
### 单点登录SSO
- [CAS](https://github.com/apereo/cas):企业多语言网络单点登录解决方案。
- [MaxKey](https://gitee.com/dromara/MaxKey):单点登录认证系统,提供安全、标准和开放的用户身份管理(IDM)、身份认证(AM)、单点登录(SSO)、RBAC 权限管理和资源管理等。
- [Keycloak](https://github.com/keycloak/keycloak):免费、开源身份认证和访问管理系统,支持高度可配置的单点登录功能。
## 网络通讯
- [Netty](https://github.com/netty/netty) : 一个基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。
- [Retrofit](https://github.com/square/retrofit):适用于 Android 和 Java 的类型安全的 HTTP 客户端。Retrofit 的 HTTP 请求使用的是 [OkHttp](https://square.github.io/okhttp/) 库(一款被广泛使用网络框架)。
- [Forest](https://gitee.com/dromara/forest):轻量级 HTTP 客户端 API 框架,让 Java 发送 HTTP/HTTPS 请求不再难。它比 OkHttp 和 HttpClient 更高层,是封装调用第三方 restful api client 接口的好帮手,是 retrofit 和 feign 之外另一个选择。
- [netty-websocket-spring-boot-starter](https://github.com/YeautyYE/netty-websocket-spring-boot-starter) :帮助你在 Spring Boot 中使用 Netty 来开发 WebSocket 服务器,并像 spring-websocket 的注解开发一样简单。
- [SMS4J](https://github.com/dromara/SMS4J):短信聚合框架,解决接入多个短信 SDK 的繁琐流程。
## 数据库
@ -75,6 +89,7 @@ icon: "xitongsheji"
## 搜索引擎
- [Elasticsearch](https://github.com/elastic/elasticsearch "elasticsearch") 推荐开源分布式RESTful 搜索引擎。
- [Meilisearch](https://github.com/meilisearch/meilisearch):一个功能强大、快速、开源、易于使用和部署的搜索引擎,支持中文搜索(不需要添加额外的配置)。
- [Solr](https://lucene.apache.org/solr/) : Solr读作“solar”是 Apache Lucene 项目的开源企业搜索平台。
- [Easy-ES](https://gitee.com/dromara/easy-es):傻瓜级 ElasticSearch 搜索引擎 ORM 框架。
@ -148,10 +163,23 @@ icon: "xitongsheji"
### 缓存
#### 本地缓存
- [Caffeine](https://github.com/ben-manes/caffeine) : 一款强大的本地缓存解决方案,性能非常强大。
- [Redis](https://github.com/redis/redis):一个使用 C 语言开发的内存数据库,分布式缓存首选。
- [Guava](https://github.com/google/guava)Google Java 核心库,内置了比较完善的本地缓存实现
- [OHC](https://github.com/snazy/ohc) Java 堆外缓存解决方案(项目从 2021 年开始就不再进行维护了)。
#### 分布式缓存
- [Redis](https://github.com/redis/redis):一个使用 C 语言开发的内存数据库,分布式缓存首选。
- [Dragonfly](https://github.com/dragonflydb/dragonfly):一种针对现代应用程序负荷需求而构建的内存数据库,完全兼容 Redis 和 Memcached 的 API迁移时无需修改任何代码号称全世界最快的内存数据库。
- [KeyDB](https://github.com/Snapchat/KeyDB) Redis 的一个高性能分支,专注于多线程、内存效率和高吞吐量。
#### 多级缓存
- [J2Cache](https://gitee.com/ld/J2Cache):基于本地内存和 Redis 的两级 Java 缓存框架。
- [JetCache](https://github.com/alibaba/jetcache):阿里开源的缓存框架,支持多级缓存、分布式缓存自动刷新、 TTL 等功能。
### 消息队列
**分布式队列**