备战
一、介绍redo log和undo log?
Inno DB有这么两个日志,redo log和undo log。其中redo log是用于日志回放,把已经commit的事务重新做一遍。而undo log用于回滚数据,主要用于记录数据被修改前的日志,当事务回滚时需要按照undo log来进行数据复原。
事务原子性:在进行数据修改前先把历史数据保存到undo log,当事务成功commit时,通过redo log保证修改的数据全部同步到数据库中;当需要回滚时就通过undo log。
二、Inno DB如何解决判断读未提交?
首先每行数据会有一个版本号id,Inno DB为每一个事务创造了一个动态数组,用来保存当前事务启动瞬间活跃的的所有事务id,然后事务每次修改完数据,就会把修改的事务id赋值给该行记录的版本号id。所以事务A读某行数据时,发现它的版本id在当前活跃事务数组中,则说明该行数据修改未提交。
三、Inno DB可重复读会不会产生幻读?
RR隔离级别时普通的查询是快照读,因此快照读能解决读操作产生的幻读。而因为更新操作直接使用的是当前读的最新的数据(不管事务是否提交),因此更新操作可能会产生幻读。
解决方案:使用for update添加间隙锁。
四、MySQL如果对记录修改,是否会读到修改的值?
会。如果判断数据未改变,则不会真正执行更新操作。
五、解释JAVA多态?什么是重写和重载?
1.JAVA多态性是指继承,重写,父类引用指向子类对象。
2.重载是指方法名相同,参数类型,个数,顺序不同。(如果仅有返回类型不同不属于重载)
重写发生在子类父类之间,方法名、参数列表相同,返回值范围小于等于父类,访问修饰符范围要大于等于父类(父类为private则不能重写)。
六、数据库类型?MySQL时间如何存储?
1.数值类型、字符串、日期类型
2.时间优先使用Timestamp,它会随着服务器时区的变化而变化;而Datetime类型是没有时区信息。
七、MySQL索引类型?
1.普通索引
2.唯一索引unique,该索引列下的值必须唯一,但允许有空值,一个表可以有多个唯一索引
3.主键索引primary key,一个表只能有一个主键索引,索引列下值必须唯一且不允许为空
4.联合索引
5.全文索引
八、Redis如何保证高可用?
1.主从模式:只有一个主节点,和多个从节点,主节点进行写,然后会把数据同步到所有从节点上,而从节点只能读,用来缓冲高并发读下的流量冲击。缺点在于,主节点宕机后,需要手动设置把一个从节点提到主节点的位置,费时费力并且还会造成一段时间的停止服务。
2.哨兵模式:哨兵进程通过发送哨兵命令来监控主从节点是否宕机,一旦发现主节点挂了,哨兵进程之间就会选举产生新的Master节点。
3.集群模式:由于每台Redis机器都存储相同数据,很浪费内存。因此可以让数据分片,每台redis机器上都存储不同的内容。
九、Docker解决了什么问题?
1.运行环境和配置问题,方便发布。
2.更轻量的优化,节省虚拟机性能损耗。
十、对象数组Object[] obArr是连续的吗?
因为Object数组中每个元素都是一个对象,因此在堆内存中不是连续分配的;但是在栈中的对象引用指针是连续的。
一面强化补充
一、HTTP1.0,1.1和HTTP2.0区别?
1.HTTP1.0中客户端只和服务器保持非持久连接,每一个新的请求都是需要建立TCP连接,服务器完成响应之后就会立即断开TCP连接。
2.HTTP1.1中,默认支持持久连接,在一个TCP连接上可以进行多个请求响应。同时还允许客户端不用等待就收上次请求的响应,就可以发送下一次请求。(但是服务器需要按序响应)
3.HTTP2.0中,性能和特性有了很大的提升:
①多路复用,客户端和服务器都可以同时发送或者接受多个请求响应报文,不需要按序接收。
②HTTP2.0传输数据分割为帧,并采用二进制编码。相比之前1.1的文本格式编码解析起来更加高效。
③首部压缩:通过使用维护一个首部表,来跟踪存储之前每次发送时的键值对。有两个请求,如果它们的状态行和头部大部分内容相同的话,那么第二请求头只需要发送不同的差异数据,这样就可以减少在头部的重复开销。
④服务推送。允许服务器在响应报文外,发送其它客户端需要的资源给客户端,避免客户端再发送一次请求的开销。比如加载静态资源。
二、HashMap的put()和get(),rehash的流程是什么?
1.put()首先根据key值的hashcode计算出hash值,也就是桶的位置;然后进行判断空;接着遍历该桶中的元素,先判断hashcode是否相同,然后再用equals方法判断,如果为重复元素key则进行覆盖;否则将新的键值对插入到该桶中。
2.get()方法和put方法类似,只不过不需要判空。
3.HashMap通过resize()进行扩容,通过transfer()方法把旧数组拷贝到新数组当中。其中旧数组元素经过rehash后,新索引下标要么在原来同一个桶索引的位置,要么是在新的索引位置(因为数组长度变化,旧元素计算的哈希值也可能变化。类似于mod 数组长度的原理。但是JDK1.8不需要重新计算哈希值)
三、为什么重写equals方法之后还要重写hashcode方法?
hashcode方法它设计的理念就是保证equals认定为是相同的两个对象拥有相同的两个哈希值。默认的equals方法是比较对象的地址,当根据业务需要重写equals方法,变为值相等时,hashcode也需要改为值相等。如果不重写hashcode,那么在遍历桶中元素判断相等时,先执行Object方法中的hashcode(比较的是地址),这时候不同地址的相同元素就会直接返回false(hashcode为true桶相同,才继续用equals遍历桶中元素)。
四、MySQL json
五、介绍一下ThreadLocal?什么是ThreadLocal的内存泄漏?使用场景?
1.ThreadLocal是用来维护每个线程的私有变量和数据。ThreadLocal的set和get方式实际上是通过调用每个Thread对象中都有的一个ThreadLocalMap来进行操作(key就是这个ThreadLocal弱引用对象,value就是ThreadLocal声明的强引用类型数据)。
2.ThreadLocal对象使用完后按理说,应该要被垃圾回收。因为ThreadLocalMap中对ThreadLocal的引用是弱引用,因此GC时如果没有外部强引用就会被清除,这时候key为null对应的强引用value不会被清除。因为线程是强引用指向ThreadLocalMap,而ThreadLocalMap也是强引用指向Entry对象,因此只要线程不回收,那么先前的Entry对象就不会回收,进而造成内存泄漏。
解决方案:每次使用完ThreadLocal后,需要手动进行remove清除Entry对象,remove中会对key为null的value进行清除。
3.使用场景连接管理,一个线程一个连接,不同线程不共享连接。
六、JAVA对象四种引用?
强引用:被强引用的对象即使内存不够也不会被垃圾回收,要想取消某个引用和对象之间的强引用关系,可以通过把引用显式设置为null,那么那个没有被引用的对象就会被垃圾回收。一般new对象,还有反射都是强引用。
软引用:系统内存充足则不会被回收,不充足则会被回收。适用于对内存敏感。
弱引用:无论内存是否够用,GC时都会把弱引用对象进行垃圾回收。一般用于缓存当中。
虚引用:GC时就会被回收,必须搭配队列来使用。可以得到GC回收的通知,什么时候引用队列有新的引用入队了,就说明他被回收。
七、MySQL聚合函数和group by?count(字段)和count(*)区别?SQL语句执行顺序?
1.先看一个例子,找出每个部门中分数最高的同学并按照姓名升序返回表:select *,max(score) as max from student group by depy order by name desc;
按照group by A根据A列key分组后,对于每个组中所有行的数据根据不同聚合函数进行处理并返回一条记录。(max,min,avg,count)
2.count(字段)统计的是字段值不为NULL的记录数。而count(*)统计行数。
3.select 字段名(一般需要和group by字段一致) from 表名(使用join) where 条件名 group by 分组字段 having 分组条件 order by 排序字段 limit 分页
①where是用来过滤行数据,在分组前过滤;而having用来过滤分组,在分组后过滤。
②distinct对字段的value去重
八、MySQL中CHAR和VARCHAR区别?删除语句?
1.CHAR是定长字符串类型;而VARCHAR是存储可变长类型。
2.drop用来删库删表。delete用来删除某行数据 delete from stu where id=10
九、MySQL的Hash索引?
哈希索引优点在于索引效率高,可以一次定位。但是仅仅只能够满足"="的等值查询,不能满足范围查询。
十、什么是CSRF攻击?
CSRF是跨站请求伪造攻击。因为用户的浏览器中,会有携带有用户session id的cookie,第二次请求用户就可以带上cookie让服务端返回相关会话信息。这时候如果在浏览器另打开一个tab页,那么它也可以正常获得浏览器的id。黑客就可以利用此cookie进行攻击。
比如在一个银行系统,用户通过get方法转账,其中url暴露用户的账户和转账金额;这时候黑客就可以在另外一个tab页进行附带一个新链接,其中账户是黑客自己的账户。当用户不小心点进去后,就会发送一个带有cookie的请求后,服务器就会受理转账给黑客用户。
解决方案:①尽量使用post方法提交表单,少用get方法。攻击者不容易伪造。
②用户在请求中,加入一个黑客无法获得的识别字段。
十一、JVM内存屏障
内存屏障解决了硬件层面的可见性和重排问题。loadstore屏障就表示前面这个volatile变量读和后面的写操作是不能进行指令重排的。屏障分为四种屏障,loadstore,loadload,storeload,storestore
JVM规定volatile修饰的变量,写之前需要插入stroestore屏障,写之后加入storeload
读之前加入loadload屏障,读之后加入loadstore屏障
二面
一、简述memcached?memcached如何实现分布式和查询?为什么不使用guava做缓存?
1.memcache:分布式内存对象缓存系统,能在内存中做缓存。支持数据类型简单。数据100k以上性能比redis好。一致性基于CAS实现。
2.memcached服务器之间互不通信,各自独立存取数据,因此服务器不具有分布式功能,memcached分布式主要依赖于客户端的实现.每台memcached存储的数据都是不一样的。
查询时需要通过两次hash。第一次哈希根据key来找到数据所在的memcached服务器,在那个memcached服务器内再通过第二次哈希来找到真正的数据。
3.guava实现是本地缓存(缓存和应用进程在同一台机器上),轻量快速,生命周期随jvm销毁而结束。因此在分布式场景下,每个实例的本地缓存可能存在不一致情况。
适用于数据量小,改动少,访问多的数据。
二、Spring两大核心特征?
1.IOC(Inverse of Control):控制反转(对容器而言,容器控制了应用程序,传给它所需要的资源)。将在程序中手动创建对象的控制权,交给Spring容器来生成类的实例对象,减少耦合,是一种工厂模式。实现的方法有两种,依赖查找和依赖注入。
依赖注入:IOC容器会主动将某个对象需要的外部资源(对象,数据,资源)注入到组件中(Controller)。有几种方式①构造函数②setter③接口。
A依赖于B类,实例化B类对象时,不需要知道B类及其底层类的构造函数,直接交给IOC容器进行。
2.AOP(Aspect-Oriented programming):切面编程。将业务模块共同调用的方法封装起提供给外部使用,是一种代理模式。
切面(@Aspect):标识一个共有功能实现的java类。
三、双亲委派机制四个类加载器?如何破坏双亲委派机制?
1.自底向上:用户定义classloader->Application ClassLoader->Extension ClassLoader->Bootstrap ClassLoader
2.要打破双亲委派机制,只需要重写loadClass方法。
四、LInux查看CPU和内存、进程?还有其它?
CPU:# top命令
内存:# cat
进程:ps-elf; ps-ef|grep 进程名
创建目录:mkdir
拷贝:cp