undo日志用来回滚redo日志用来重放redolog用来保证事务的持久性,undolog用来帮主事务回滚及MVCC的功能。
隔离性通过隔离级别来实现,不同隔离级别有不同的处理方式,可以使用锁、MVCC等机制来保证隔离性
说了用数组排序,问复杂度,扯了半天。
怎么优化,按照数字特征顺序打印,问这个东西和什么结构比较像。提示是树,然后说了个多叉树,问我怎么实现,最后其实使用dfs遍历树的每个分支。
我说了用cyclicbarrier实现,互相等待await。
然后他问我怎么用信号量实现,并且提示可以再用一个线程。
然后我说了个方案。
改成尾递归或者循环。面试官说不是,引导说用栈实现递归。问我栈中需要压入哪些数据。他说应该是方法参数,返回值,以及返回地址。
负载均衡算法主要包括:轮询、加群轮询、随机、一致性哈希等算法
memcache推出了一个叫做一致性哈希的算法,一个哈希环,环上支持2^32次方个节点,也就是包含了所有的ip。
然后我们把主机通过hash值分布到这个环上,请求到来时会映射到某一个节点,如果该节点没有主机,则顺时针寻找真正主机。
当节点加入或者节点删除时,并不会影响服务的可用性,只是某些请求会被映射到别的节点。
但是当请求集中到某个区域时,会产生倾斜,我们引入了虚拟节点来改善这个问题,虚拟节点对应到真实节点,所以加入虚拟节点可以更好地转移请求。
请参考腾讯面经里的这个问题。
mysql数据库可以通过binlog来完成主从复制,binlog是mysql的数据库二进制日志,用于记录数据库中的每一条读写操作,主从复制就是基于这一日志进行的,主库通过另一个进程和从库建立网络连接,并且把binlog数据不断地发送给从库,从库读取主库发过来的日志,在此时叫做relaylog也就是中转日志,并且在从库进行重放即可。
当网络环境异常时就容易出现数据不一致,解决办法是使用从库前先把主库和从库进行数据同步。
不了解,因为这个部门是做数据库研发的,所以才问这么刁钻的问题
8Linux查看cpu占用率高的进程
top
netstat查看占用某端口的进程lsof-i+特定命令可以查看某进程监听的端口
((2[0-4]\d|25[0-5]|[01]\d\d)\.){3}(2[0-4]\d|25[0-5]|[01]\d\d)
数据库部门真的很严格,问题都挺难的。
Linux,说一下Linux排查问题常用的命令,ps,top,netstat,free,du等等
说了lru和fifo,问我lru有什么缺点,没答上来。
讲了一下inode节点,文件和目录的原理。他问我了不了解具体的文件系统ext2,ext3,答不会。。
内存模型老生常谈了,主要就是线程共享的堆区,方法区,本地方法栈。还有线程私有的虚拟机栈和程序计数器。
堆区存放所有对象,每个对象有一个地址,Java类jvm初始化时加载到方法区,而后会在堆区中生成一个Class对象,来负责这个类所有实例的实例化。
栈区存放的是栈帧结构,栈帧是一段内存空间,包括参数列表,返回地址,局部变量表等,局部变量表由一堆slot组成,slot的大小固定,根据变量的数据类型决定需要用到几个slot。
方法区存放类的元数据,将原来的字面量转换成引用,当然,方法区也提供常量池,常量池存放-128到127的数字类型的包装类。字符串常量池则会存放使用intern的字符串变量。
停止复制,存活对象少时适用,缺点是需要两倍空间。标记清除,存活对象多时适用,但是容易产生随便。标记整理,存活对象少时适用,需要移动对象较多。
年轻代分为eden和survior,新对象分配在eden,当年轻代满时触发minorgc,存活对象移至survivor区,然后两个区互换,等待下一场gc,当对象存活的阈值达到设定值时进入老年代,大对象也会直接进入老年代。
老年代空间较大,当老年代空间不足以存放年轻代过来的对象时,开始进行fullgc。同时整理年轻代和老年代。一般年轻代使用停止复制,老年代使用标记清除。
单例单例模式保证全局的单例类只有一个实例,这样的话使用的时候直接获取即可,比如数据库的一个连接,Spring里的bean,都可以是单例的。
单例模式一般有5种写法。
第一种是饿汉模式,先把单例进行实例化,获取的时候通过静态方法直接获取即可。缺点是类加载后就完成了类的实例化,浪费部分空间。
第二种是饱汉模式,先把单例置为null,然后通过静态方法获取单例时再进行实例化,但是可能有多线程同时进行实例化,会出现并发问题。
第三种是逐步改进的方法,一开始可以用synchronized关键字进行同步,但是开销太大,而后改成使用volatile修饰单例,然后通过一次检查判断单例是否已初始化,如果未初始化就使用synchronized代码块,再次检查单例防止在这期间被初始化,而后才真正进行初始化。
第四种是使用静态内部类来实现,静态内部类只在被使用的时候才进行初始化,所以在内部类中进行单例的实例化,只有用到的时候才会运行实例化代码。然后外部类再通过静态方法返回静态内部类的单例即可。
第五种是枚举类,枚举类的底层实现其实也是内部类。枚举类确保每个类对象在全局是唯一的。所以保证它是单例,这个方法是最简单的。
应用场景
MyISAM适合:(1)做很多count的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且行锁定的机会比较大的情况。
想了好一会,orderbyiddesclimit10
union和unionall的区别是,union会自动压缩多个结果集合中的重复结果,而unionall则将所有的结果全部显示出来,不管是不是重复。
问我Redis怎么做集群,答了主从哨兵和cluster。Redis的持久化怎么做,aof和rdb,有什么区别,有什么优缺点。aof是采用追加日志的方式进行备份,特点是实时性高,但是消耗性能rdb是采用转储数据文件的方式进行备份,特点是可以备份大量数据,但是实时性差。
使用哨兵部署的问题是:哨兵模式解决的是一个redis副本的高可用问题,但是无法进行扩容。所以可以采用集群的方式来解决扩展性问题,Redis-cluster集群中每一个Redis副本都可以提供服务,并且集群中的每个Redis副本都是一个分片,存储的数据各不相同,同时它们都有一个哨兵节点来保证高可用,这样就可以既保证集群的高可用,也可以保证服务的伸缩性。
我说基本组件稍微了解过,简单搭过环境。
MapReduce是一种分而治之的算法,首先分片,然后让多个机器执行任务,最后合并。
hdfs是一个分布式文件系统,主要构成有两部分,namenode和datanode,namenode负责提供服务访问入口,datanode则用于实际存储数据。
hive是一个数据仓库,底层一般是hdfs分布式文件系统,通过把文件映射成表的方式,可以使用hivesql来操作hive中的数据。
hbase是一个分布式数据库,底层可以是hdfs这类分布式文件系统,hbase把每个列族分别进行存储,并且行数超过一定数量时会进行分片,这种特性使其在查询同一列的场景下速度很快。
sqoop用于在mysql和hive之间进行数据表和文件的转换。
flume用于连接日志输出和日志输入。
zookeeper是一个分布式协调工具,可以把服务结构转化为一个目录树,自身通过选主和zab协议保证服务可用性,作用是用于保证一个集群服务的高可用,同时可以实现服务注册中心的功能。
yarn是一个分布式的任务调度工具,用于把任务分派到多个节点,并且可以完成任务的跟踪、结果汇总,以及资源分配等功能,解放了原本需要负责这一切的jobtracker
我说是合并结果的,问我啥时候会用到,答不知道。
我答不知道,猜是会继续执行。。
我说拆成十份hash,每份两两比较hash的结果集,貌似他说OK。
我说用层次遍历记录节点高度。
我说布隆过滤器。
我没思路,瞎扯了一下加硬件,用内存存,都被驳回了。然后他说算了。
说了分片的方案,根据地址的hash值确定分片所在节点。
说不了解,感觉应该是问数据库的分布式方案。
全程50分钟,可以说是迄今为止难度最大的一个?
动态代理是在运行时通过反射获取代理类的实例,静态代理则是在代码中直接完成代理类的实现。
TCP是会根据数据流大小自动进行分包的,这一点是TCP传输协议的特性。那么TCP分包之后是否还会进行ip分片呢,这个主要看ip数据报是否超过了链路层规定的帧最大长度MTU,如果超过了,ip数据报是会进行分片的。
无限长轨道。两辆车同方向开,车会滴水,怎么让他们相遇。这题简直像脑筋急转弯。通过水滴判断车的速度,然后调整车速即可。
百度今年的提前批有点奇怪,好像都不走流程,牛客上好几个百度内推的帖子,我投了几个,基本上都是百度智能云的。然后这些部门都安排了面试,没有冲突,所以没有动静的小伙伴可以投投别的部门试试。下面是我的面经,目前就是这些了,每个部门侧重点不太一样。