1、redis怎么失效过期key
在Redis中,对于过期key的清理主要有惰性清除,定时清理,内存不够时清理三种方法
(1)惰性清除:在访问key时,如果发现key已经过期,那么会将key删除
(2)定时清理:Redis配置项hz定义了serverCron任务的执行周期,默认每次清理时间为25ms,每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除,如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db
(3)内存不够时清理:当执行写入命令时,如果发现内存不够,那么就会按照配置的淘汰策略清理内存,淘汰策略一般有6种,Redis4.0版本后又增加了2种,主要由分为三类
第一类 不处理,等报错(默认的配置)
第二类 从所有结果集中的key中挑选,进行淘汰
第三类 从设置了过期时间的key中挑选,进行淘汰
2、Spring有哪些组件
Spring总共有十几个组件,但真正核心的只有三个:Core、Context和Bean。
(1)、Beans
Spring 使用工厂模式来管理程序中使用的对象(Bean),Bean 工厂最上层的接口为 BeanFactory,简单来看,工厂就是根据需要返回相应的 Bean 实例。Spring 结合控制反转和依赖注入为客户端提供所需的实例
(2)、Context
Context 组件借助上述的控制反转和依赖注入,协助实现了 Spring 的 Ioc 容器
(3)、Core
Spring Core 组件提供 ResourceLoader 接口,便于读入 xml 文件或其他资源文件
3、Spring IOC的原理
核心思想是:IOC控制反转,用来实现对象之间的解耦
(1)、IOC控制反转
当使用IOC容器之后,对象A和B之间失去了直接联系,对象A如果想使用对象B的功能方法,IOC容器会自动创建一个对象B实例注入到对象A需要的功能模块中,这样对象A失去了主动控制权,也就是控制反转
(2)、依赖注入
IOC给对象直接建立关系的动作,称为DI依赖注入(Dependency Injection);依赖:对象A需要使用对象B的功能,则称对象A依赖对象B。注入:在对象A中实例化对象B,从而使用对象B的功能,该动作称为注入
4、Fileter 和 Interceptor
- Filter是基于函数回调的,而Interceptor则是基于Java反射的。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次
Filter和Interceptor的执行顺序
过滤前-拦截前-action执行-拦截后-过滤后
5、jdk和cglib的区别
(1)、JDK 动态代理本质上是实现了被代理对象的接口,而 Cglib 本质上是继承了被代理对象,覆盖其中的方法。
(2)、JDK 动态代理只能对实现了接口的类生成代理,Cglib 则没有这个限制。但是 Cglib 因为使用继承实现,所以 Cglib 无法代理被 final 修饰的方法或类。
(3)、在调用代理方法上,JDK 是通过反射机制调用,Cglib是通过FastClass 机制直接调用。FastClass 简单的理解,就是使用 index 作为入参,可以直接定位到要调用的方法直接进行调用。
(4)、在性能上,JDK1.7 之前,由于使用了 FastClass 机制,Cglib 在执行效率上比 JDK 快,但是随着 JDK 动态代理的不断优化,从 JDK 1.7 开始,JDK 动态代理已经明显比 Cglib 更快了。
6、工厂模式和建设者模式的区别
(1)工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
(2)建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节, 组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
可以比较两个模式的example代码,一比较就会比较出来,工厂模式关心整体,建造者模式关心细节。
7、http中Context-Type 和 Accept的区别
(1). 类型不同
类型不同Accept属于请求头, Content-Type属于实体头。
Http报头分为通用报头,请求报头,响应报头和实体报头。
- 请求方的HTTP报头结构:通用报头|请求报头|实体报头
- 响应方的HTTP报头结构:通用报头|响应报头|实体报头
(2). 作用不同
Accept代表发送端(客户端)希望接受的数据类型。 比如:Accept:text/xml; 代表客户端希望接受的数据类型是xml类型。
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。 比如:Content-Type:text/html; 代表发送端发送的数据格式是html。
二者合起来, Accept:text/xml; Content-Type:text/html ,即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html
8、Dobbo的rpc实现原理是什么
节点角色说明:
- Provider: 暴露服务的服务提供方。
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container: 服务运行容器。
调用关系说明:
- 0. 服务容器负责启动,加载,运行服务提供者。
- 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
- 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo通过长连接减少握手,通过NIO及线程池在单连接上并发拼包处理消息,通过二进制流压缩数据,比常规HTTP等短连接协议更快
9、dipatcherservlet是线程安全的吗
10、所有的MQ都遵循同一个原则是什么
AMQP 是 Advanced Message Queuing Protocol,即高级消息队列协议
11、请讲一讲ThreadLocal的底层实现原理以及应用场景
12、dubbo实现原理,对比springcloud为什么快,使用的是什么rpc框架
13、java8新特性
14、数据库行转列
15、线程池底层原理
线程池的链表是使用什么链表
16、Eureka down了后,服务还能用么?
17、接口限流1000,怎么做控制,用什么限流算法
18、ReentrantLock 与 synchronized的区别
19、SpringBean的生命周期
20、SpringBean单例和多例
21、联合索引abc三个字段,怎么知道abc索引有效使用到
22、服务变慢了,怎么排查
23、ConCurrentHashMap
24、线程隔离和信号量隔离的区别以及原理
25、数据库锁,什么情况会导致死锁吗,怎么知道是否有行锁