mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-05 20:31:37 +08:00
Compare commits
9 Commits
2a69e57c1a
...
294fe56b60
Author | SHA1 | Date | |
---|---|---|---|
|
294fe56b60 | ||
|
8c20a9b3e9 | ||
|
44acf3b8cc | ||
|
643f24fa6e | ||
|
80ca6f5ad2 | ||
|
ec4898916d | ||
|
011c886422 | ||
|
d36a1c922e | ||
|
52a19c4af8 |
@ -768,7 +768,7 @@ public class ConsumerAddViewHistory implements RocketMQListener<Message> {
|
||||
|
||||
### 传统 IO 方式
|
||||
|
||||

|
||||

|
||||
|
||||
传统的 IO 读写其实就是 read + write 的操作,整个过程会分为如下几步
|
||||
|
||||
@ -791,7 +791,7 @@ mmap(memory map)是一种内存映射文件的方法,即将一个文件或
|
||||
|
||||
简单地说就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次 CPU 拷贝。基于此上述架构图可变为:
|
||||
|
||||

|
||||

|
||||
|
||||
基于 mmap IO 读写其实就变成 mmap + write 的操作,也就是用 mmap 替代传统 IO 中的 read 操作。
|
||||
|
||||
@ -808,7 +808,7 @@ MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRI
|
||||
|
||||
sendfile()跟 mmap()一样,也会减少一次 CPU 拷贝,但是它同时也会减少两次上下文切换。
|
||||
|
||||

|
||||

|
||||
|
||||
如图,用户在发起 sendfile()调用时会发生切换 1,之后数据通过 DMA 拷贝到内核缓冲区,之后再将内核缓冲区的数据 CPU 拷贝到 Socket 缓冲区,最后拷贝到网卡,sendfile()返回,发生切换 2。发生了 3 次拷贝和两次切换。Java 也提供了相应 api:
|
||||
|
||||
|
@ -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 -->
|
||||
|
@ -29,7 +29,7 @@ icon: path
|
||||
你会发现大厂面试你会用到,以后工作之后你也会用到。我分别列举 2 个例子吧!
|
||||
|
||||
- **面试中**:像字节、腾讯这些大厂的技术面试以及几乎所有公司的笔试都会考操作系统相关的问题。
|
||||
- **工作中**:在实际使用缓存的时候,你会发现在操作系统中可以找到很多缓存思想的影子。比如 CPU Cache 缓存的是内存数据用于解决 CPU 处理速度和内存不匹配的问题,内存缓存的是硬盘数据用于解决硬盘访问速度过慢的问题。再比如操作系统在页表方案基础之上引入了快表来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache)。
|
||||
- **工作中**:在实际使用缓存的时候,软件层次而言的缓存思想,则是源自数据库速度、Redis(内存中间件)速度、本地内存速度之间的不匹配;而在计算机存储层次结构设计中,我们也能发现同样的问题及缓存思想的使用:内存用于解决磁盘访问速度过慢的问题,CPU 用三级缓存缓解寄存器和内存之间的速度差异。它们面临的都是同一个问题(速度不匹配)和同一个思想,那么计算机先驱者在存储层次结构设计上对缓存性能的优化措施,同样也适用于软件层次缓存的性能优化。
|
||||
|
||||
**如何求职为导向学习呢?** 简答来说就是:根据招聘要求整理一份目标岗位的技能清单,然后按照技能清单去学习和提升。
|
||||
|
||||
|
@ -240,7 +240,7 @@ Java 中的注释有三种:
|
||||
|
||||
在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了 **标识符** 。简单来说, **标识符就是一个名字** 。
|
||||
|
||||
有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 **关键字** 。简单来说,**关键字是被赋予特殊含义的标识**符 。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
|
||||
有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这些特殊的标识符就是 **关键字** 。简单来说,**关键字是被赋予特殊含义的标识符** 。比如,在我们的日常生活中,如果我们想要开一家店,则要给这个店起一个名字,起的这个“名字”就叫标识符。但是我们店的名字不能叫“警察局”,因为“警察局”这个名字已经被赋予了特殊的含义,而“警察局”就是我们日常生活中的关键字。
|
||||
|
||||
### Java 语言关键字有哪些?
|
||||
|
||||
|
@ -87,8 +87,7 @@ public class Main {
|
||||
|
||||
### 创建一个对象用什么运算符?对象实体与对象引用有何不同?
|
||||
|
||||
new 运算符,new 创建对象实例(对象实例在
|
||||
内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
|
||||
new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
|
||||
|
||||
- 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
|
||||
- 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。
|
||||
|
@ -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();
|
||||
//释放锁
|
||||
|
@ -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 低代码快速开发平台,支持生成前后端分离架构的项目。
|
||||
|
@ -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 等功能。
|
||||
|
||||
### 消息队列
|
||||
|
||||
**分布式队列**:
|
||||
|
Loading…
x
Reference in New Issue
Block a user