1.Redis的有哪些模式?Redis的击穿、雪崩和穿透,redis主从原理
Redis基础++
2.Servlet是什么东西?
server applet 运行在服务端的小程序
狭义指一个servlet接口,广义指实现servlet接口的Java程序,sun公司提供一门开发动态web资源的技术
生命周期
Servlet的生命周期
1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
2.创建:通过调用Servlet的构造函数来创建一个Servlet实例
3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。
4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程来处理该请求。接着调用Servlet的
Service()方法来响应客户端请求(Service方***根据请求的method属性来调用doGet()和doPost())
5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
1.创建 init方法只执行一次 说明一个Servlet在内存中只存在一个对象,Servlet是单例的
2.提供服务:创建一个请求Request对象,处理客户端请求 创建一个Response响应对象,响应客户端请求
执行service方法,传递请求和响应对象作为参数,执行多次
* 每次访问Servlet时,Service方法都会被调用一次。
3.销毁:destroy 只执行一次。 只有服务器正常关闭时,才会执行destroy方法。
Servlet的体系结构
Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类
HttpServlet:对http协议的一种封装,简化操作
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
3.MQ怎么知道消息被指定的消费者消费?怎么使不同的生产者生产的消息被不同的消费者消费?mq中一条消息出现了异常,怎么处理
1.MQ怎么知道消息被指定的消费者消费?
消息一旦被消费者接收,队列中的消息就会被删除。
RabbitMQ有一个ACK机制。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:
- 自动ACK:消息一旦被接收,消费者自动发送ACK
- 手动ACK:消息接收后,不会发送ACK,需要手动调用
2.怎么使不同的生产者生产的消息被不同的消费者消费
订阅模型-定向Direct:routing key(路由key)
Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列
连接对象Connection获得通道对象
queueBind()指定队列名,交换机名,routing key
// 绑定队列到交换机,同时指定需要订阅的routing key。订阅 insert、update、delete
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "insert");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "update");
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "delete");
订阅模型-通配符Topic
与定向模式相似,Topic
类型Exchange
可以让队列在绑定Routing key
的时候使用通配符
#
:匹配一个或多个词
*
:匹配不多不少恰好1个词
// 绑定队列到交换机,同时指定需要订阅的routing key。订阅 insert、update、delete
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "item.*");
3.mq中一条消息出现了异常,怎么处理
事务消息,好难
4.GC算法都有哪些?他们之间的区别是什么?各自的适用场景?
各自原理 | 适用场景 | |
---|---|---|
引用计数法 | 引用成功一次对象计数器+1,失败-1,为0时回收 | 无 |
标记-清楚法 | 根节点开始标记引用对象,未被标记的对象是垃圾对象,回收 | 老年代 |
标记-压缩法 | 先从根节点标记的引用对象,后将标记对象和未被标记对象压缩到内存一段,清楚垃圾 | 老年代 |
复制算法 | 内存一分为二,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。 | 年轻代 |
四种垃圾收集器
串行垃圾收集器
单线程垃圾回收
并行垃圾收集器
多线程垃圾回收
CMS垃圾收集器
并发,标记-清除算法,针对老年代垃圾回收,通过参数-XX:+UseConcMarkSweepGC进行设置
G1垃圾收集器
- 第一步,开启G1垃圾收集器 -XX:+UseG1GC
- 第二步,设置堆的最大内存 -Xmx1024m
- 第三步,设置最大的停顿时间
三种模式 Young GC、Mixed GC、Full GC
最大的区别在于它取消了年轻代、老年代的物理 划分,取而代之的是将堆划分为若干个区域(Region)
在G1中,有一种特殊的区域,叫Humongous区域。存储巨型对象
5.mysql对哪些建立索引?调优
所谓索引就是为特定的mysql字段进行一些特定的算法排序,比如b+/b-二叉树的算法和哈希算法
哈希算法是通过建立特征值,然后根据特征值来快速查找。
mysql默认的就是二叉树算法,建立索引的字段,比如扫描20行就能得到未使用前扫描了2^20行的结果。
创建索引 create index indexName on table_name(column_name)
修改表结构添加索引 alter table table_name add index indexName(column_name)
删除索引 drop index indexName on table_name
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8、频繁进行数据操作的表,不要建立太多的索引;
9、删除无用的索引,避免对执行计划造成负面影响;
优化
explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
Explain select * from blog where false;
6.知道哪些锁?公平锁和非公平锁区别?可重入锁是什么?我说是sychronized里还有个synchronized
7.为什么JVM要分为堆、方法区等?原理是什么?
1.方便JVM去调用和进行内存管理
堆,栈,方法区等都有自己特有的内存管理方式,都有自己合适存储的内容
不同的存储结构效率是不一样的,使用价值也不一样。编译原理
2.方便共享通信
堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)
这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。
堆
堆Heap:储存new出来的东西,每个new出来的东西都有地址值bai,java中不允许直接访问堆内存的du对象,只能通过引用访问。还有字符串常量池,非对象的String普通字符串存储在常量池中
在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。
栈
栈Stack:方法运行环境,存放方法的局部变量
栈是运行时的单位,而堆是存储的单位。
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
8.jvm调优调的哪些参数?我说初始堆大小和最大堆大小一样,问这样有什么好处?在哪里写这些参数
jvm的运行参数
- 标准参数 -help -version
- -X参数 -Xint -Xcomp
- -XX参数 -XX:newSize -XX:+UseSerialGC 经常使用
-Xms和-Xmx参数
-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xms512m:等价于-XX:InitialHeapSize 设置jvm初始堆内存512M
-Xmx2048m:等价于-XX:MaxHeapSize,设置jvm最大堆内存2048
[root@node01 test]# java ‐Xms512m ‐Xmx2048m TestJVM
9.引入第三方登录时,怎么使得你自己的token和第三方的token关联起来?
Cookie
cookie 是一个非常具体的东西,指的就是浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能。
cookie由服务器生成,发送给浏览器,浏览器把cookie以kv形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该cookie发送给服务器。
Session
服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了.
服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。
Token
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
OAuth2.0授权码模式
第三方登录实现原理
- 1.获得授权码
- 2.通过授权码那令牌
- 3.通过令牌拿资源