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)
- Propagation.REQUIRED 如果有事务在运行,当前的这个方法就在事务内运行.否则就开启新的事务,在自己的事务内运行
- Propagation.REQUIRES_NEW 当前的方法必须启动新事务,并在自己的事务内运行。如果有事务在运行,将它挂起
- Propagation.MANDATORY 当前的方法必须运行在事务内部,如果没有正在运行的事务则抛出异常
- Propagation.NEVER 当前的方法不应该运行在事务内,如果有运行的事务,就抛出异常
- Propagation.NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行。否则就启动一个新的事务,在自己的事务内运行。
- Propagation.SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行.否则它可以不运行在事务中
- 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的生命周期
- 实例化 Instantiation
- 属性赋值 Populate
- 初始化 Initialization
- 销毁 Destruction
spring IOC容器初始化过程
- resource 资源定位
- BeanDefinition 载入,把用户定义好的bean 表示成IOC容器内部的数据结构
- 向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) 持久性
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