ActiveMQ原理html
这篇文章:http://www.javashuo.com/article/p-tllnemff-cp.htmljava
ActiveMQ 主从数据复制mysql
死锁web
死锁条件:面试
1.互斥条件:进程对于所分配到的资源具备排它性,即一个资源只能被一个进程占用,直到被该进程释放
2.请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已得到的资源保持不放。
3.不剥夺条件:任何一个资源在没被该进程释放以前,任何其余进程都没法对他剥夺占用
4.循环等待条件:当发生死锁时,所等待的进程一定会造成一个环路(相似于死循环),形成永久阻塞。redis
怎么防止死锁:算法
1.尽可能采用tryLock(timeout)的方法,能够设置超时时间,这样超时以后,就能够主动退出,防止死锁(关键)spring
2.减小同步代码块嵌套操做sql
3.下降锁的使用粒度,不要几个功能共用一把锁数据库
怎么查看生产堆栈信息 JDK提供了什么工具
jps -lvm 用于查看当前机器上运行的java进程。
咱们使用 jstack -l pid查看咱们的应用堆栈信息,同时能够看到死锁信息。
Redis主从怎么复制数据:
这篇文章:http://www.javashuo.com/article/p-prxiidta-ca.html
游标是用来干什么的?
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
汇集索引和非汇集索引
汇集索引和非汇集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,汇集索引表记录的排列顺序与索引的排列顺序一致,优势是查询速度快,由于一旦具备第一个索引值的纪录被找到,具备连续索引值的记录也必定物理的紧跟其后。汇集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,下降了执行速度。建议使用汇集索引的场合为:
a.此列包含有限数目的不一样值;
b.查询的结果返回一个区间的值;
c.查询的结果返回某值相同的大量结果集。
非汇集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致
,汇集索引和非汇集索引都采用了B+树的结构,但非汇集索引的叶子层并不与实际的
数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非
汇集索引比汇集索引层次多,添加记录不会引发数据顺序的重组。建议使用非汇集索
引的场合为:
a.此列包含了大量数目不一样的值;
b.查询的结束返回的是少许的结果集;
c.order by 子句中使用了该列。
线程阻塞
这篇文章:http://www.javashuo.com/article/p-ocbghzvr-hw.html
队列,阻塞对列
HashMap为何要用红黑树
https://www.jianshu.com/p/37436ed14cc6
concurrentHashMap 7和8的区别
从JDK1.7版本的ReentrantLock+Segment+HashEntry,到JDK1.8版本中synchronized+CAS+HashEntry+红黑树。
1.数据结构:取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。
2.保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用CAS+Synchronized保证线程安全。
3.锁的粒度:原来是对须要进行数据操做的Segment加锁,现调整为对每一个数组元素加锁(Node)。
4.链表转化为红黑树:定位结点的hash算法简化会带来弊端,Hash冲突加重,所以在链表节点数量大于8时,会将链表转化为红黑树进行存储。
5.查询时间复杂度:从原来的遍历链表O(n),变成遍历红黑树O(logN)。
http://www.javashuo.com/article/p-uytrakmr-bo.html
CAS并发包的应用
Oracle事务
惟一索引和主键索引的区别
一 主键和惟一索引都要求值惟一,可是它们仍是有区别的:
①.主键是一种约束,惟一索引是一种索引;
②.一张表只能有一个主键,但能够建立多个惟一索引;
③.主键建立后必定包含一个惟一索引,惟一索引并必定是主键;
④.主键不能为null,惟一索引能够为null;
⑤.主键能够作为外键,惟一索引不行;
二 主键约束比惟一索引约束严格,当没有设定主键时,非空惟一索引自动称为主键。对于主键和惟一索引的一些区别主要以下:
1.主键不容许空值,惟一索引容许空值
2.主键只容许一个,惟一索引容许多个
3.主键产生惟一的汇集索引,惟一索引产生惟一的非汇集索引
注:汇集索引肯定表中数据的物理顺序,因此是主键是惟一的(汇集就是整理数据的意思)
联合索引有什么要注意的地方
1.单个索引须要注意的事项,组合索引所有通用。好比索引列不要参与计算啊、or的两侧要么都索引列,要么都不是索引列啊、模糊匹配的时候%不要在头部啦等等
2.最左匹配原则。(A,B,C) 这样3列,mysql会首先匹配A,而后再B,C.
3.若是用(B,C)这样的数据来检索的话,就会找不到A使得索引失效。若是使用(A,C)这样的数据来检索的话,就会先找到全部A的值而后匹配C,此时联合索引是失效的。
把最经常使用的,筛选数据最多的字段放在左侧。
https://blog.csdn.net/nakiri_arisu/article/details/79702461
Spring 事务
JVM线程进来怎么分配内存
指令重排序:
两个String相加,编译后是怎样的:
两个字符串相加底层会生成StringBuilder对象,而后使用append来拼接,若是不在循环中使用,能够不用StringBuilder,
Volatile关键字
关键字volatile能够用来修饰字段,就是告知程序任何对该变量的访问均须要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证全部线程对变量访问的可见性。
对volatile语义的扩展保证了volatile变量在一些状况下不会重排序,volatile的64位变量double和long的读取和赋值操做都是原子的。
synchronized关键字
关键字synchronized能够修饰方法或者同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。
如何设计一个秒杀系统
https://yq.aliyun.com/articles/618443
乐观锁和悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,因此每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了不少这种锁机制,好比行锁,表锁等,读锁,写锁等,都是在作操做以前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,因此不会上锁,可是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可使用版本号等机制。乐观锁适用于多读的应用类型,这样能够提升吞吐量,像数据库若是提供相似于write_condition机制的其实都是提供的乐观锁。
分布式锁是怎样
一、基于数据库
二、基于redis或者memcached
三、基于Zookeeper
分布式事务是怎样
Spring 切面的五种类型的通知
before after afterReturning afterThrowing around
Spring 经过IOC实现松散耦合
MyBatis缓存
mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的缓存,二级缓存时mapper级别的缓存,二级缓存是多个SqlSession共享的。mybatis经过缓存机制减轻数据压力,提升数据库性能。
TCP三次握手四次挥手
http://www.javashuo.com/article/p-pbijuuwh-de.html
SpringMVC工做过程
1.spring mvc全部的请求都提交给DispatcherServlet,它会委托应用系统的其余模块负责对请求进行真正的处理工做。
2.DispatcherServlet查询一个或多个HandlerMapping,找处处理请求的Controller.
3.DispatcherServlet请请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。
CopyOnWriteArrayList介绍下
CopyOnWrite容器即写时复制的容器。通俗的理解是当咱们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,而后新的容器里添加元素,添加完元素以后,再将原容器的引用指向新的容器。这样作的好处是咱们能够对CopyOnWrite容器进行并发的读,而不须要加锁,由于当前容器不会添加任何元素。因此CopyOnWrite容器也是一种读写分离的思想,读和写不一样的容器。
lambda表达式介绍下
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式能够表示闭包(注意和数学传统意义上的不一样)。
steam跟list的循环有什么区别
ReentrantLock介绍下
如何不让一个线程一直等待获取锁
负载均衡的原理
一、轮询(默认)
每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
} 二、指定权重
指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。
upstream backserver {
server 192.168.0.14 weight=8;
server 192.168.0.15 weight=10;
} 三、IP绑定 ip_hash
每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
} 四、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
} 五、url_hash(第三方)
按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
在须要使用负载均衡的server中增长
proxy_pass http://backserver/;
upstream backserver{
ip_hash;
server 127.0.0.1:9090 down; (down 表示当前的server暂时不参与负载)
server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大)
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup; (其它全部的非backup机器down或者忙的时候,请求backup机器)
}
max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout:max_fails次失败后,暂停的时间
http://www.javashuo.com/article/p-crzvlagr-dh.html
SpringBoot 启动的时候加载些什么?
Redis集群?哨兵?
哨兵(sentinel) 是一个分布式系统,你能够在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪一个Slave做为新的Master。
http://www.javashuo.com/article/p-dfatojst-ba.html
Java类加载机制
http://www.javashuo.com/article/p-gdoivhqn-hz.html
http://www.javashuo.com/article/p-fhbpjqer-ha.html
Nginx原理
https://www.jianshu.com/p/6215e5d24553
http和https
select 加什么能够实现悲观锁?加 for update.
redis的数据结构?五种,String, Hash, list ,set , zset.
Spring 的BeanFactory和ApplicationContext有什么区别?
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
1) 国际化(MessageSource)
2) 访问资源,如URL和文件(ResourceLoader)
3) 载入多个(有继承关系)上下文 ,使得每个上下文都专一于一个特定的层次,好比应用的web层
4) 消息发送、响应机制(ApplicationEventPublisher)
5) AOP(拦截器)
二者装载bean的区别
BeanFactory:
BeanFactory在启动的时候不会去实例化Bean,中有从容器中拿Bean的时候才会去实例化;
ApplicationContext:
ApplicationContext在启动的时候就把全部的Bean所有实例化了。它还能够为Bean配置lazy-init=true来让Bean延迟实例化;
hash碰撞
一般有两类方法处理碰撞:开放寻址(Open Addressing)法和连接(Chaining)法。
常见的加密算法
SQL查询的深分页问题
拦截器和AOP的区别
Redis的事务操做
HTTPS和HTTP的区别
HTTPS和HTTP的区别主要以下:
一、https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。
二、http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。
三、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。
四、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全