面试常问题汇总、redis 、 mangodb 、 memcache对比

 redis 、 mangodb 、 memcache

都是NoSQLs数据库:非关系型数据库。mysql就是关系型数据库。

  redis mongodb memcache
数据类型

五大类型

string、list、hash、sorted set 、set

key-value

值可以是文档,数组及文档数组

key-value
线程 单核单线程 多线程

多核多线程

主要存储形式 内存(也可持久化到磁盘) 磁盘 内存
主从模式(分布) 支持 支持 不支持
自动复制 支持 支持 不支持
TPS性能 稍弱
分片 支持 支持 支持
过期策略 支持 不支持 支持
自动故障恢复 哨兵模式 内部paxos选举 不支持
事务支持 支持(稍弱,事务中的每个操作连续执行 不支持 支持(cas保证)
消息发布/订阅 支持 不支持 不支持
断电数据恢复 支持 支持 不支持
编写语言 ANSI C C++ C
应用场景 数据量较小但更性能操作和运算上 海量数据的访问效率问题 减少数据库负载,提升性能;做缓存,提高性能

 

Redis发布订阅与ActiveMQ的比较

(1)ActiveMQ支持多种消息协议,包括AMQP,MQTT,Stomp等,并且支持JMS规范,但Redis没有提供对这些协议的支持; 
(2)ActiveMQ提供持久化功能,但Redis无法对消息持久化存储,一旦消息被发送,如果没有订阅者接收,那么消息就会丢失; 
(3)ActiveMQ提供了消息传输保障,当客户端连接超时或事务回滚等情况发生时,消息会被重新发送给客户端,Redis没有提供消息传输保障。 

  (4) MQ 提供了丰富的发布订阅方式,例如 queue、topic。还有 ack 消息确认机制,以及推送和主动拉取消息的选择方式。
总之,ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的。
 

JVM调优

cpu 100%

1.执行 top 命令,查看占用cpu使用率最高的 pid 进程

2.使用 top -Hp  pid ,键入大写P,按照cpu使用率排序,找出最耗cpu的线程id

3.将线程 id 转换成 16 进制(堆栈里面线程id 是16进制表示的)

4.使用 jstack pid | grep '线程id(16进制)'  -C5 --color  查看最耗cpu的线程

5.找到对应代码进行排查。
 

内存飙高:

使用top ,查看 %MEM% 比较高的 pid

jmap -heap pid 查看堆内存使用情况,

jmap -histo:live pid | head   打印出前几条占用情况

jmap -dump:live,format=b,file=myheap.dump pid  导出堆内存到文件

 

 

Mysql

索引何时失效


    (1)组合索引未使用最左前缀,例如组合索引(A,B),where B=b不会使用索引;

    (2)like未使用最左前缀,where A like '%China';

    (3)搜索一个索引而在另一个索引上做order by,where A=a order by B,只使用A上的索引,因为查询只使用一个索引 ;

    (4)or会使索引失效。如果查询字段相同,也可以使用索引。例如where A=a1 or A=a2(生效),where A=a or B=b(失效)

    (5)如果列类型是字符串,要使用引号。例如where A='China',否则索引失效(会进行类型转换);

    (6)在索引列上的操作,函数(upper()等)、or、!=(<>)、not in等;
 

数据库中隔离级别四种

Spring 配置 

Isolation.DEFAULT  默认,使用数据库默认的隔离级别
 
隔离级别越往下,安全性越高,数据越安全。
Isolation.READ_UNCOMMITTED  读未提交,即使没有提交,但是做了更改也可以被读到。会产生脏读、幻读,不可重复读。
Isolation.READ_COMMITTED    读已提交,只读取已经提交的事务。会产生幻读,不可重复读。
Isolation.REPEATABLE_READ   可重复读,两个事务之间的读写不冲突。当一个事务进行数据读取,另一个事务进行了修改之     后,第一个事务再次读取,但是数据依旧和第一次读到的一样。可重复读
Isolation.SERIALIZABLE      序列化。效率低。不会脏读、幻读、重复读
 

mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读

oracle 默认系统事务隔离级别是READ COMMITTED,也就是读已提交

事务的隔离级别(spring)

  1. Propagation.REQUIRED  如果有事务在运行,当前的这个方法就在事务内运行.否则就开启新的事务,在自己的事务内运行
  2. Propagation.REQUIRES_NEW    当前的方法必须启动新事务,并在自己的事务内运行。如果有事务在运行,将它挂起
  3. Propagation.MANDATORY    当前的方法必须运行在事务内部,如果没有正在运行的事务则抛出异常
  4. Propagation.NEVER   当前的方法不应该运行在事务内,如果有运行的事务,就抛出异常
  5. Propagation.NESTED   如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则就启动一个新的事务,在自己的事务内运行。
  6. Propagation.SUPPORTS  如果有事务在运行,当前的方法就在这个事务内运行.否则它可以不运行在事务中
  7. Propagation.NOT_SUPPORTED   当前的事务不应该运行在事务中,如果有运行的事务,就将它挂起 

 

BeanFactory 和 FactoryBean的区别

beanfactory 是个 factory ,也就是 IOC容器(spring 容器)或对象工厂。在spring中,所有的bean都由 beanfactory 来管理,提供了实例化对象和获取的功能。

使用场景:

  • 从 IOC 容器中获取bean
  • 检索 IOC 容器是否包含指定的bean
  • 判断bean是否是单例

FactoryBean 是个 bean,这个bean不是简单的bean,而是一个能生产或者修饰对象生成的工厂bean,它的实现与设计模式中的工厂模式和修饰器模式类似。

使用场景:

ProxyFactoryBean

 

spring bean的生命周期

  1. 实例化 Instantiation
  2. 属性赋值 Populate
  3. 初始化 Initialization
  4. 销毁 Destruction

spring IOC容器初始化过程

  1. resource 资源定位
  2. BeanDefinition 载入,把用户定义好的bean 表示成IOC容器内部的数据结构
  3. 向IOC容器注册这些 BeanDefinition 的过程,保存到 hashmap


名词

CAP定理(CAP theorem)

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

一般只能满足两个

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

ACID

1、A (Atomicity) 原子性

2、C (Consistency) 一致性

3、I (Isolation) 独立性(隔离性)

4、D (Durability) 持久性

 

JAVA种的设计模式:23种设计模式

 

mybatis 的缓存

联表查询优化

 

 

Feign、hystrix、ribbon 调用关系

 

jdk代理和CGLIB代理的区别
一、简单来说:

JDK动态代理只能对实现了接口的类生成代理,而不能针对类,它的实现原理是通过InvocationHandler.invoke方法实现对实现类方法的调用(InvocationHandler实例已经持有了对实现类对象的引用了),然后实现方法前后的拦截。

CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承),然后通过MethodIntercept.intercept方法来实现在调用父类方法的前后执行拦截。
  
  jdk代理是通过持有实现类的引用来实现对实现类方法的调用的,而CGLIB是通过调用父类的方法来实现对被代理类的方法调用的。

 

二、Spring在选择用JDK还是CGLiB的依据:

    (1)当Bean实现接口时,Spring就会用JDK的动态代理。
    (2)当Bean没有实现接口时,Spring使用CGlib实现。
    (3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class=“true”/>)
 

生成类的三种方式:

Class.forName("")
类.class
类.class.getClass()

 

5 << 1  = 5 * 2

5 >> 1 = 5 / 2

(5 << 1)  |  1= 5 * 2 + 1

(5 << 1)  & 1= 5 * 2 - 1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章