IT知识体系
2024-08-16 22:25:14 0 举报
AI智能生成
十年后端研发,搜集整理自用知识体系,希望对你有所帮助
作者其他创作
大纲/内容
操作系统
Linux
poll
epoll
mmap
sendfile
select
鸿蒙
网络
netstat -nr
ifconfig -a
route add
mtr
lsof
trancerouter
数据库
Mysql
事务隔离级别
Read Uncommitted
脏读
事务A 开启查询,事务B提交更新,但是并没有commit, 事务A 能查到 更新后的值
Read Committed
不可重复读
事务内多次查询同一主键数据不一致
Repeatable Read
幻读
事务 insert 多出额外数据
Serializable
串行化导致事务排队,性能低
锁
行锁
表锁
页级锁
间隙锁
间隙锁一般与行锁结合使用,可以有效避免幻读等问题。
意向锁
为事务准备加锁
ACID
A原子性
事务的原子性是通过 undo log 来实现的
I隔离性
事务的隔离性是通过 (读写锁+MVCC)来实现的
D永久性
事务的持久性性是通过 redo log 来实现的
C一致性
而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!
redo log 和undo log
undo log
undo log 叫做回滚日志,用于记录数据被修改前的信息
redo log
实现事务的持久性,
系统重启之后在读取redo log恢复最新数据
系统重启之后在读取redo log恢复最新数据
重做日志缓冲(redo log buffer)
重做日志文件(redo log)
binlog
架构模式
语法分析
语法优化
执行语句
服务端
引擎端
innoDB
间隙锁解决了RR级别的幻读问题
B+树
聚合索引
二级索引
唯一索引
普通索引
存储是单独存储么
普通索引使用顺序符合最左原则,最左列索引优先查找
回表查询
非聚集索引单独B+ 树存储,叶子结点存储主键值,基于主键值回表查询表数据
索引失效
不适当的查询条件
索引列的函数操作
数据转换
不等于操作
数据分布不均匀
索引选择不当
结构变更
查询优化器,全表更优的情况下
postgresql
ACID
GaussDB
类型
OLAP
OLTP
分布方式
DISTRIBUTE BY
Replication
Hash
RoundRobin
分布倾斜
分区
PARTITION BY
Range
List
分区剪枝
ALTER 设置变更分区
索引
局部聚簇PCK
利用稀疏索引简历基表快速扫描
视图
Sequence
id int not null default nextval('seq1'),
最好不要多列共用同一个序列
性能调优
统计信息优化
CBO
Explain执行计划
显示格式
explain_perf_mode
explain_perf_mode
Normal
Pretty
Summery
run
下推
Remote FQS Query 下推
Streaming 分布式计划树
GATHER
REDISTRIBUTE
BROADCAST
Remote XXX Coordinator 不下推
Performace
相较于Annaylyze,多了DN的执行信息
Annaylyze
表访问
Seq Scan 全表扫描
Index Scan 索引扫描
Bitmap Index Scan
Index Scan using index_name
Join
Nested Loop
Hash Join
Merge Join
GUC参数调节
底层存储
SQL重写
levelDB
LSM Tree
设计思想 变 随机读写为顺序读写,提升IO效率
RocksDB
TiDB
Ceph
Jraft
Flink
MongoDB
TSDB
InfluxDB
LSM Tree架构 写多读少
sharding-jdbc
广播表
子主题
Redis
分布式锁
死锁
死锁指的是多个进程或线程在互相等待对方持有的资源而无法继续执行的情况。在 Redis 中,死锁通常发生在获取锁的客户端在执行业务逻辑时发生异常或超时,导致未能及时释放锁,其他客户端则无法获取到该锁。为避免死锁,应该在获取锁后设置合理的过期时间,确保即使出现异常也能及时释放锁。
锁失效
锁失效指的是获取到的锁在合理的时间内没有及时释放,导致其他客户端无法获取该锁,从而影响系统的并发性能。为避免锁失效,应该设置合理的锁过期时间,确保锁在业务处理完毕后能够自动释放。
锁竞争
为避免锁竞争,应该尽量减小锁的范围,避免将过多的业务逻辑放在锁内执行,以提高并发性能。
锁粒度过大
锁粒度过大指的是在获取锁时锁住了过多的资源,导致其他客户端无法并发地访问其他资源。为避免锁粒度过大,应该尽量将锁的粒度缩小到最小,只锁住必要的资源,避免不必要的阻塞。
实现原理
缓存雪崩
缓存穿透
主从模式
手动操作主服务
哨兵模式
检测主机状态,宕机自动选举为master
集群模式
Goss 协议(谣言传播)协同自动化
解决负载均衡的问题。具体解决方案是分片/虚拟槽slot
RESP 协议
MongoDB
Clickhouse
TiDB
LSM Tree
ElesticSearch
Solr
中间件
RocketMQ
顺序消息
全局顺序消息
示例:券商进行货币兑换,按照相同价格,优先出价人获得优先交易处理
分区顺序消息
示例:验证码用户ID 用作sharding key
电商订单ID 进行sharding
电商订单ID 进行sharding
定时消息
延时消息
事务消息
消息重试
只针对集群消费模式生效
集群、广播消息
消息体
以字符串、字节数组形式进行传输;
可以是结构化对象
可以是结构化对象
Kafka
重复消费问题
消费幂等性设计
事务处理机制
kafka发送多个消息的事务处理,要么都发送成功,要么都失败
消息可靠性
生产者可靠性ack机制
Request.required.acks=-1 (全量同步确认,强可靠性保证);
Request.required.acks = 1(leader 确认收到, 默认);
Request.required.acks = 0 (不确认,但是吞吐量大)。
Request.required.acks = 1(leader 确认收到, 默认);
Request.required.acks = 0 (不确认,但是吞吐量大)。
Broker消息可靠性
消息备份和同步
消费consumer可靠性
autocommit
手动commit
实现全局有序
1.一个broker一个partition一个consumer
2.多个partition情况,基于订单ID作hash sharding,使用多个queue进行线程消费
高性能设计机制
0拷贝技术,mmap映射、sendfile
消息持久化存储磁盘顺序读写,非随机读写
PageCache缓存
消息体 是键值对 字节数组形式进行存取,key可为空,值必须;
key 用来分区、消息路由和索引
key 用来分区、消息路由和索引
限制topic数量
Topic总数(分区总数)太多会使集群性能和稳定性能急剧下降。
消息队列Kafka版的存储和协调机制是以分区为粒度的,分区数太多,会导致存储碎片化严重,集群性能和稳定性都会急剧下降。
消息队列Kafka版的存储和协调机制是以分区为粒度的,分区数太多,会导致存储碎片化严重,集群性能和稳定性都会急剧下降。
zookeeper
提交offset偏移量
判断存活
zookeeper心跳检测
replication副本follow同步leader
属性
auto.offset.reset
lastest
earlest
none
RabbitMQ
AMQP协议
对比
算法
动态规划
斐波那契
跳台阶
最大公共子序列
最大收益问题
缓存中间计算结果,提升时间复杂度
转换二维进行问题分析
贪心算法
二分查找
堆排序
字符串匹配
KMP_search
限流算法
计数器
漏捅
漏桶的漏出速率是固定的参数,不适合处理突发流量
令牌桶
支持突发大流量
共识性算法
工作量证明(PoW,Proof of Work)
权益证明(PoS,Proof of Stake)
延迟工作量证明(dPoW,Delayed Proof-of-Work)
授权 PoS(DPoS,Delegated Proof-of-Stake)
实用拜占庭容错算法(PBFT:Practical Byzantine Fault Tolerance)
传统分布式一致性算法(共识算法)
paxos
raft
OOAD设计模式GoF
7大设计原则
单一职责原则 (SRP: Single Responsibility Principle)
开放封闭原则 (OCP: Open/Closed Principle)
对扩展开放,对修改关闭
依赖倒置原则 (DIP: Dependency Inversion Principle)
1.高层不依赖低层,上层与下层应该依赖抽象或接口,
2.抽象不应该依赖细节,而是细节应该依赖抽象
2.抽象不应该依赖细节,而是细节应该依赖抽象
里氏替换原则 (LSP: Liskov Substitution Principle)
接口隔离原则 (ISP: Interface Segregation Principle)
合成复用原则 (CRP: Composite Reuse Principle)
优先使用对象组合(即“合成”)而不是继承来达到复用的目的。组合比继承更灵活,避免了继承带来的复杂性。
迪米特法则 (LoD: Law of Demeter)
创建型
原型模式
clone技术
单例模式Singleton
实例化
构建器模式Builder
工厂方法
抽象工厂模式
结构型
享元模式Flyweight
门面模式Facade
过滤器模式Filter
代理模式Proxy
AOP
适配器模式Adapter
InputStreamReader继承了Reader抽象类并实现,且持有了InputStream的引用,这里是通过StreamDecoder类间接持有的,因为从byte到char要经过编码。很显然,适配器就是InputStreamReader,源角色就是InputStream代表的实例对象,目标接口就是Reader类。OutputStreamWriter 也类似。
InputStream + Reader ===> InputSreamReader
封装有缺陷的接口设计
统一多个类的接口设计
适配不同格式的数据
桥接模式
组合模式 (Composite Pattern)
装饰者模式Decorator
组合优于继承的设计原则
外观模式 (Facade Pattern)
行为型
责任链模式Chain
命令行模式
中介者模式
备忘录模式
状态模式
策略模式Strategy
迭代器模式Iterator
模版模式Template
观察者模式Observer
架构师经常使用的设计模式
项目经验
多线程在项目中的实际应用,解决了什么问题
Mqclient客户端在接收topic消息时,使用到线程池技术接收消息,并使用模版、过滤器设计模式进行解耦
使用到的设计模式
模版模式
过滤器模式
构建模式
门面模式
FS架构思路与实现细节
面试宝典
设计一个定时任务类
设计一个分布式文件系统
流行解决方案
3A
认证
JWT
1. 用户登陆
2. 服务器认证
3. 生成JWT
4. 存储JWT
5. 每次请求
6. 验证
OAuth2.0
用户名密码
多因素认证(验证码)
生物识别 人脸/指纹
数字证书
授权
ACL 访问授权列表
RBAC角色基于访问控制
AVBAC
OAuth
计费
大数据
ETL
Extract Transform Load
ketel
hive
hadoop
Flume
influx
CDC
cannal
Flink
Stream
流处理模型
State
状态管理
Time
Event Time
Ingest Time
Process Time
应用场景
数仓实时计算
搜索引擎实时索引
实时预警
Spark
beam
一个统一的编程模型,支持批处理和流处理。它提供了一致的API和抽象层,使开发人员能够编写可移植的数据处理代码,并在多个批处理和流处理引擎上运行。
clickhouse
仓、湖、集市
原始层Raw Layer
数据湖Data Lake
湖聚河流, 原始数据的汇集,结构数据,半结构数据、非结构数据
加工层Refined Layer
数仓Data WareHouse
经过ETL 加工过的 高度规范化、结构化的 数据,用于支撑复杂数据分析、报表服务
数据集市Date Mart
应用层
BI
数据可视化
机器学习
实时分析
数据分层
ODS-操作数据源存储层 贴源层
BDS-业务数据层
预聚合
维度建模
业务规则
spring batch
spring cloud data flow
HazelCast Jet
流程模版
Source
SourceTest
StreamSource
BatchSource
SourceBuilder
Process
FlatMap
Filter
聚合算法
Group
计算
Sink
SinkBuiler
数据结构
IMap
IList
IQueue
disruptor
ringbuffer
RingBuffer
DAG
Edge
窗口函数
滑动窗口
滚动窗口
session窗口
AI
AIGC
Artificial Intelligence Generated Content
tensorflow
IoT
protocal 协议
MQTT
Qos
0
发送没有回复确认机制
当订阅客户端不可用时,消息会丢失
1
至少一次,有回复确认机制
规定时间内没回复,DUP置1并重发消息,可能会重复消费
2
仅一次,精确保证投递成功
两次会话保证消息exactly once ,系统开销大
发布订阅模式
精简,不添加可有可无的功能
很小的传输消耗和协议数据交换,最大限度减少网络流量
异常连接断开时能通知相关各方
安全保证
用户和设备身份认证
服务端资源访问授权
MQTT控制报文和内嵌应用数据的完整性校验
MQTT控制报文和内嵌应用数据的隐私控制
TLS【RFC5246】
报文结构
1 字节固定报头,2 字节心跳报文,报文结构紧凑
固定报头
遗愿消息Last Will
connect时设置,异常断线时发布
保留消息Retained Message
publish时设置,保留在消息服务器内
清除机制
对应主题发布一个空消息
超时自动清除
CoAP
在Client和Server之间传递状态信息的单对单协议
NB-IOT
Lwm2m
数据结构
树
红黑树
插入和删除操作时通过特定操作保持二叉查找树的平衡
子主题
B树
B+ 树
聚合索引
叶子结点存储索引和data
LSM
日志结构合并树
散列表
队列
Queue
Deque
ArrayDeque
LinkedDeque
栈
Stack extends Vator
架构设计
分布式
一致性算法
Poxoc
Raft
角色
Leader
Follwer
Canditor
行为
voke 投票
jraft
设置优化
选举超时
rpc超时
注意与Web异步超时的配合使用
每次rpc最大字节
disruptor缓存大小
StateMachine 状态机
分布式事务
二阶段提交
全局事务管理者TM
局部资源管理器RM
应用程序AP
特点
并发低、效率低
需要在第一阶段请求阶段将所有参与资源上锁
第二阶段提交阶段进行confirm/rollback
单点故障
TCC(Try、Confirm、Cancel)
业务耦合大
Confirm、Cancel 都要实现幂等性
事务型消息
RocketMQ
半事务消息
commit可投递消费者
rollback不可投递
Unknow状态启动回查机制
优势
解耦
大事务拆分小事务
补偿机制
最终一致性
一致性哈希ConsistentHash
hash环
虚拟节点
顺时针next
批量调度
XxlJob
DolphineScheduler
yarn
微服务组件
服务降级
熔断
Hystrix
异常次数比率熔断时长
原理
限流
sentinal
限流算法
滑动时间窗
原理
降级
分布式事务
seata
模式
AT
前提
基于支持本地ACID事务的关系型数据库
JAVA,jdbc
与二阶段区别
第一阶段不投票,完成事务后直接提交,记录undo log,释放锁资源,由第二阶段进行回滚
TCC
saga
XA
高并发场景不推荐使用,使用了大量的锁机制来实现;适用于金融场景,强一致性业务
对服务的侵入性较强,
@GlobalTrasactional
负载均衡
Feign
@FeignClient
调用远端接口和本地接口写法一样
动态代理方法模式实现,底层依然是依赖ribbon
Ribbon
@LoadBalance
LoadBalanceInterceptor
restTemplate,访问服务ip port方式可以用service方式访问
注册中心
Zookeeper
分布式一致性算法:ZAB
与Raft的主要区别
节点类型
持久节点
持久顺序节点
临时节点
顺序临时节点
watch机制
Eureka
consul
Nacos
高并发机制
CopyOnWrite机制,读写分离机制
Raft
etcd
RAFT
配置中心
RPC
grpc
bolt
dubble
sofa
链路追踪
CAT
skywalking
netty
reactor线程模型
单Reactor单线程
单Reactor多线程
主从Reactor多线程
编解码 Encode Decode
i/o
bio
nio
Spring 容器
事务异常回滚
RuntimeException/Error
异常被吃
数据库不支持
自身调用问题
不支持事务
@Transactional
(propagation = Propagation.NOT_SUPPORTED)
(propagation = Propagation.NOT_SUPPORTED)
未启用@EnableTransactionManagement
上下文Context
ApplicationContext
设计理念
ApplicationContext 的设计理念基于以下几个核心原则:
依赖注入(Dependency Injection):
Spring 提供的 IoC 容器使用 ApplicationContext 来管理 Bean 的生命周期和依赖关系。通过依赖注入机制,ApplicationContext 可以自动处理 Bean 之间的依赖,减少类之间的耦合,增强代码的可测试性和可维护性。
配置与执行分离:
ApplicationContext 支持多种配置方式(XML、注解、Java 配置类),实现了配置与应用逻辑的分离,使应用更灵活地进行配置和部署。
面向接口编程:
ApplicationContext 依赖于接口编程。开发者可以通过接口定义行为,并使用 ApplicationContext 来管理具体实现类的实例化。这种方式促进了面向接口的编程习惯,使得系统更加模块化和易于扩展。
统一资源管理:
ApplicationContext 负责加载和管理应用所需的资源,比如 Bean、配置文件、消息资源等。它提供了一种统一的方式来访问这些资源。
依赖注入(Dependency Injection):
Spring 提供的 IoC 容器使用 ApplicationContext 来管理 Bean 的生命周期和依赖关系。通过依赖注入机制,ApplicationContext 可以自动处理 Bean 之间的依赖,减少类之间的耦合,增强代码的可测试性和可维护性。
配置与执行分离:
ApplicationContext 支持多种配置方式(XML、注解、Java 配置类),实现了配置与应用逻辑的分离,使应用更灵活地进行配置和部署。
面向接口编程:
ApplicationContext 依赖于接口编程。开发者可以通过接口定义行为,并使用 ApplicationContext 来管理具体实现类的实例化。这种方式促进了面向接口的编程习惯,使得系统更加模块化和易于扩展。
统一资源管理:
ApplicationContext 负责加载和管理应用所需的资源,比如 Bean、配置文件、消息资源等。它提供了一种统一的方式来访问这些资源。
作用
Bean 容器:
ApplicationContext 是一个高级的 IoC 容器,管理着应用中的所有 Bean。它负责加载 Bean 定义、解析 Bean 之间的依赖关系,并在应用启动时实例化、配置这些 Bean。
事件发布机制:
ApplicationContext 提供了事件发布和监听机制。应用中的各个组件可以通过 ApplicationContext 发布事件,其他组件可以通过监听这些事件来执行相应的逻辑处理。例如,ContextRefreshedEvent 事件表示上下文刷新完成,开发者可以在此事件发生时执行特定的操作。
国际化支持:
ApplicationContext 还提供了强大的国际化支持,允许应用通过 MessageSource 来获取不同语言环境下的消息和文本资源。这对于需要多语言支持的应用非常重要。
与 Spring AOP 集成:
ApplicationContext 与 Spring 的 AOP 功能无缝集成,可以在 Bean 定义中直接使用 AOP 切面(Aspect),从而实现事务管理、安全控制、日志记录等横切关注点(cross-cutting concerns)的自动处理。
资源加载:
ApplicationContext 通过 ResourceLoader 接口提供了统一的资源加载机制。无论是从文件系统、类路径还是 URL 中加载资源,开发者都可以通过统一的接口访问。
ApplicationContext 是一个高级的 IoC 容器,管理着应用中的所有 Bean。它负责加载 Bean 定义、解析 Bean 之间的依赖关系,并在应用启动时实例化、配置这些 Bean。
事件发布机制:
ApplicationContext 提供了事件发布和监听机制。应用中的各个组件可以通过 ApplicationContext 发布事件,其他组件可以通过监听这些事件来执行相应的逻辑处理。例如,ContextRefreshedEvent 事件表示上下文刷新完成,开发者可以在此事件发生时执行特定的操作。
国际化支持:
ApplicationContext 还提供了强大的国际化支持,允许应用通过 MessageSource 来获取不同语言环境下的消息和文本资源。这对于需要多语言支持的应用非常重要。
与 Spring AOP 集成:
ApplicationContext 与 Spring 的 AOP 功能无缝集成,可以在 Bean 定义中直接使用 AOP 切面(Aspect),从而实现事务管理、安全控制、日志记录等横切关注点(cross-cutting concerns)的自动处理。
资源加载:
ApplicationContext 通过 ResourceLoader 接口提供了统一的资源加载机制。无论是从文件系统、类路径还是 URL 中加载资源,开发者都可以通过统一的接口访问。
ConfigurableContext
WebApplicationContext
web
异步
请求超时
servlet
扩展点
IOC执行之后,如何执行逻辑
使用事件监听器,实现ApplicationListener接口,监听ConTestRefreshedEvent事件
实现SmartLifecycle接口,并且isAutoStartup方法返回true,则会在finishRefresh方法中触发
Spring中常见的扩展点
1) ApplicationContextInitializer
2) BeanFactoryPostProcessor
加载完Bean定义之后,创建Bean实例之前被触发,通常使用该扩展点来加载自己的bean定义
3) BeanPostPocessor
4) @PostConstruct
5) InitailizingBean
用于执行初始化相关操作
6) ApplicationListenser
7) @PreDestroy
8) SpringFactoryImportSelector
默认属性加载配置
注解
Spring MVC
@RequestMapping
路由功能,映射请求路径
@RequestBody
作用于方法参数,绑定到对象
@ResponseBody
用于@Controller类,将控制器方法返回值写入Http响应中
@ResponseStatus
注解可以标注请求处理方法,可以置顶响应的Http Status 比如 404,403
HttpStatus.BAD_REQUEST
@GetMapping
Http Get
@PostMapping
Http Post
@ControllerAdvice
处理控制器所爆出的异常信息
@Component
@ExcetionHandler
用于标注处理特定类型异常所抛出异常的方法
@InitBinder
标注初始化WebDataBinder方法
@ModelAttribute
通过模型索引名称访问控制器中的Model
方法标注,Spring调用具体处理方法前执行
方法参数标注
@Controller
@Component延伸
@RestContrller
@Controller+@ResponseBody
@PathVariable
为参数绑定URL模板变量
@RequestParam
@CrossOrigin
请求处理类或处理方法提供跨域调用支持
Spring Bean
@ComponentScan
用于配制Spring需要扫描到的类所在的包,可以用basePackages/value进行包路径设置
@Component
Spring容器进行管理
对于需要手动管理 Bean 生命周期的类 ,无需加注解,否则,构造函数的参数,必须是在Context 上下文的,否则引用报错
@Service
@Component延伸,service层
@Repository
@Component延伸,DAO注解
Spring DI
@DependsOn
配置Spring IoC容器在初始化Bean之前,先初始化其他的Bean对象
@Bean
告知Spring,被此注解所标注的类将需要纳入到Bean管理工厂中
initMethod
destroyMethod
@Scops
被Component/Bean标注的类的作用范围
Singleton
单例模式
prototype
原型模式
request
session
globalSession
Spring容器配置注解
@Autowired
用于标记Spring将要解析和注入的依赖项
构造函数
字段
setter方法
@Resource
由JDK提供,作用和Autowired无区别,作用范围有小不同
@Primary
系统中配置多个相同类型的bean,可以用于定义优先级
@PostConstruct
标注在Bean被Spring初始化之前需要执行的方法
@PreDestroy
标注Bean被销毁前要执行的方法
@Qualifier
系统中存在同一类型多个Bean,@Autowired在进行依赖注入时无从选择,此时可以用Qualifier来微调
好像类似于策略模式
@MapperScan
指定数据连接池
sqlSessionFactoryRef = "schedulerSqlSessionFactory"
Spring Boot
@SpringBootApplication
@Configuration
@EnableConfigurationProperties
@ConfigurationProperties
@EnableAutoConfiguration
通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项
@ComponentScan
@Conditional
@ConditionalOnBean
@ConditionalOnBean(name="dataSource")
@ConditionalOnMissingBean
@ConditionalOnClass
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingClass
@ConditionalOnProperty
@ConditionalOnProperty(name="alipay",havingValue="on")
@ConditionalOnResource
@ConditionalOnResource(resources = "classpath:website.properties")
@ConditionalOnWebApplication
用于判断当前的应用程序是否是Web应用程序。如果当前应用是Web应用程序,则使用Spring WebApplicationContext,并定义其会话的生命周期
@ConditionalOnNotWebApplication
非Web应用程序
@ConditionalExpression
@ConditionalException("${localstore} && ${local == 'true'}")
Spring Cloud
spring.cloud.bootstrap.enabled=false
配置从bootstrap中启动/还是从application中启动
增加依赖自动提升为cloud项目
spring-cloud-starter-bootstrap
spring-cloud-starter-alibaba-nacos-config
Sofa
扩展点功能
SPI/services/sofa-rpc
模块化
泛化协议调用GenericService
Invoker
Registry
支持自定义扩展Extensible
Filter
支持自定义扩展Extensible
Router
支持自定义扩展Extensible
ShutdownHook
支持自定义扩展Extensible
provider
consumer
序列化
静态序列化
protobuf/thrift/flatbuffer
动态序列化
hessain/kryo/Fst/Pickle
Externalizable
部分序列化、定制序列化
writeExternal(ObjectOutput out)
readExternal(ObjectInput in)
心得
多使用通用的基础的接口,这样会有很多的实现可供选择
MultipartFile
如果你有byte[]想要构造multipartFile对象,可以使用:
ByteArrayMultipartFile实现类
ByteArrayMultipartFile实现类
HttpServletResponse
如果想在内存中将下载的数据流获取到,可以使用
ContentCachingResponseWrapper 包装类
ContentCachingResponseWrapper 包装类
3高
高并发
多层负载均衡
高可用
冗余思路
主从
集群
缓存
熔断、限流、降级
重试机制
幂等机制
隔离
比如秒杀系统单独部署一套系统
自动扩缩容
K8S
异地容灾
高性能
池化技术
线程池
内存池
连接池
缓存
异步
JVM调优
数据库读写分离,加索引
语言
Java
新特性
1.8
default
接口定义默认函数
HashMap 链表-->红黑树
lamda
List
map
返回新的集合,参数集合内容不变
collection
foreach
对集合内部元素进行修改
replaceAll
在循环迭代时候可以对元素进行替换,例如对List<String> foreach只能循环引用,并不能进行赋值
removeIf
filter
orelse
11
ZGC
基础
注解
内置注解
@override
元注解
@target
@retention
@document
@Inherited
@Repeatable
内部类
静态内部类
静态内部类可以直接在外部类的静态方法中使用,不需要创建外部类的实例就可以访问。
成员内部类
成员内部类依赖于外部类的实例存在,因此需要先创建外部类的实例,然后通过这个实例来创建成员内部类的对象。
多态
重载
方法重载,不同参数个数
重定义父类成员方法
覆盖父类成员方法
编译时多态
方法重载,编译时能确定执行目标方法
运行时多态
方法覆盖,实例对象调用方法,运行时才能确定,为运行时多态
范型
类成员、类方法参数使用时注意加范型符号
类型安全
代码清晰
避免类强制转换
类级范型 与方法级范型
类
public class ClassA<T> {
T getMethod();
}
T getMethod();
}
方法
public class ClassA{
public <T> T getMethod();
}
public <T> T getMethod();
}
异常
错误
类型转换
内存溢出OutOfMemoryError
ClassNotFoundError
异常
算术异常ArithmeticExcetion
空对象NullPointerException
类型强制转换异常ClassCastException
负数组长度异常NegativeArraySizeException
数组下标越界ArrayIndexOutOfBoundsException
数值格式化异常NumberFormatException
非检查异常
runtime异常
检查异常
非runtime 异常
反射
动态代理
JDK
reflect
CGlib
InvocationHandler.invoke(object proxy,method,object[] args)
使用场景
逆向代码
动态生成类框架
Mybatis-plus
LambdaQueryWrapper 封装参数时的应用
SPI
Java.sql.dirve
Mysql-connect包
spring.factories
Spring Boot 的自动配置
META-INF/services
Java的SPI机制,用于接口服务自动发现
google @autoservice
自动将META-INF/services 的文件创建,JAVA SPI的语法糖
Extension扩展点
Current并发包
原子类型
AtomicI
Integer
Long
Referace...
CountDownLatch
CountDownLatch适用于多个线程等待一个事件的发生,而Thread.join()适用于一个线程等待另一个线程执行完毕
Locks
ReentrantLock
重入锁,(独占锁) 也称为可重入锁,用于实现线程之间的同步和互斥。
lockInterruptibly()
尝试获取锁
interrupt()
中断等待
tryLock(long timeout, TimeUnit unit)
超时等待时间,获取不到锁就去做别的
ReadWriteLock
读写锁,(共享锁) 用于实现多个线程对共享资源的读写操作。
ReentrantReadWriteLock
锁级别
偏向锁:
在没有竞争的情况下,让第一个获得锁的线程一直持有锁,避免频繁加锁、解锁对性能的影响。
轻量级锁:
在没有竞争的情况下,使用CAS操作来避免线程阻塞,提高锁的性能。
重量级锁:
当有竞争时,线程会进入阻塞状态,等待锁的释放。
读写锁:
在读多写少的情况下,使用读写锁可以提高并发性能。
公平锁:
当多个线程请求锁时,按照请求的顺序依次获取锁。
非公平锁:
当多个线程请求锁时,先尝试获取锁的线程有更高的获取概率,可以提高锁的性能。
可重入锁:
允许同一个线程多次获取同一把锁,避免死锁问题。例如,ReentrantLock就是一种可重入锁。
锁升级
Synchronized
由JVM进行锁管理,加锁与释放
@GuardedBy("this")
死锁
两个线程互相等待对方持有的资源,如何避免?
遵循资源获取的顺序
避免嵌套锁定
tryLock()
使用超时机制
使用死锁检测机制
Semaphore
乐观锁
不对资源加锁,在提交时检查数据是否被修改,若冲突,则重试,或返回错误
悲观锁
它假设每次操作都会发生冲突,因此访问数据时会先锁定资源,以免其他线程对该资源进行修改
栅栏Barrier
同步机制,能够使多个线程在某个点上等待,直到所有线程都达到该点,才会继续执行
CyclicBarrier
ForkJoin
ForkJoinPool
ForkJoinTask
RecursiveTask
RecursiveAction
HashMap
HashMap
扩容因子
0.75f
初始容量
1 << 4 = 16
最大容量
1 << 30
TREEIFY_THRESHOLD
8 转换成红黑树存储
数组 + 链表 + 红黑树
不满足线程安全
构造测试方案
封装测试类,重写hashcode函数,保持哈希值高碰撞率
LinkedHashMap
Entry多了before、after指针
HashTable
System.properties
CurrentHashMap
初始容量
16
最大容量
1 << 30
HashMap不同点
Node定义
key、value
volatile 立即刷存
putVal
针对Node颗粒进行 synchronized
TreeBin
红黑树代理
Lockstate
0: 释放锁
1: write写锁
2: waite等待写锁
4: reader读锁
treeifybin
链表转换红黑树
多线程
线程生命周期
New
Runnable
synchronize blocking
sleep() wait
notify
sleep(10) time_wait
notify
terminated
Thread
start()
创建新线程进行任务执行,此时进入Runnable状态,获取到cpu资源才是running 状态
run()
调用线程本身执行,不创建新线程执行任务
interrupt()
1. 发出中断信号,设置线程中断标志位,判断是否中断位状态,
线程池
线程池生命周期
周期流转
Executors
newSingleThreadExecutor
newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
执行等待队列
LinkedBlockingQueue
无界队列
SynchronousQueue
非公平访问策略LIFO
公平策略FIFO
无缓冲
溢出线程池处理策略
AbortPolicy
拒绝策略
CallerRunsPolicy
谁提交任务,谁就负责执行任务
DiscardPolicy
静默丢弃,默默丢掉
DiscardOldestPolicy
存活时间最长的任务丢掉
线程执行结果获取方式
CountDownLatch
CompletableFuture
线程配置策略
CPU密集型
cores+1(防止突发性线程丢失CPU运行权限)
I/O密集型
core*2 +
线程数计算公式
cores*(1+io时长/计算时长)
实现原理
运行流程
任务调度流程
获取任务流程
内存池
Buffer Pool
ArrayList
连接池
数据库连接池
Socket连接池
I/O 流Stream
StreamObserver<T>观察流
接口方法返回流,注意在进行流的关闭处理上,如果使用 try 资源 自动的方式,方法执行完会立即关闭流,不如使用手动方式去关闭,否则会出发点 io close 的异常
Enumeration
早期集合迭代接口
JVM
内存结构
本地方法栈
Native Method
C++方法
linux底层函数
VM虚拟机栈Stack
局部变量
基本数据类型(int、short、byte、char、double、float、long、boolean)、
对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一跳字节码指令的地址)。
对象引用(reference类型,它不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)和returnAddress类型(指向了一跳字节码指令的地址)。
操作数栈
动态链接
方法出口
异常
StackOverflowError
递归调用方法,深度越界异常
OutOfMemoryError
程序计数器
不会有内存溢出风险
方法区Method Area
已被虚拟机加载的类信息、常量、静态变量、JIT(just in time,即时编译技术)编译后的代码等数据。运行时常量池是方法区的一部分,用于存放编译期间生成的各种字面常量和符号引用。
通过反射获取到的类型、方法名、字段名称、访问修饰符等信息就是从方法区获取到的
jdk1.8后方法区(Method Area)被元空间(Metaspace)代替
程序运行后,元空间大小基本不变
JVM参数-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置
堆 Heap
-Xms设定初始值
-Xmx设定最大值
OOM最容易出现的区域
设置spring.servlet.multipart.max-file-size过大可能导致OOM
内存调优原则方案
Jvm参数
OOM分析
dump
调优工具
JvisualVM观测工具
在线调试
类加载
双亲委派
UserClassLoader
Application ClassLoader
Extession ClassLoader
BootStrap ClassLoader
反射
-Dsun.misc.URLClassPath.debug=true
内存模型
线程通讯模型
Thread A
本地内存A
主内存
Thread B
本地内存B
volatile
修饰变量对象立即刷新到主内存共享内存
垃圾回收
垃圾收集算法
标记-清除
算法慢,回收后内存地址不连续
标记-整理
内存连续
标记-整理算法通常用于老年代(Old Generation)的内存管理。与新生代(Young Generation)的短命对象相比,老年代的对象存活时间较长,因此使用标记-整理算法来管理老年代内存更为合适。
拷贝
内存利用率50%
分代收集
Serial
单线程收集器
新生代复制算法
老年代标记-整理算法
ParNew
Serial的多线程版本
Parallel Scavenge
吞吐量优先收集器
CMS收集器(Concurrent Mark Sweep)
G1收集器(Garbage First)
ZGC
不适合大吞吐量作业
判断对象是否可回收算法
引用计数算法
可达性分析算法
方法区回收
finallize
垃圾回收器
Serial收集器
Parnew 收集器
Paraller scaveng
引用类型
强引用
=new
弱引用
WeakReference<>
下次GC之前
软引用
SoftValueReference<>
内存不够时
虚引用
PhantomReference<>
用于回收对象时系统通知
回收时间
Minor GC: 清理新生代的垃圾,通常比 Major GC 快,但仍会暂停应用程序的执行。通常,Minor GC 的暂停时间在几十毫秒到几秒钟之间。
Major GC (Full GC): 清理老年代的垃圾,相对较慢,可能需要几秒钟到几分钟不等,具体时间取决于堆的大小和垃圾的数量。
Concurrent Mark-Sweep (CMS) 和 G1 GC: 这些垃圾回收器试图减少停顿时间,通过并发的方式在应用程序运行时进行垃圾回收。
Major GC (Full GC): 清理老年代的垃圾,相对较慢,可能需要几秒钟到几分钟不等,具体时间取决于堆的大小和垃圾的数量。
Concurrent Mark-Sweep (CMS) 和 G1 GC: 这些垃圾回收器试图减少停顿时间,通过并发的方式在应用程序运行时进行垃圾回收。
性能调优
-XX:+UseSerialGC: 启用串行垃圾回收器,适用于单核或少量核心的机器。
-XX:+UseParallelGC: 启用并行垃圾回收器,适用于多核机器。
-XX:+UseConcMarkSweepGC: 启用并发标记清除垃圾回收器,适用于低延迟应用。
-XX:+UseG1GC: 启用 G1 垃圾回收器,适用于大堆内存和低延迟需求。
-XX:+UseParallelGC: 启用并行垃圾回收器,适用于多核机器。
-XX:+UseConcMarkSweepGC: 启用并发标记清除垃圾回收器,适用于低延迟应用。
-XX:+UseG1GC: 启用 G1 垃圾回收器,适用于大堆内存和低延迟需求。
新特性
@GuardedBy("this")
Erlang
OPT
module
export
behaviors
gen_server
gen_statem
supervisor
gen_event
terminate/2
Reason
atom
State
init/1 函数返回的状态
code_change/3
OldVsn
旧版本号
State
当前进程的状态数据
Extrra
额外的升级数据
go
python
c
swift
构建工具
maven
dependency
manageMent
注意点
scope
compile
编译、运行、测试等均需要
test
仅测试时需要
runtime
仅运行时需要
provided
运行时不需要,由其他组件提供,比如web容器、JDK
import
仅在dependencyManagement中可以使用
解决pom parent 父依赖多继承
引入的dependency是pom 有dependencyManagement 的
optional
控制依赖传递
plugin
profile
动态规划依赖、环境的配置
docker容器化部署
yml
version
compose和docker的版本对应关系
networks
建议用network的网络配置方式,将容器进行连接
port
端口映射,虚拟机和物理机的端口映射
起停命令
docker-compose down up -d
dockerfile
用于定义如何创建一个容器镜像
network
报错 imap 流量无法转发问题: 关闭防火墙 然后 重启 docker
systemctl stop firewalld
systemctl restart docker
create
connect network container
Makefile
Maven-Jib
harbor
K8s
kubectl
kubesphere
0 条评论
下一页