java知识
2020-11-18 19:53:02 0 举报
AI智能生成
java 知识点汇总
作者其他创作
大纲/内容
分布式
原则
CAP
Consistency (一致性)
Availability 可用性
Partition tolerance 分区容错性
案例
ca (单机系统)
cp (zookeeper)
允许出现短时间的系统不可用
ap eruker
允许数据出现短时间不一致
BASE
Basically Available
基本可用
Soft state
软状态
Eventually consistent
最终一致性
云原生
容器化服务
Devops
持续交互
Saas (软件既应用)
基准代码
一份代码,多份实例
依赖
子主题
配置
配置和代码分开管理
后端服务
构建、发布、运行
区分步骤
进程
以一个或多个进程运行
端口绑定
应用与端口绑定
并发
进程之间可以并发处理
易处理
开发/生产等价
日志
合理记录日志
管理进程
Service Mesh
Service SideCar
业务逻辑与服务交互与治理解耦
Docker
作用
构建、部署、运行服务
服务版本管理
屏蔽环境差异
隔离服务
提高资源利用率
特点
开源容器技术
免费
基于LUX,高效虚拟化
适合大规模构建
不容存储介质
灵活可拓展
管理简单
概念
镜像(Images)
部署的基础
容器 (Container)
基于镜像
守护进程 (Daemon)
客户端 (Client)
镜像仓库 (Repository)
不同版本的镜像
原理
NameSpace
网络
挂载点
文件目录
Control Groups
CPU
内存
网络带宽
UnionFS (联合文件目录)
Image
Container
K8S 集群容器管理
容器集群管理
自动化部署
自动扩缩容
应用管理
可移植
可拓展
自动化
Master
管理,协调集群中所有,管理节点
Node
运行服务,可以有多个Pod
Pod 虚拟服务器
Pod中可以运行多个Container
运行中的服务镜像
共享网络,和存储
Service
虚拟概念
Deployment
更新
网络协议
4/7层网络协议
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
TCP协议
三次握手
四次挥手
报文状态标志,链接状态
http
https
防篡改
ca机构服务端客户端
1、服务端使用RSA(非对称加密算法)生成自己的公钥和私钥2、服务端使用公钥向CA申请证书证书3、CA审核后下发证书内容(公钥、机构名称、ca机构信息、证书序列号等)4、客户端请求服务器时发送随机数r16、服务端
jvm
组成
线程私有
程序计数器
记录程序执行步骤
本地方法栈
native 方法
栈
存放局部变量、动态链接
线程共享
堆
用于存储对象
方法区
存储类信息,静态变量
类加载
双亲委派机制
Bootstrap类加载
JAVA-HOME/lib
Extension类加载
JAVA_HOME/lib/ext
System类记载
java -class
自定义类加载器
过程
加载 文件到内存
验证
文件格式、元数据、字节码、符号引用
准备
类变量内存
解析
引用替换、字段、接口、方法解析
初始化
静态快、静态方法
使用
编译器优化
公共子表达式的消除
指令重排
内联
逃逸分析
方法逃逸
线程逃逸
栈上分配
同步消除
GC
常用回收算法
常用垃圾回收器
CMS
G1
年轻代
并行复制
老年代
ZGC
着色指针
读屏障
避免回收时STW,导致的程序卡顿,
并发处理
基于Regin
内存压缩(整理)
回收之后进行内存压缩
性能调优
JVM参数
性能分析工具
MAT
JMC
JStack
jstat
执行模式
解释模式
编译模式
混合模式
jmm
主内存
共享变量
线程工作内存
原子性
synchronized
基本数据类型读写
可见性
volatile
有序行
happens-before原则
算法
算法思路
分治
场景
可以分解为子问题
子问题的解可以合并为原文题的解
子问题之间没有关联
方法
找到最小子问题的求解方法
找到合并方法
找到递归终止条件
动态规划
按顺序求解子问题
子问题之间有关联关系
最后一个子问题的解为原问题的解
分析最优解的性质
递归的定义最优解
记录不同阶段的最优值
根据阶段最优解选择全局最优解
贪心
局部最优解能产生全局最优解
具备后无效性
分解子问题
计算每个子问题的局部
合并局部最优解
回溯
深度优先搜索
获取解空间的任意解
定义解空间
确定是否进行拓展搜索
深度优先遍历
分支界定
广度优先搜索
获取姐空间的任意解
确定解特征
确定子节点搜索策略
广度优先遍历
字符串匹配
BF算法
BM算法
Sunday算法
KMP算法
Tire树
排序
插入
希尔
直插
交换
冒泡(n2)
快排(n*log2n)
选择
简单选择
堆(n*log2n)
归并
基数
查找
二分查找
小数量级内存查找
二叉排序树
内存查找
B树
文件索引
Hash
常数级的时间复杂度
BloomFilter
大数据集存在性过滤
复杂度
时间
找次数最多的
空间
数据结构
队列
先进先出
栈
先进后出
表
数组
单链表
双链表
循环链表
首位相接
散列表
图
有向图
无向图
带权图
深度遍历,广度遍历,最短路径算法
多叉树(查找辅助)
B、B+ 树
查询优化
字典树
文件检索
二叉树(查找排序)
平衡二叉树
红黑树
哈夫曼树
操作系统
进程与线程
区别和联系
进程是计算机资源分配的最小单位,线程是程序运行的最小单位
进程使用独立的数据空间,线程共享进程的数据空间
线程调度
时间片轮转
先来先服务
优先级
多级反馈
线程切换步骤
进程通信方式
消息队列
共享内存
UnixSocket
Signal
Semaphore
协程
Linux常用命令
awk
top
netstat
grep
less
tail
死锁
内存分页管理与Swap
任务队列与CPU Load
拓展知识点
内存屏障
指令乱序
分支预测
CPU亲和性(affinity)
Netfilter与iptabless
工具集
团队协作
Ant
Maven
Grandle
Git
SVN
代码质量
CheckStyle
FindBugs
SonarQube
压测
Jmeter
文档:jmeter.note
JMH
AB
LoadRunner
容器和代理
Tomcat
Jetty
Nginx
Envoy
OpenResty
Kong
Weblogic
Jboss
WAS
CI/CD持续集成
Gitlab-CI
Jenkins
Travis
JVM相关
JMC(JFR)
内存信息
GC信息
对象信息
TLAB
对象统计
代码信息
热点方法
异常
编译情况
类加/卸载
线程信息
热点线程
线程争用
等待时间
锁信息
I/O信息
文件IO
网络IO
系统信息
进程信息
环境变量
jstack、jmap、jstat
jps 查看进程信息
jmap 统计信息
检查内存泄漏问题
对资源和性能实时监控
全部卡顿,查看GC时间
查看线程运行状态
jinfo
动态查看、调整jvm参数
jcmd
综合工具
btrace
方法参数,返回值
Arthas
系统分析
vmstat
进程、虚拟内存、页面交换、IO读写、CPU活动等
iostat & iotop
系统io状态信息
ifstat & iftop
实时网络流量监控
查看网络相关信息,各种网络协议套接字状态
dstat
全能型实时系统信息统计
strace
诊断、调试程序的系统调用
GDB
程序调试,coredumo分析
lsof
查看系统当前打开的文件信息
tcpdump
网络抓包工具
traceroute
网络路由分析工具
网络问题排查
文档管理
JavaDoc
类描述
Swagger
RestltApi
网络工具
PostMan
WireShark
Fiddler
模拟慢网速
Charles
运维
show-duplicate-java-classes
find-in-jars
java开发
JAVA开发平台特点
一次编译到处运行
自带垃圾回收,使得开发者更专注在业务开发
java基础
特性
封装
主要用于属性、私有方法
抽象
面向对象
继承
代码的复用
多态
动态绑定
动态连接
动态调用
实现条件
向上转型
重写
API
容器
List
ArrayList
CopyOnWriteArrayList
写数据时,复制容器,然后写数据
LinkedList
Set
HashSet
LinkedSet
TreeSet
CopyOnWriteArraySet
Queue
ConcurrentLinkedQueue
无界非阻塞队列
ArrayBlockingQueue
先进先出,数组结构,有界
必须先初始化大小 take和put共用一把锁
LinkedBlockingQueue
先进先出,链表结构,无界
无初始化大小,take,put,锁分离
PriorityBlockingQueue
优先级排序,无界
默认升序,更改顺序,需要实现compareTo()
DelayQuere
优先级,无界阻塞
延时获取,队列元素需要实现DelayQueue接口
SynchronoisQuere
不存储元素的阻塞队列
LinkedTransgerQueue
链表结构无界阻塞
生产者put时,消费者take 生产者直接将put元素交给消费者
LinkedBlockingDeque
双向阻塞
可以再两端操作元素
工作窃取模式
Map
HashMap
底层是数组加链表、链表在元素超过7时会拓展成红黑树
默认容量为16
允许空key和空value
默认负载因子是0.75 当元素超过12 时扩容
扩容为原来的两倍
hash,将任意长度的值,映射到固定长度的值
MD5
Sha(安全哈希算法)
死锁的情况
Hashtable
通过synchronized实现线程安全
不允许值为空
12
TreeMap
底层为二叉树
有序存储
ConcurrentHashMap
线程安全,采用分段锁(jdk1.7)、底层为数组加链表加红黑树
不允许空key 和 value
jdk 8 Node数组+链表+红黑树,并发控制使用Sync 和 CAS 操作
LinkedHashMap
有序
ConcurrenSkipListMap
TreeMap 的并发实现有序Map
ConcurrenSkipListSet
TreeSet 的并发实现有序Set
注意
并发容器判断 是否为空时,使用isEmpty,通过size 需要考虑性能开销
关键字
transient
不可串行化
对变量的访问必须从共享内存刷新,最新的修改写回共享内存。可以保证字段可见性
适用一个线程写,多个线程读
底层原理:使用该变量修饰的共享变量,在执行写操作时,会多一点处理,(将当前处理器缓存行的数据回写到系统内存,这个写回内存的操作会引起在其他cpu里面缓存了该地址内存的数据失效)
可以修饰方法和代码块,保证线程对变量访问的可见性和排他性
类锁,是锁所有的对象,对象锁锁的是当前实例
首先使用偏向锁(效率和正常方法一样) 轻量锁,自旋,重量锁
基本数据类型
boolean
1字节
char
2字节
short
int
4字节
2^31 -1 - 2^31
long
8字节
double
byte
1位
float
对象引用
强
不会被GC回收
软
内存空间不足时回收
弱
每次GC时都会被回收
虚
需要和引用队列一起使用,主要用来跟踪对象被垃圾回收的过程
SPI机制
各个版本特性
1.8
Lambda
StreamApi
方法引用
接口默认方法
Metaspace 替换 permGen
1.9-1.10
模块系统
默认G1回收器
接口私有方法
局部变量推断
Graal编译器
1.11
字符串API增强 复制等功能
内置httpClient
多线程
生命周期
runnable
可以运行
blocking
waiting
stop
new
新创建,还没有调用start
取消和中断
安全中止线程
使用线程自带中断
interrupt
将线程中断标志位设置为true
isinterrupt
线程检查中断标志位
Thread.intrupedt
将中断复位为false
线程池
Executors
newFixedThreadPool
固定线程数的线程池
适用于任务数量不均匀,对内存压力不敏感,但系统负载比较敏感的场景
newSingleThreadExecutor
单线程,所有任务按照指定顺序执行
newCachedThreadPool
没有线程限制的
低延时的短期任务场景
newScheduledThreadPool
定时周期执行
newWorkSealingPool
使用ForkJoinPool,多任务队列的固定并行度,适合任务执行时长不均匀的场合
ThreadPoolExcutor核心参数
corePoolSize
当提交一个新任务到线程池,线程池会创建一个新的线程来处理,无论是其他线程是否空闲,直到需要执行的任务,大于线程池的基本大小
maximumPoolSize
线程池允许的最大线程数,如果队列满了,并且当前线程数小于最大线程数,则会新建线程
KeepAliveTime
线程空闲后保持存活的时间
TimeUnit
runnableTaskQueue
基于数组,FIFO
性能高于 Array、newFixed使用
SychronousQueue
不存储元素的阻塞队列、插入操作等到移出操作成功
具有优先级的无限阻塞队列
RejectedExecutionHandler
AbortPolicy
抛出异常
DiscardPolicy
不处理
CallerRunsPlicy
用调用者所在线程运行任务
DiscardOlderPolicy
丢弃队列里最近的一个任务
自定义
实现RejectedExecutionHandler
ThreadFactory
线程工厂
guava的ThreadFactoryBuilder来创建一个ThreadFactory可以自定义线程名称,
好处:
降低资源消耗
可回收
提升响应速度
减少创建线程、销毁时间
提高管理性
提供管理方法
监控线程执行
合理配置
计算密集
cpu数 + 1(应付页缺失)
io密集型
cpu数*2
线程优先级、一般无效
常用方法
yield
当前线程让出cpu占有权,当前线程变成可运行状态,下一刻仍然可能cpu选中,不会释放锁
wait、notify、notifyAll
Object 方法
阻塞当前线程,并且必须拥有此对象的锁
调用对象的notify方法,能唤醒正在等待这个对象锁的线程,wait和notify必须在同一个锁,而锁锁定的是对象而不是线程
join
ThreadLocal
本质是个Map,key是线程id、value是每个线程所拥有的值
线程内的共享变量
常用案例
等待、通知机制
等待方原则
1、获取对象锁
2、如果条件不满足,则继续等待
3、条件满足后,执行相关逻辑
通知方
1、获取锁
2、改变条件
3、通知所有等待的对象
等待超时模式
调用一个方法时等待一段时间,如果能在给定的时间内得到结果,则返回结果,超时则返回默认结果
CAS Compare And Swap
乐观锁,比较之后再修改
ABA问题
其他线程改变之后,又被改回去
可以引入版本号
在for(;;)里面不断进行比较,直到修改成功
原子操作类
atomic包
锁
为什么
1、非阻塞的获取锁
2、获取锁的过程可以被中断
lock.lockInterruptibly 在等待锁的过程中放弃等待,改为处理其他事情
3、超时获取锁
4、可重入锁
递归的时候可能发生,重复获取锁
5、公平锁
类型
偏向锁(无锁)
优点
加锁不需要额外的消耗,和执行非同步方法比,仅仅存在纳秒级差距
缺点
如果线程间存在锁竞争会带来额外的撤销消耗
试用竞争场景少的情况
轻量级锁 (cas)
竞争的线程不会阻塞,提高了响应速度
如果始终得不到锁,竞争的线程会始终自旋,消耗CPU
追求响应时间,同步块执行速度快
重量级(虚拟机底层实现)
竞争的线程不使用自旋,不会消耗CPU
线程阻塞,响应时间缓慢
追求吞吐量,同步块执行速度较长
共享锁
读写锁
读写、写写互斥,
互斥锁
公平锁
JUC
Lock
lock
unlock
trylock
ReentrantLock
可重复获取
ReentrantReadWriteLock
允许多个读线程,写线程用排他锁
独占锁
独占式获取同步状态
共享式获取同步状态
StampedLock
改进的读写锁,CLH队列,乐观锁,防止写饥饿
LockSupport
提供了一组公共静态方法,提供最基本的线程阻塞和唤醒
park
阻塞当前线程
uppark(thread)
唤醒对应线程
AQS
同步器(AbstractQueuedSynchronizer)
一个线程通信的抽象类
基本方法
tryAcquire
获取独占锁
tryRelese
释放独占锁
tryAcquireShared
获取共享锁
tryReleseShared
释放共享锁
isHeldExclusively
快速判断线程独占
getState
获取同步状态
setState
设置同步状态
compareAndSetState
原子的设置同步状态
同步器
同步器依赖了一个双向(先进先出的双向队列)
首节点(head)
尾节点(tail)
公平锁的实现
当发现获取不到锁时,进入等待队列
CountDownLatch
一个计数器,当数量为0时,释放所有等待
await (等待,当数量为0 时释放)
countDown(总数减一)
Exchanger
交换,线程间的数据交换
exchange 方法
一个线程执行时,会阻塞,直到另一个线程也执行
顺序执行的别样玩法
CyclicBarrier栅栏
默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量
每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。直到最后一个线程执行,完毕才会执行下一步。
CyclicBarrier还提供一个更高级的构造函数CyclicBarrier(int parties,Runnable barrierAction),用于在线程到达屏障时,优先执行barrierAction
Semaphore 信号量
每个acquire方法阻塞
每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法
控制一个资源可以同时请求的数量限制
Condition
可以用来实现等待通知
await
signal
唤醒指定消费方,提升性能,因为消费方判断也需要消耗资源
Atomic
通过unsage实现,基于CAS
LongAdder
基于cell分段锁思想,空间换时间,更适合高并发场景
框架
Spring
IOC
将bean 的实例化 交给BeanFactory,实现依赖倒置(反转)
可以方便的进行AOP增强
面向接口编程,使用者和实现者解耦
组件
BeanFatory
IOC 容器 由于存储所有的bean
FactoryBean
用来实例化Bean 的工厂类
获取bean的方式:
new
工厂方法
静态的
自由主题
成员方法
基于POJO的轻量级,最小侵入性编程
松耦合 依赖反转
声明式编程
减少样板式代码
DI(依赖注入)
会有依赖的地方
构造参数依赖
属性依赖
构造参数的存储
AOP
Aspect(切面)
Advice(通知 功能增强)
定义接口,然后通过不同的子类接口代表前置,环绕,后置,实现具体
Pointcuts(切入点 可选择要增强的方法)
Join points(连接点,可选的切入点)
Pointcut(选择的切入点)
Weaving(植入)
通过代理模式,将增强方法,注入到对应方法
代理方法的选择,使用工厂模式
使用ThreadLocak传递构造函数需要用到的参数,避免不同现场使用的参数不同
通过观察者模式在bean初始化后,将对应方法的功能增强,注入对应位置
使用:
xml 主要使用aop:config 下级配置 pointcut 用expression 表达式找到对应的 类+方法aspect 标签注解 需要插入的逻辑 并表示改逻辑是 插入在 before after AfterThrowing Aroud 等
注解 主要用 Aspect注解在类上 用@After 等注解在方法上标识要执行的方法 用Pointct 注解方法 value 为 excution表达式
Spring Cloud
Eureka
服务发现、与注册AP (高可用,分区容错性,最终一致性)
Sleuth
全链路追踪
Netflix
Config
动态配置
Bus
Security
单点登录
oauth2
jwt
并排中继
Spring boot
约定大于配置
启动流程
prepareEnvironment
准备配置文件、context的上下文,以及后置处理器
createApplicationContext
postProcessorsContext
ApplyInitializers
listeners.contextPerpared
listeners.contextLoaded
refreshContext
配置文件
bootstrap
应用程序的父上下文,先与application加载
application
注解
SpringBootApplication
SpringBootConfiguration
自动配置
EnableAutoConfiguration
Conditional
ConditionalOnBean
存在
ConditionalOnClass
ConditionalOnExpress
ConditonalOnMissingBean
缺失
ConditionalOnMissingClass
ConditionalOnNotWebApplication
模块
starter
无缝继承,自动配置
actuator
监控管理,同
devtools
开发工具支持,热部署等
cli
命令行工具
Beans
Core
Context
Web
动态替换
PropertyPlaceholderConfigure
ProperySourcesPlaceholderConfigurer
事务
隔离级别
读未提交
读已提交
可重复读
序列化
传播类型
Required (如果没有事务就新建一个,如果有就继承)
Mandatory (支持当前事务,如果没有事务就抛出异常)
Not_Supported(以非事务方式执行操作,如果当前存在事务,就把当前事务挂起)
Requires_New(新建事务,如果当前有事务,就把当前事务挂起)
Supports(支持当前事务,如果当前没有事务,就以非事务运行)
Nested(支持当前事务,新增SavePoint 点,与当前事务同步提交或回滚。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失效时,会回滚内层事务所做的动作,而内层事务操作失败并不会引起外层事务回滚)
ProPagation_Nested
scope作用域
Singleton
Prototype
每次获取都初始化一个bean
Request
Session
Application
事件机制
ContextResreshdedEvent
ContextStartedEvent
ContextStoppedEvent
ContextCloseEvent
RequestHandledEvent
Context初始化流程
prepareRefrersh
设置开始时间、激活状态、验证
ConfigurableListableBeanFactory = beanFactory= obtainFreshBeanFactory
通知子类刷新beanFactory,并获取beanFactory
prepareBeanFactory(beanFactory)
设置类加载器、后置处理器、注册默认的环境bean
postProcessBeanFactory(beanFactory)
为context的子类提供后置处理beanFactory扩展能力如果子类现在bean定义加载完成后,开始初始化上下文之前,加特殊逻辑,可以重写这个方法
invokeBeanFactoryPostProcessors
执行BF中后置处理器
1、针对bean
2、处理beanFactory
spring boot 中注解bena定义的解析
ConfigurationgClassPostProcessor
ConfigurationClassParser
ClassPathBeanDefinitionScanner
registerBeanPostProcessors
按照优先级顺序,注册bean的后置处理器
initMessagerSource
初始化 国际化信息
initApplicationEventMulticaster
初始化应用事件定义广播器(用来向applicationgListener通知各种应用产生的事件,是观察者模式)
onRefresh
留个子类的扩展步骤,用来让特定的context子类初始化其他的bean
registerListeners
把实现了applicationListener的bean注册到事件广播器,并对广播器中,没有广播的事件进行通知
finishBeanFactoryInitialization
冻结所有的bean描述信息的修改,实例化非延迟加载的单例bean
finishRefresh
完成上下文的加载
resetCommonCaches
重置公共缓存
beab的生命周期
构造函数
依赖注入
BeanNameAware
BeanFactoryAware
ApplicationContextAware
BeanPostProcesspre前置方法
InitializingBean
自定义init方法
BeanPostProcessors后置方法
DisposableBean
POJO
携带属性的
自定义destroy
扩展点
BeanFactoryPostProcessor
处理所有bean前对 bean factory 进行预处理
BeanDEfiitionRegistryPostProcessor
添加自定义的bean
BeanPostProcessor
支持在bean初始化前,后对bean进行处理
ApplicationContxtAware
可以获得Application及其中的bean
在bean创建完成,所有属性注入完成后执行
在bean销毁前执行
ApplicationListtener
用来监听产生的应用事件
SpringMvc
Struts
filter实现,按照类拦截,
Netty
mina
高性能NIO(异步事件驱动)框架
多种decoder/encoder支持TCP粘包/分包
池化ByteBufs
减少不必要对象创建,GC友好
对象零拷贝
对消息的处理采用串行无锁化设计,提供TCP/UDP/文件的支持
主要概念
Channel
由socket封装
ChannelHandler
对接受的消息进行处理
ChannelPipeline
一组Handler顺序链接组成了Pipeline责任链模式
EventLoop
一个Channel产生的所有事件,交给一个EventLoop线程串行处理
Bootstrap
串联所有的netty组件,是所有netter应用的起点
线程模式
BossEventLoopGroup
Socket
零内存复制版(ZC)
使用堆外内存进行socket读写
避免堆内和堆外进行对象的频繁复制
CompositeByteBuf减少多buffer合并复制
FileRegion文件传输
请求的粘包与半包
FixedLengthFrameDecoder
固定大小数据包
LineBasedFrameDecoder
适合对文本进行按行分包
DelimiterBaseFrameDecoder
适合对特殊字符进行分包标记
LengthFieldBaseFrameDecoder
支持复杂的自定义协议分包
netty3与netty4的区别
线程处理模型不同
池化的ByteBufs
GC更友好
串行无锁话处理
RPC
Dubbo
服务治理能力,随机,轮询、权重调用优先等多种负载均衡策略自动服务注册与订阅,可视化服务治理,基于TCP私有协议
私有协议实现
mina、netty、grizzy
默认采用单一长连接和NIO异步通信
1、传入传出参数数据包较小2、消费者比提供者多3、常规远程服务方法调用4、不适合传输大数据量的服务比如文件、视频
支持的协议
1、dubbo(默认)2、RMI3、hession (Caucho开源的RPC)4、http5、webservice6、thrift7、memcached8、redis9、rest
层级
1、service层:给服务者和实现者实现接口 2、config 配置层:主要对dubbo进行配置3、proxy 层:透明生成客户端的stub和服务端的skeleton4、register 层:负责服务的注册发现5、cluster :集群层负责 各个服务间的负载均衡6、monitor :监控 对rpc的调用次数和调用时间进行监控7、protocol : 远程调用层封装rpc 调用8、exchange : 信息交换层, 封装请求响应模式,同步转异步9、transport :网络传输层,抽象mina netty 为统一接口10、 serialize : 数据序列化层
流程
provide 向注册中心consumer 从注册中心订阅服务,注册中心会通知consumer 注册好服务consumer 调用providerconsumer 和 provider 都异步的通知监控
Grpc
Motan
角色
客户端
订阅注册中心服务
注册中心
通知客户端,服务状态
服务端
与注册中心保持长连接/心跳,确认服务可用
信息采集监控
管理模块
Shiro
ORM
Hibernate
数据库结构完整封装,较笨重,学习成本很高
符合JPA规范
Mybatis
通过配置文件或注解,生成sql,简单高效、sql与代码解耦,sql调用领用,sql调优灵活
半自动ORM、数据库移植性差
缓存
一级缓存
默认开启。基于HashMap实现,作用域是session
二级缓存
作用域是Mapper、支持ehcache等实现,
剔除策略
刷新间隔
缓存数量
应用
预防sql注入
使用 #{}占位符,sql预编译
获取自增id
key prapt配置 、 select key
动态sql标签
for each/ where
执行流程
主要对象
SqlSessionFactory
用于生成session 一个maper文件对应一个factory
SqlSession
非线程安全,每一次调用之后需要通过close进行关闭
Executor
执行增删改查操作
StatementHandler
ParameteHandler
ResultHandler
TypeHandler
插件机制
拦截链
作用点
Excutor
ParameterHandler
ResultSetHandler
常用插件
mybatis-pagehelper
数据库
mysql
主从复制原理
binlog日志复制
常用语句
条件查询
关联查询
排序查询
分组查询
逻辑关键字
函数
数据类型
整数
浮点
字符串
二进制
引擎
MyIASM
全文检索,查询效率高,不支持事务,表级锁
InnoDB
支持事务,支持外键,支持行级锁,并发访问了效率高
ToKuDB
非常快的写速度,支持压缩存储,在线添加索引,而不影响写操作,适合归档数据,
表锁
加锁快
行级锁
并发效率高
排他锁
索引
唯一
值唯一,可以为空值,保证值的唯一性
主键
特殊的唯一索引
普通
值唯一,可以为空值
联合
多个列组成的索引, 最左原则,查询时顺序应该和索引顺序一致(如果是全部索引都用到了,则会优化成顺序,如果有> 这类断点,后面的索引字段就会失效)
全文
实现
B-Tree
适合大于或小于的范围
R-Tree
对地理位置,进行空间索引
散列表,比较少
FullText
关键字,倒排索引
存储过程和函数
新特性
默认UTF-8编码
隐藏索引
通用表表达式
窗口函数
sql优化
查看慢日志
explain查看执行计划
优化SQL查询
参数优化
表结构与索引
中间件
Mycat
Shrading-Sphere
关系数据库
NoSql
redis
分布式锁
MongoDB
表结构不确定、没有强事务
Hbase
HDFS文件系统,面向列,写多读少
Cassandra
pika
类redis,解决大容量存储
NewSql
TiDB
兼容mysql
OceabBase
金融级可靠性,
事务类型
扁平事务
带保存点的扁平事务
嵌套事务
分布式事务
范式
第一
表中字段不可拆分
第二
表中其他字段依赖主键
第三
所有属性,直接依赖主键
MQ
解耦
通信
异步任务
削峰填谷
消息广播
常见问题
消息协议
JMS
java 消息服务接口
AMQP
高级消息队列协议、跨语言
常用mq
RabbitMQ
重量级、W
ActiveMQ
代理模式
RocketMQ
10W,高可用,高性能
Kafka
10W,一写多读,消息会被重复消费,但是不会丢失
Produce
Consumer
Consumer Group
Cluster
Broker
patition
Topic
patition结构
文件夹
.index
.log
存储messager
.timeindex
segment+有序offset+稀疏索引+二分查找+顺序查找
replication
Messager
消息体
消息大小
offset
压缩类型
acks
0 、不需要等待响应
1、需要leader响应
all、需要所有follower都完成同步才响应
如果不存在topic 会自动创建topic 分区和副本都是1
存储策略
删除策略 默认配置是 7天
基于大小 默认配置是 1073741824
消费策略
消费者组内不同的消费者可以消费同一个topic下的不同分区,但是不会组内多个消费者消费同一个分区的数据
建议消费者组内的消费者数量小于等于分区数量
事务定义
最多一次:不会重复发送,但是可能丢失最少一次:不会丢失,但是可能会重复发送精确一次:
设计模式
快的原理
无线程间,切换开销
底层根据
多路复用机制
纯内存操作
单线程异步IO
支持持久化
多数据结构
主从模式
线程模型
基于reactor模式开发的网络事件处理器,文件事件处理器由一个线程监听所有socket ,不同的socket 对应不同的handler
IO多路复用器,文件事件分派器,时间处理器
问题
String
hash
list
简单队列实现
set
去重
treeset
分数,排序
功能
bitmap(bit位图)
按照bit位实现存储信息,可以用来实现布隆过滤器
hyperLogLog
不精确的去重统计功能,(大规模数据的去重)
geospatial
地理位置计算
pub/sub
pipeline
批量指令
lua脚本
数据持久化
AOF
文本日志
容量占用大效率慢
RDB
快照保存
短时间不可用
高并发
一主多从 一主写入,多从读取
当slave 启动时,slave 会发送一个PSYNC命令给master 如果是第一次连接则同步全量数据,如果不是,则同步增量数据开始全能同步时,master 会启动一个后台线程,生成一份RDB文件,同时会将写命令缓存到内存中,文件发送给slaveslave 会想将收到的RDB文件写入磁盘然后加载到内存,如果是多个slave同时请求,只会将这一份RDB文件传给所有的slave
断点续传:master 和slave 都会保存一个 replica offset 还有一个master id offset 保存在backlog 如果网络中断,会从offset 点开始复制无磁盘复制:RDB 文件不会落盘,直接发送给slave过期key处理:slave 不会过期key 只会等待master 过期key,如果master 删除key 会同步一条命令发送给slave
高可用
主从+哨兵机制
哨兵机制
Sentinel
选主策略
哨兵机制(本身也是集群的)至少三个哨兵、不能保证数据零丢失
集群监控:监控master 和slave 进程是否正常工作消息通知:如果某个实例有问题,发送消息通知管理员故障转移:如果master node 挂掉,会自动转移到slave mode配置中心:如果故障发生了,通知client 客户端新的master 地址
哨兵之间通过pub/sub 实现 每个哨兵都会往channer 里面发送一个消息,所有的哨兵会消费消息每个哨兵每隔两秒会往监控的_sentinel发送消息,内容是自己的ip和host 和runid 还有对应master的监控配置
和master 断开的时长 slave的优先级、复制offset、runid
数据丢失
异步同步数据,可能产生数据丢失,在数据未同步完成时,master 就挂掉了
脑裂导致: 当master 网络中断,哨兵开始选举时,client未及时收到换主的消息
问题解决: 必须有一个slave 数据复制和同步时间不能超过10smin-slaves-to-write 1min-slaves-max-lag 10
主从同步
master选举
redis cluster 主要针对海量数据,高并发,高可用
支撑N个 redis naster node, 每个master node 都可以挂在多个slave node
读写分离,写到master 读从slave 读高可用,每个master 都有slave 如果master 出问题了, 自动将某个slave 切换成master
key失效机制
主动失效
被动失效
淘汰机制
voltile-lru
设置了过期时间的,最近最少使用
voltile-ttl
过期时间顺序
voltile-random
设置了过期时间的,随机删除
allkeys-lru
最近最少使用
缓存访问符合幂等分布,既存在相对热点数据
allkeys-random
随机所有键
访问概念相等时
no-eviction
不剔除、直接报错
4.0、5.0新特性
Module
Stream
PSYNC 2.0
混合RDB-AOF 持久化格式
memcache(mc)
内存结构
slab
chunk
钙化问题
数据结构产生变化,导致chunk
开启automove,定时调整slab
失效与剔除机制
限制
key小于250B
value小于1m
过期时间小于30天
本地(性能最高)
ehcache
多级缓存
淘汰策略
FIFO
先入先出
LRU
LFU
最近使用频率最低
缓存问题
缓存不一致
丢失更新、同步时master挂掉,脑裂情况,出现两个master
缓存更新
1、先更新缓存,后更新数据库,(如果修改数据库失败,则会造成数据不一致)2、先删除缓存,再更新数据库, (高并发下,缓存删除了,再更新数据库前,又有请求填充了缓存,产生数据不一致)3、数据变更和更新缓存,串行化处理,更新数据前先清空缓存,当获取缓存为空时,向队列新增一个更新缓存的操作(需要考虑缓存更新的频度,如果数据更新频繁,可能会导致读请求,直接请求数据库,而导致数据库崩溃,读请求并发过高时、热点数据,导致请求倾斜)
缓存击穿
缓存雪崩
缓存出现宕机,导致查询数据库,导致数据库崩溃、数据库启动后马上崩溃
事前:保证高可用 (哨兵或者cluster) redis 数据持久化方便后期恢复数据事中:本地ehcache缓存 + hystrix 限流+降级 避免数据库 重启后直接被打死事后:数据恢复,想启动缓存,再启动数据库
分支主题
0 条评论
回复 删除
下一页