1、redis为什么读取的那么快?
1.完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2.采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
3.使用多路I/O复用模型,非阻塞IO。
2、springBean的注入方式有哪几种?
构造方法注入:构造方法注入是指在构造方法中注入属性或者对象来实现依赖注入。
SET方法注入:set方法注入就是通过在类中实现get、set方法来实现属性或者对象的依赖注入。
注解注入:@Autowired注解可以实现自动装配,只要在对应的属性上标记该注解,但是@Autowired注解只按照byType注入。@Resource注解可以实现自动装配,它有两个重要属性name和type,name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。@Autowired注解和@Resource注解的作用相同,只不过@Autowired按照byType注入,如果@Autowired想使用名称可以结合@Qualifier注解进行使用。
3、mybatis动态sql标签有哪些?
IF标签:在开发中有时候我们会有很多条件查询,而这些条件我们可填也可不填,这个时候我们可以使用IF标签来解决。
trim标签:trim可以帮我们完成后面多出的and或者or、where标签不能解决,还可以用来切除字符串等等。
Choose:它和case when功能差不多,都是只会走一种,不管when条件里面有几个满足了,都只走第一个,如果when所有条件都没有满足,就会走otherwise。
foreach标签:foreach循环遍历的意思,一般可用于查询,或者批量新增等功能。
4、BIO、NIO、AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
5、Hashmap和hashtable的区别?
1、HashMap 是非线程安全的,HashTable 是线程安全的。
2、HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。
3、因为线程安全的问题,HashMap 效率比 HashTable 的要高。
4、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线程环境,而 Hashtable 适合于多线程环境。一般现在不建议用 HashTable, ①是 HashTable 是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,现在也有同步的 ConcurrentHashMap 替代,没有必要因为是多线程而用HashTable。
6、线程池的核心参数?
corePoolSize:核心线程池的大小
maximumPoolSize:线程池能创建线程的最大个数
keepAliveTime:空闲线程存活时间
unit:时间单位,为keepAliveTime指定时间单位
workQueue:阻塞队列,用于保存任务的阻塞队列
threadFactory:创建线程的工程类
handler:饱和策略(拒绝策略)
7、数据库索引的实现原理?
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
8、你们项目多少人?
这里只是作为举例哦!
根据项目业务难易程度、周期等人员都会有所不同,所以可以结合自己的项目情况来说。
9、Dubbo在你们项目中怎么用的?
dubbo在我们项目中主要用来实现不同系统之间的服务调用,由于我们项目是按照不同的功能分了不同的系统,按照三层架构又分了不同的服务,其中三层架构中的控制层作为服务的消费方,业务层和持久层共同作为服务的发布方,这样的架构实现了系统的服务化,提高了开发效率,实现了业务的解耦。
项目中通过dubbo和spring的整合,采用全spring配置方式,只需要用spring来加载dubbo的配置,完成了服务的发布和调用。我们主要在服务的暴露方通过<dubbo:service>标签来暴露服务,在服务的消费方通过<dubbo:reference>标签来引用服务,注册中心我们选用的是zookeeper,对服务的URL进行了管理和配置。
10、Dubbo都支持什么协议?这些协议有什么不同点?你们项目使用的是什么协议?
Dubbo支持Dubbo协议、RMI协议、hessian协议、Http协议等。
Dubbo协议:缺省协议、采用了单一长连接和NIO异步通讯、使用线程池并发处理请求,能减少握手和加大并发效率、采用的是Hession二进制序列化、性能较好,推荐使用。
主要应用于传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,由于是单一连接,因为尽量不要传输大文件。
RMI协议:采用JDK标准的RMI协议(基于TCP协议)、堵塞式短连接、JDK标准序列化方式、同步通讯。适用于消费者和提供者个数差不多的,可传文件。测试发现偶尔会连接失败,需要重建Stub。
Hessian协议:采用http通讯,采用Servlet暴露服务,多连接短连接的同步传输方式,采用hession的二进制序列化,适合提供者比消费者多。
我们项目中使用的是默认Dubbo协议(其他两种简单的知道就行),因为我们项目的特点主要是并发大、消费者要比提供者多。
11、在使用Duubo的过程中你们遇到过什么问题?
(1)序列化和反序列化异常:
调用服务,出现消息发送失败的时候,通常是接口方法的传入传出参数是新增加的扩展类,没有实现序列化接口;
B服务远程调用A服务,返回值为C对象,结果断点A服务返回值对象C有值,但是B服务远程拿到的C对象为null;
(2)服务调用问题
服务提供者是否正常运行?(这块可能涉及到调用的服务被禁止)
连接的注册中心是否正确?(有时会涉及到注册中心的分组问题)
相应的服务提供者是否注册到注册中心?
(3)调用版本问题(在开发过程中增加提供服务版本号和消费服务版本号)
当遇到多个环境(开发、测试、上线)、多个版本(app、PC端)的时候,一个服务可能不满足我们的需求,因为对服务的版本号进行定义,可以为我们后期版本的迭代升级做好铺垫。
整个过程会遇到各种各样的问题,上面这些基本都是技术问题。