REVIEW
TODO #
- [x] 垃圾回收器和算法
- [ ] spring,springmvc,springboot,springcloud
- [x] 熔断,限流
- [ ] netty
- [ ] 自己代码的一些实现【activemq】【线程网络监听】【nettydemo】
- [ ] beanfactory ,factorybean
- [ ] spring bean 初始化,声明周期
- [ ] springmvc 流程
- [ ] mysql 索引【btree b+ tree 】 ,,索引存储结构
- [ ] redis 存储结构
- [ ] 线程池拒绝策略
- [ ] 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
```
deleting proxy.pac
deleting include_robots
deleting include_ico
deleting favicon.ico
deleting docker.html
deleting _service_.html
deleting 50x.html
deleting 404.html
./
```
数据库 #
redis 链接 #
事务介绍(transaction) #
事务:一个最小的不可再分的工作单元;通常一个事务对应一个完成的业务(例如银行账户转账业务)
一个完成的业务需要批量的DML(insert,update,delete)语句共同完成事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同DML语句的个数不同事务的四大特征(ACID)
原子性(A):事务是最小单位,不可再分一致性(C):事务执行前后数据库状态保持一致隔离性(I):事务A和事务B之间具有隔离性,一个操作不会影响到另外一个持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)事务的执行,状态,和操作
在mysql中,默认事务是自动提交的,也就是说,只要执行了一条DML语句就开启了事务,并且提交了事务以上自动提交机制是可以关闭的事务成功
mysql>start transaction;#手动开启事务mysql>insert/update/deletemysql>commit;#commit之后即可改变磁盘文件中的数据事务失败
mysql>start transaction;mysql>insert/update/delete;mysql>rollback;事务操作
set autocommit=0;#当前session禁用自动提交事务,自此每次都需要显示的commitshow variables like ‘%autocom%’;start transaction;commit;rollback;select @@tx_isolation;select @@global.tx_isolation;set [global] transaction isolation level repeatable read;设置隔离级别一定在事务开启之前,并且上面设置支队当前连接或者黑窗口有效。mysql数据库提供的四种事务隔离级别 #
读未提交(read uncommitted)
事务A和事务B,事务A未提交的数据,事务B可以读到
这里读取到的数据叫做“脏数据”这种隔离级别最低,这种级别一般在理论上存在,数据库的一般都高于这个级别读已提交(read committed)
事务A和事务B,事务A提交的数据,事务B才能读取到
这种隔离级别可以避免脏数据这种级别会导致不可重复读,oracle数据库默认隔离级别@不可重复读:B读取一条记录,A修改后提交,B可以读取到,发现和刚才不一致可重复读(repeatable read)
事务A和事务B,事务A提交之后的数据,事务B读取不到
这个隔离级别可以可以避免不可重复读但是会出现幻读,mysql默认隔离级别。@幻读:A事务插入一条记录x并且提交,B读取记录,发现为empty。由于B读取不到,所以继续插入x,此时会报重复主键异常。B感觉很虚幻,明明刚才没有。串行化(serializable)
事务A和事务B,事务A在操作数据库时,事务B只能排队等待
这中隔离级别很少使用,吞吐量太低,用户体验太差
主从复制 #
概念
将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行;从而使得主从数据库保持一致。
基本原理:mysql支持单向,异步复制,复制过程中一个服务器充当主服务器,而一个或多个充当从服务器,当一个从服务器连接到主服务器时,它通知主服务器从最后一次更新成功的位置,从服务器接受从那时更新的任何数据,并在本地执行相同的更新。作用
主数据库出现问题,可以切换到从数据库
可以进行数据库层面的读写分离可以在从数据库上进行日志备份。过程
Binary log: 主数据库的二进制日志
Relay log: 从服务器的中继日志第一步:master在每个事务更新数据完成之前,将该操作记录串行的写到binlog中第二部:slave开启一个I/O thread,该线程在master打开一个普通链接,主要工作是binlog dump process.如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件,I/O thread 的最终目的是将这些时间写入到中继日志中。第三步:从服务器的SQLthread读取中继日志,并顺序执行该日志中的sql事件。具体操作
主从复制分别做一下操作
- 1.1,版本一致
- 1.2,初始化表,并在后台启动mysql
- 1.3,修改root的密码
修改主服务器master
修改从服务器slave
重启两台服务器的mysql
在主服务器上建立账户并授权slave
登录主服务器的mysql,查询master状态
配置从服务器slave
检查从服务器复制功能状态
读写分离 #
- 在主从复制的基础上进行读写分离
- 两种路有方法,第一种是第三方工具(MaxScale,amonde,Mysql_Proxy),第二中是应用路有
存储过程,触发器 #
数据库索引 #
一般使用平衡树(多路搜索树)【BTREE,B+Tree】 建立索引后,会影响where后面字段的查询速度,不用全表扫描,一般在where和join中的出现的列需要建立索引。但是并不是所有情况 ,因为mysql只对,<,<=,=,>,>=,Between,in,以及某些时候的like才会使用索引。(%,_)
- 普通索引(hash索引,全文索引,R_TREE索引)
- 唯一索引(索引列值必须唯一,但允许有NULL值)
- 主键索引(一种特殊的唯一索引,不允许有NULL值)
- 复合索引(多个单值索引,自动选取它认为最有效的。【 最左前缀】)
- 聚集索引,非聚集索引
- 注意事项(会使索引失效)
- 不要在索引列上进行计算
- 不要使用Not in,<>等操作
- 不足之处(1,影响更新的速度,2.需要给索引建立额外的磁盘空间)
mysql优化 #
- 选取最适用的字段属性
- 适用连接(JOIN)来代替子查询
- 使用联合(union)来代替手动创建的临时表
- 事务
- 锁定表
- 使用外键
- 使用索引
- 优化查询语句
- 选取最适用的字段属性
执行计划(explain) #
通过explain命令我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。
reference #
java基础 #
线程,线程池,FutureTask #
过滤器和拦截器 #
ElasticSearch #
netty [doug lea描述] #
netty 是什么?
Netty 是一个 基于 NIO的client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。
它极大地简化并优化了 TCP 和 UDP套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。支持多种协议 如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议。为什么要用netty?
统一的 API,支持多种传输类型,阻塞和非阻塞的。
简单而强大的线程模型。自带编解码器解决 TCP 粘包/拆包问题。自带各种协议栈。真正的无连接数据包套接字支持。比直接使用 Java 核心 API 有更高的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。安全性不错,有完整的 SSL/TLS 以及 StartTLS 支持。社区活跃 成熟稳定,经历了大型项目的使用和考验,而且很多开源项目都使用到了 Netty, 比如我们经常接触的 Dubbo、RocketMQ 等等。netty 应用场景
作为 RPC 框架的网络通信工具
实现一个自己的 HTTP 服务器实现一个即时通讯系统实现消息推送系统netty 核心组件有哪些?分别有什么作用
EventloopGroup了解么?和Eventloop有什么关系?
BootStrap和ServerBootStrap了解么?
NioEventLoopGroup 默认的构造函数会起多少线程?
Netty 线程模型了解吗?
netty 服务端和客户端的启动过过程了解吗?
netty 长链接和心跳机制?
netty 零拷贝?
netty中空轮询BUG
原因:Selector轮询结果为空,且没有wakeup或者新消息处理,就会触发空轮询,cpu100%
解决:对select操作周期进行统计,设置阈值(512),超过的话,将原来Selector上面注册的SocketChannel移至新的Selector上面,并把旧的关闭。
玛氏病IO总结 #
zookeeper #
zookeeper概述
分布式协调服务框架
常用命令
command function help 显示所有命令操作 ls path [watch] 使用ls 命令来查看当前znode中所包含的内容 ls2 path [watch] 查看当前节点数据,并能看到更新次数等数据 create 普通创建 -s 含有序列,-e 临时(重启或者超时消失) get path [watch] 获得节点值 set 设置节点具体值 stat 查看节点状态 delete 删除节点 rmr 递归删除节点 应用场景
- 统一命名服务(类似于dns)
- 统一配置管理(将配置注册到znode上,各个客户端进行监听)
- 统一集群管理(将服务器信息写入一个znode中,继续监听)
- 软负载均衡()
- 分布式锁
zookeeper内部原理
- 3.1 选举机制
- 节点类型
- Stat结构体
- 监听原理
- 写数据流程
真实面试题
- 简述zookeeper的选举机制
- zookeeper的监听原理是什么?
- zookeeper的部署方式有哪几种?
- zookeeper常用命令
tomcat #
整体架构
- Connector(【coyote】处理socket连接,负责网络字节流)
- Container(【Catalina】加载servlet处理具体请求)
启动流程
先是初始化
BootStrap->Calaline->Server->ServiceBootStrap->Calaline->Server->Service->[Engine->Host->Context]BootStrap->Calaline->Server->Service->[Executor]BootStrap->Calaline->Server->Service->[ProtocalHandler]然后调用start启动整个tomcatI/O模型和协议
- BIO,NIO,AIO(NIO2),APR
- HTTP/1.1,HTTP/2,AJP(用于和apache服务器集成用来处理静态资源)
Jasper引擎
index.jsp -> jspServlet(找到文件) -> 渲染成servlet.class-> 加载调用
Context
官方不建议直接在server.xml中配置,因为,server.xml文件只会在tomcat重新的时候重新加载。
- 1, In an individual file at /META-INF/context.xml inside the application files
- 2, In individual files (with a “.xml” extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory
- 3, Inside a Host element in the main conf/server.xml.
安全
- 删除webapp下面的管理页面和其他项目
- 禁用server-user.xml里面的权限或者直接删除
- 修改tomcat默认关机指令,或者禁用
- 配置错误页面。
各种锁,自旋锁,偏向锁(CAS) #
偏向锁 –> 自旋锁(无锁)(CAS)–> sync(重量级锁)
偏向锁设计涞源,根据工业统计,百分之七八十的情况下都是单线程在操作,剩下的情况是多个线程,所以首次过来使用的线程会将自己的线程ID写入对象头,表示正在占用,剩余线程过来的时候,去除此标志,然后自旋等待。据说设计挺复杂。JUC里面大量使用自旋锁,比如AtomicInteger方法自增的时候,调用increaseandset()–>native方法,通过查看hotspotCpp源码,发现这个方法体里面是汇编实现的,通过汇编指令,comxchan,单个cpu的话,这个操作就是原子性的,但是多个处理器的话,就保证不了了,所以汇编代码里面又添加了前缀指令,lock-if_mp,专门处理,mutil process这种情况。JDK1.5以后,sync优化了,存在锁升级的过程。所以能用synchronized解决的,尽量用synchronized。I/O #
type implements InputStream ByteArrayInputStreamPipedInputStreamFileInputStreamObjectInputStreamFilterInputStream –> BufferedInputStream——————–> DataInputStream OutputStream ByteArrayOutputStreamPipedOutputStreamFileOutputStreamObjectOutputStreamFilterOutputStream –> BufferedOutputStream———————-> DataOutputStream———————-> ==PrintStream== Reader CharArrayReaderPipedReaderFilterReaderBufferedReaderInputStreamReader –> FileReader Writer CharArrayWriterPipedWriterFilterWriterBufferedWriterOutputStreamWriter –> FileWriter==PrintWriter== 深浅拷贝(两种方式) #
- 实现Cloneable接口并重写clone方法
- 通过序列化的方式完成深拷贝
- 实现Cloneable接口并重写clone方法
spring啊(IOC,AOP) #
springboot启动流程 #
spring bean 初始化流程 #
一二三级缓存
srping 事务 #
事务传播机制(七种)
name intro propagation_never 没有正常执行,有抛异常 propagation_not_supported 没有正常执行,有挂起 propagation_supports 没有正常执行,有就用 propagation_requires_new 没有新建,有新建&&挂起原来的 propagation_nested 没有新建,有内嵌原来的 propagation_required 没有新建,有加入原来的 propagation_mandatory 没有抛异常,有使用原来的 spring循环依赖 #
spring异常 #
FactoryBean,BeanFactory #
BeanFactory是Spring容器的顶级接口,生产和管理bean,是容器的基本规范。
FactoryBean 用来实现一个工厂bean 对象。自定义复杂bean逻辑,通过getObject 获取修饰的bean对象,使用’&‘可以获取到这个bean对象。
mybatis #
熔断,限流 #
Reference #
- https://zhuanlan.zhihu.com/p/358995096
- https://www.cnblogs.com/hero123/p/8889790.html
- https://blog.csdn.net/myydnz/article/details/131473266
- https://zhuanlan.zhihu.com/p/588366958
- https://baijiahao.baidu.com/s?id=1701167160625876534&wfr=spider&for=pc
- https://www.jianshu.com/p/dd215ead6e2e
- https://blog.csdn.net/Javaesandyou/article/details/131896223