3.索引,聚簇索引和二级索引的加锁区别
聚集(clustered)索引,也叫聚簇索引。数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。非聚集(unclustered)索引。该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。会发生二次查询。稠密索引:稠密索引文件中的索引块保持键的顺序与文件中的排序顺序一致。稀疏索引:稀疏索引没有为每个数据都创建一个索引,它比稠密索引节省了更多的存储空间,但查找给定值的记录需更多的时间。只有当数据文件是按照某个查找键排序时,在该查找键上建立的稀疏索引才能被使用,而稠密索引则可以应用在任何的查找键。联合索引:将一张表中多个列组成联合索引(col1,col2,col3),其生效方式满足最左前缀原则。覆盖索引:对于二级索引而言,在innodb中一般是需要先根据二级索引查询到主键,然后在根据一级索引查询到数据。但是如果select的列都在索引中,就避免进行一级查询。4.主键选择
在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键。where 1 = 1:能够方便我们拼sql,但是使用了之后就无法使用索引优化策略,因此会进行全表扫描,影响效率。5.分表分库
水平拆分:依据表中的数据的逻辑关系,将同一个表中的数据依照某种条件拆分到多台数据库(主机)上面。按照1个或多个字段以及相应的规则,将一张表重的数据分到多张表中去。比如按照id%5的规则,将一张大表拆分成5张小表。适合具有超大表的系统。垂直拆分:依照不同的表(或者Schema)来切分到不同的数据库(主机)之上。一般按照模块来分库。适合各业务之间耦合度非常低的系统。6.隔离级别
read uncommit:读不加锁,写加共享锁。会产生脏读、幻读。read commit:读加共享锁,写加排它锁,但不加间隙锁。间隙锁的主要作用是防止不可重复读,但会加大锁的范围。repeatable read(innodb默认):读加共享锁,写加间隙排它锁。注意,Innodb对这个级别进行了特殊处理,使得这个级别能够避免幻读,但不是所有引擎都能够防止幻读!(网易面试官问)serialization:会给整张表加锁,强一致,但是效率低。7.innodb中的锁
MVCC(multi-Version Concurrency Control):读不加锁,读写不冲突。适合写少读多的场景。读操作分为:快照读(返回记录的可见版本,不加锁)、当前读(记录的最新版本,加锁,保证其它记录不修改)。LBCC(Lock-Based Concurrency Control):join原理Simple Nested-Loop Join:效率最低,按照join的次序,在join的属性上一个个扫描,并合并结果。Index Nested-Loop Join:效率最高,join的属性上面有索引,根据索引来匹配。Block Nested-Loop Join:用于没有索引的列。它会采用join buffer,将外表的值缓存到join buffer中,然后与内表进行批量比较,这样可以降低对外表的访问频率8.galera
多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。同步复制,各节点间无延迟且节点宕机不会导致数据丢失。紧密耦合,所有节点均保持相同状态,节点间无不同数据。无需主从切换操作。无需进行读写分离。并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致。对应用透明:集群的维护,对应用程序是透明的,几乎感觉不到。9.LSM Tree,主要应用于nessDB、leveldb、hbase
核心思想的核心就是放弃部分读能力,换取写入的最大化能力。它假设假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾。(使用归并排序是要因为带排序树都是有序树)LSM具有批量特性,存储延迟。B树在insert的时候可能会造成分裂,可能会造成随机读写。而LSM将多次单页随机写,变成一次多页随机写,复用了磁盘寻道时间,极大提升效率。LSM Tree放弃磁盘读性能来换取写的顺序性。一般会使用Bloom Filter来优化LSM。当将内存中的数据与磁盘数据合并的时候,先要判断数据是否有重复,如果不用Bloom Filter就需要在磁盘上一层层地找,而使用了之后就会降低搜索代价。28.RPC与HTTP服务的区别
8.阻塞队列
9.threadlocal
核心原理
常用数据类型String:二进制安全,可以存任何数据,比如序列化的图片。最大长度位512M.Hash:是KV对集合,本质是String类型的KV映射,适合存储对象。List:简单字符串链表,可以在left、right两边插入,本质是双向链表。缓冲区也是用这个实现。Set:String类型的无序集合,内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。zset:有序集合,每个元素会关联一个double类型的score,然后根据score进行排序。注意:元素不能重复,但是score是可以重复的。使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score. pub/sub:在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。持久化
RDB:一种是手动执行持久化命令来持久化快照;另一种是在配置文件中配置策略,来自动持久化。持久化命令有save、bgsave两种,bgsave会调用fork命令,产生子进程来进行持久化,而父进程继续处理数据,但是持久化的快照是fork那一刻的快照,因此这种策略可能会丢失一部分数据。特点:每次都记录所有数据,恢复快,子进程不影响父进程性能。AOF:append only file,将每条操作命令都记录到appendonly.aof文件中,但是不会立马写入硬盘,我们可以配置always(每有一个命令,都同步)、everysec(每秒同步一次)、no(没30秒同步一次)。往往everysec就够了。aof数据损失要比RDB小。特点:有序记录所有操作,数据丢失更少,会对操作做压缩优化,bgrewriteaof也会fork子进程,不影响父进程性能事务
Transactions:不是严格的ACID的事务,但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。内存模型、垃圾收集器、CMS与G1是重点
垃圾收集算法
标记-清除(CMS)容易产生碎片,当碎片太多会提前触发Full GC复制(年轻代基本用这个算法)会浪费一半的可能感觉标记-整理(serial Old、Parallel Old)Serial:采用单线程stop-the-world的方式进行收集。当内存不足时,串行GC设置停顿标识,待所有线程都进入安全点(Safepoint)时,应用线程暂停,串行GC开始工作,采用单线程方式回收空间并整理内存。串行收集器特别适合堆内存不高、单核甚至双核CPU的场合。ParNewParallel ScavengeCMS:
初始标记(stop of world)并行标记、预清理重新标记(stop of world)并行清理G1
将堆分成很多region,可以同时堆年轻代与老年代进行收集
初始标记(stop of world):初始标记(Initial Mark)负责标记所有能被直接可达的根对象(原生栈对象、全局对象、JNI对象)并行标记:重新标记(stop of world):清理(stop of world):重置gc触发条件
从年轻代分区拷贝存活对象时,无法找到可用的空闲分区,会触发Minor GC从老年代分区转移存活对象时,无法找到可用的空闲分区,会触发Major GC分配巨型对象时在老年代无法找到足够的连续分区,会触发Major GC可达性分析:通过检查一块内存空间能否被root达到,来判断是否对其进行回收。jdk不同版本新增的部分特性
jvm调优
VisualVM:JDK自带JVM可视化工具,能过对内存、gc、cpu、thread、class、变量等等信息进行可视化。cap理论
可用性一致性分区容忍性:对网络断开的容忍度,有点像鲁棒性拜占庭将军问题Raft 算法
有leader、follower、candidate同步流程
由客户端提交数据到Leader节点。由Leader节点把数据复制到集群内所有的Follower节点。如果一次复制失败,会不断进行重试。Follower节点们接收到复制的数据,会反馈给Leader节点。如果Leader节点接收到超过半数的Follower反馈,表明复制成功。于是提交自己的数据,并通知客户端数据提交成功。由Leader节点通知集群内所有的Follower节点提交数据,从而完成数据同步流程。zookeeper
Zab(Zookeeper Atomic Broadcast)协议,有两种模式: 它们分别是:恢复模式(选主)和广播模式(同步)。有两种算法:1. basic paxos;2. fast paxos(默认) 文件系统:zookeeper的通知机制、分布式锁、队列管理、配置管理都是基于文件系统的。分布式锁:有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。独占锁:将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。控制时序锁:/distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除。队列管理,分为同步队列、非同步队列数据复制的好处 容错:一个节点出错,不致于让整个系统停止工作,别的节点可以接管它的工作;提高系统的扩展能力 :把负载分布到多个节点上,或者增加节点来提高系统的负载能力;提高性能:让客户端本地访问就近的节点,提高用户访问速度。5.一致性hash算法原理
Spring cloud
网关:zuul分布式\版本化配置 config服务注册和发现:Eureka,配置时需要注意多久刷新列表一次,多久监测心跳等。service-to-service 调用负载均衡:Ribbon;在生成RestTemplate的bean时,通过@LoadBalanced注解可以使得RestTemplate的调用断路器:Hystrix监控:spring admin。在启动类上加@EnableAdminServer注解。以上是总结出的最全技术面试题目,以下是最新总结出的BAT面试java必考题目和答案。