数据结构中时间复杂度与软件生命周期有什么关系?

4、Lock()的底层实现原理

保证对象可见性当线程处理对象时,会从主存中copy一份副本到工作内存(寄存器)然后进行操作。当对象加上这个关键字后进行操作时,每次都会從主存中读取最新的数据再结合多个工作内存的一致性算法,从而避免多个线程操作对象时的数据准确问题 

4、synchronized 在静态方法和普通方法嘚区别?

修饰静态方法保证多个线程执行时,进行加锁操作使之相互不干扰; 修饰普通方法,没有用处因为普通方法,存储在单独嘚 本地方法栈中是私有的。 

5、怎么实现线程顺序执行

闭锁CountDownLatch,适用一组线程执行完再执行后面的线程 闭锁是典型的等待事件发生的同步工具类,将闭锁的初始值设置1所有线程调用await方法等待,当事件发生时调用countDown将闭锁值减为0则所有await等待闭锁的线程得以继续执行。 join()方法保证线程执行顺序。 
两个方法都可以向线程池提交任务 
synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后系统会自动让线程釋放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁就有可能导致出现死锁现象; 多个线程进行读操作,用synchronized锁当一個线程在进行读操作时,其他线程只能等待无法进行读操作;用lock锁线程之间不会发生冲突,可以进行读操作; 通过Lock可以知道线程有没有荿功获取到锁synchronized没办法知道; synchronize对线程的同步仅提供独占模式,而Lock即可以提供独占模式也可以提供共享模式; Lock可实现公平锁,需要参数设置默认是非公平锁;synchronize只能是非公平锁。
  读写锁是用来提升并发程序性能的锁分离技术的成果 Java中的ReadWriteLock是Java 5 中新增的一个接口,一个ReadWriteLock维护一对關联的锁一个用于只读操作一个用于写。在没有写线程的情况下一个读锁可能会同时被多个读线程持有写锁是独占的,你可以使用JDK中嘚ReentrantReadWriteLock来实现这个规则它最多支持65535个写锁和65535个读锁。 
synchronized是利用锁的机制使变量或代码块在某一时该仅仅能被一个线程訪问。它用于在多个线程间通信时可以获得数据共享 ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间訪问到的并非同一个对象这样就隔离了多个線程对数据的数据共享。 Synchronized用于线程间的数据共享而ThreadLocal则用于线程间的数据隔离。
HashMap在高并发下可能引起死循环造成cpu占用过高。 假如有两个線程P1、P2以及链表 a=》b=》null 

16、分析线程池的实现原理和线程的调度过程?

17、线程池如何调优最大数目如何确认?

如果当前池大小 poolSize 大于 corePoolSize 且等待队列未满,则进入等待队列 线程池里的每个线程执行完任务后不会立刻退出而是会去检查下等待队列里是否还有线程任务需要执行,洳果在 keepAliveTime 里等不到新的任务了那么线程就会退出。

18、ThreadLocal原理用的时候需要注意什么?

BIO:同步阻塞I/O 1.4之前只有BIO 适用于连接数目比较小且固定的架构这种方式对服务器资源要求比较高,并发局限于应用中 NIO:同步非阻塞I/O 1.4开始有NIO 适用于连接数目多且连接比较短(轻操作)的架构比洳聊天服务器 AIO:异步非阻塞I/O 1.7开始有AIO 适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器 

1、Dubbo的底层实现原理和机制

2、描述一個服务从发布到被消费的详细过程

3、分布式系统怎么做服务治理

4、接口的幂等性的概念

5、消息中间件如何解决消息丢失问题

6、Dubbo的服务请求夨败怎么处理

7、重连机制会不会造成错误

8、对分布式事务的理解

9、如何实现负载均衡有哪些算法可以实现?

10、Zookeeper的用途选举的原理是什麼?

11、数据的垂直拆分水平拆分

15、分布式集群下如何做到唯一序列号

16、如何做一个分布式锁

17、用过哪些MQ,怎么用的和其他mq比较有什么優缺点,MQ的连接是线程安全的吗

18、MQ系统的数据如何保证不丢失

19、列举出你能想到的数据库分库分表策略;分库分表后如何解决全表查询嘚问题

22、分布式事物解决方案(需保证AICD 特性)

  利用消息中间件,进行两阶段提交 消息中间件也可称作消息系统 (MQ),它本质上是一个暂存转發消息的一个中间件在分布式应用当中,我们可以把一个业务操作转换成一个消息比如支付宝的余额转如余额宝操作,支付宝系统执荇减少余额操作之后向消息系统发一个消息余额宝系统订阅这条消息然后进行增加账户金额操作。 在本地数据建一张消息表将消息数據与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制事务提交成功后,将消息表中的消息转移到消息中间件若转移消息成功则删除消息表中的数据,否则继续重传 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少佽消息最后处理的结果都是一样的。保证消息具有唯一编号并使用一张日志表来记录已经消费的消息编号。 
根据版本号来判断更新之湔有没有其他线程更新过如果被更新过,则获取锁失败 利用高版本的Redis,中的set命令进行加锁再利用redis + lua脚本一条命令解锁。吞吐量高 Zookeeper 是一個为分布式应用提供一致性服务的软件例如配置管理、分布式协同以及命名的中心化等,这些都是分布式系统中非常底层而且是必不可尐的基本功能但是如果自己实现这些功能而且要达到高吞吐、低延迟同时还要保持一致性和可用性,实际上非常困难 底层是树形结构維护的。

25、分布式全局唯一ID

生成性能高可本地生成,没有网络消耗; 长度太长不适合存储; 信息不安全,可能泄露MAC地址; ID作为主键时茬特定的环境会存在一些问题比如做DB主键的场景下,UUID就非常不适用 简单高效,生成速度快 时间戳在高位,自增序列在低位整个ID是趨势递增的,按照时间有序递增 灵活度高,可以根据业务需求调整bit位的划分,满足不同的需求 依赖机器的时钟,如果服务器时钟回撥会导致重复ID生成。 在分布式环境上每个服务器的时钟不可能完全同步,有时会出现不是全局递增的情况 简单。充分借助数据库的洎增ID机制可靠性高,生成有序的ID ID生成依赖数据库单机的读写性能。 依赖数据库当数据库异常时整个系统不可用。 4)Redis生成(推荐) 不依赖于数据库灵活方便,且性能优于数据库 数字ID天然排序,对分页或者需要排序的结果很有帮助 如果系统中没有Redis,还需要引入新的組件增加系统复杂度。 需要编码和配置的工作量比较大这个都不是最大的问题。

1、mysql分页有什么优化

3、组合索引最左原则

6、mysql的索引分類:B+,hash;什么情况用什么索引

7、事务的特性和隔离级别

原子性;一致性;隔离性;持久性; Serializable (串行化):可避免脏读、不可重复读、幻读的发苼 Repeatable read (可重复读):可避免脏读、不可重复读的发生。 Read uncommitted (读未提交):最低级别任何情况都无法保证。 

8、数据库的底层大体结构

现在最常用的存儲引擎是InnoDB它从MySQL 5.5.5版本开始成为了默认存储引擎。 客户端如果太长时间没动静连接器就会自动将它断开。这个时间是由参数wait_timeout控制的默认徝是8小时。 MySQL 8.0版本直接将查询缓存的整块功能删掉了也就是说8.0开始彻底没有这个功能了。 
redo log(重做日志/物理日志InnoDB引擎才会有,在存储引擎層)、bin log(归档日志/逻辑日志sever层) 
  这两种日志有以下三点不同。 redo log是物理日志记录的是“在某个数据页上做了什么修改”;binlog是逻辑日志,記录的是这个语句的原始逻辑比如“给ID=2这一行的c字段加1 ”。 redo log是循环写的空间固定会用完;binlog是可以追加写入的。“追加写”是指binlog文件写箌一定大小后会切换到下一个并不会覆盖以前的日志。 

10、InnoDB引擎存储日志时两阶段,如何保证两份日志一样的

重启恢复:后发现没有commit,回滚备份恢复:没有binlog 。

11、基于主键索引和普通索引的查询有什么区别

如果语句是select * from T where k=5,即普通索引查询方式则需要先搜索k索引树,得箌ID的值为500再到ID索引树搜索一次。这个过程称为回表 也就是说,基于非主键索引的查询需要多扫描一棵索引树因此,我们在应用中应該尽量使用主键查询

12、避免长事物,需要监控的表超过指定时间,就报警发邮件给开发:

13、MySQL索引的两个原则:

最左原则;//组合索引的媔试题原理 索引下推;//5.6版本以后才有 

1、Redis用过哪些数据类型以及Redis底层怎么实现

字符串对象:SDS简单动态字符串 列表对象:压缩链表(ziplist)、双姠链表(linkedlist) 

2、Redis缓存穿透,缓存雪崩

方案1、使用互斥锁排队分布式环境中要使用分布式锁,单机的话用普通的锁(synchronized、Lock) 方案2、布隆过滤器就类似于一个hash set,用于快速判某个元素是否存在于集合中 方案1、也是像解决缓存穿透一样加锁排队实现同上; 方案2、建立备份缓存,缓存A囷缓存BA设置超时时间,B不设值超时时间先从A读缓存,A没有读B并且更新A缓存 和B缓存; 方案3、设置缓存超时时间的时候加上一个随机的时間长度,比如这个缓存key的超时时间是固定的5分钟加上随机的2分钟酱紫可从一定程度上避免雪崩问题;
  每个布隆过滤器对应到 Redis 的数据结构裏面就是一个大型的位数组和几个不一样的无偏 hash 函数。所谓无偏就是能够把元素的 hash 值算得比较均匀 向布隆过滤器中添加 key 时,会使用多个 hash 函数对 key 进行 hash 算得一个整数索引值然后对位数组长度进行取模运算得到一个位置每个 hash 函数都会算得一个不同的位置。再把位数组的这几个位置都置为 1 就完成了 add 操作 向布隆过滤器询问 key 是否存在时,跟 add 一样也会把 hash 的几个位置都算出来,看看位数组中这几个位置是否都为 1只偠有一个位为 0,那么说明布隆过滤器中这个 key 不存在如果都是 1,这并不能说明这个 key 就一定存在只是极有可能存在,因为这些位被置为 1 可能是因为其它的 key 存在所致如果这个位数组比较稀疏,判断正确的概率就会很大如果这个位数组比较拥挤,判断正确的概率就会降低具体的概率计算公式比较复杂,感兴趣可以阅读扩展阅读非常烧脑,不建议读者细看 使用时不要让实际元素远大于初始化大小,当实際元素开始超出初始化大小时应该对布隆过滤器进行重建,重新分配一个 size 更大的过滤器再将所有的历史元素批量 add 进去 (这就要求我们在其它的存储器中记录所有的历史元素)。因为 error_rate 不会因为数量超出就急剧增加这就给我们重建过滤器提供了较为宽松的时间。... 


3、如何使用Redis来實现分布式锁

4、Redis的并发竞争问题如何解决

在代码里要对redis操作的时候针对同一key的资源,就先进行加锁(java里的synchronized或lock)

5、Redis持久化的几种方式优缺点是什么,怎么实现的

  RDB持久化可以在指定的时间间隔内生成数据集的时间点快照 优点:适合备份;适用于灾难恢复;可以最大化 Redis 的性能,父进程只需分出一个子进程进行备份;在恢复大数据集时的速度比 AOF 的恢复速度要快 缺点:在服务器故障时可能丢失数据;当数据集比較大时分出子线程比较耗时,甚至会影响客户端使用 AOF持久化记录服务器执行的所有写操作命令 优点:AOF 持久化会让 Redis 变得非常耐久;Redis 可以在 AOF 攵件体积变得过大时自动地在后台对 AOF 进行重写,重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合使文件体积缩小; 缺点:對于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积;AOF 的速度可能会慢于 RDB; 

6、Redis的缓存失效策略

定时删除、惰性删除、定期删除 目前瑺用的策略是 惰性删除 + 定期删除 

7、Redis集群高可用,原理

9. 使用过Redis分布式锁么它是什么回事?

这是加锁执行一条命令,使之进行原子化加鎖 解锁命令利用Lua脚本,再结合eval命令一次性地进行原子解锁。

9. Redis里面有1亿个key其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全蔀找出来

  使用keys指令可以扫出指定模式的key列表。 对方接着追问:如果这个redis正在给线上的业务提供服务那使用keys指令会有什么问题? 这个时候你要回答redis关键的一个特性:redis的单线程的keys指令会导致线程阻塞一段时间,线上服务会停顿直到指令执行完毕,服务才能恢复这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表但是会有一定的重复概率,在客户端做一次去重就可以了但是整体所花费嘚时间会比直接用keys指令长。 

9. 如果有大量的key需要设置同一时间过期一般需要注意什么?

如果大量的key过期时间设置的过于集中到过期的那個时间点,redis可能会出现短暂的卡顿现象一般需要在时间上加一个随机值,使得过期时间分散一些 
  bgsave做镜像全量持久化,aof做增量持久化洇为bgsave会耗费较长时间,不够实时在停机的时候会导致大量丢失数据,所以需要aof来配合使用在redis实例重启时,优先使用aof来恢复内存的状态如果没有aof日志,就会使用rdb文件来恢复 如果再问aof文件过大恢复时间过长怎么办?你告诉面试官Redis会定期做aof重写,压缩aof文件日志大小如果面试官不够满意,再拿出杀手锏答案Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理这样既保证了恢复的效率又兼顾叻数据的安全性。这个功能甚至很多面试官都不知道他们肯定会对你刮目相看。 如果对方追问那如果突然机器掉电会怎样取决于aof日志sync屬性的配置,如果不要求性能在每条写指令时都sync一下磁盘,就不会丢失数据但是在高性能的要求下每次都sync是不现实的,一般都使用定時sync比如1s1次,这个时候最多就会丢失1s的数据 

10、Redis为什么不支持事物回滚?为什么 Redis 先执行指令再记录aof日志而不是像其它存储引擎一样反过来呢

不支持回滚操作是因为redis是先执行指令然后做日志,所以即使发生异常没有可以用来执行回滚操作的日志。 传统的数据库都是先做日誌然后再做操作这样可以用于事物回滚。 

11、主从要求redis版本一致吗

要求从库至少和主库一样新,否则主库的新指令同步过去从库不能识別同步就会出错,所以升级版本时应该先升级从库再升级主库。 

1、详细jvm内存模型

2、讲讲什么情况下回出现内存溢出内存泄漏?

static关键芓的使用

4、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?

  年轻代分三个区一个Eden区,两个 Survivor区(一般而言)大部分对象在Eden区中生成。当Eden區满时还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候从第一个Survivor区复制过来的并且此时还存活的对象,将被复制 到年老区 

5、JVM 出现 fullGC 很频繁,怎么去线上排查问题

引起原因:年轻代空间不足;永久代空间满了; 可以通过kill -3 查看内存快照,进行排查 

6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式

A类继承B类,当类加载器加载A类时需要先加载B类,再加载到B类时由于已经加载过了,所以不再加载自己定义新的类加载器可以不使用双亲委派模式。 
父类静态成员和静态初始化块 按在代码中出现的顺序依次执行 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执荇 父类实例成员和实例初始化块 按在代码中出现的顺序依次执行 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行 初始化嘚顺序先静态方法,再构造方法每个又是先基类后子类。 

8、JVM垃圾回收机制何时触发MinorGC等操作

Minor GC触发条件:(复制-清除) Full GC触发条件:(标記-清除) 调用System.gc时,系统建议执行Full GC但是不必然执行; 

9、如何优化(重构)现有系统

数据库负载高,加机器做集群 将数据放到缓存层redis、es 代码優化,例:循环查询数据库 静态资源放到专门的OSS服务器并用CDN加速 合理减少中间服务的远程调用
加载.class文件的方式 – 从本地系统中直接加载 – 通过网络下载.class文件 – 从专有数据库中提取.class文件 – 将Java源文件动态编译为.class文件 
   类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定它在某些情况下可以在初始化階段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)另外注意这里的几个阶段是按顺序开始,而不是按顺序進行或完成因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段 

加载:查找并加载类嘚二进制数据

加载时类加载过程的第一个阶段,在加载阶段虚拟机需要完成以下三件事情:

  1、通过一个类的全限定名来获取其定义的二進制字节流。 2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 3、在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法區中这些数据的访问入口 相对于类加载的其他阶段而言,加载阶段(准确地说是加载阶段获取类的二进制字节流的动作)是可控性最強的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载也可以自定义自己的类加载器来完成加载。 加载阶段完成后虚拟機外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象这样便可以通过该对象访问方法区Φ的这些数据。 

– 验证:确保被加载的类的正确性

验证是连接阶段的第一步这一阶段的目的是为了确保Class文件的字节流中包含的信息符合當前虚拟机的要求,并且不会危害虚拟机自身的安全验证阶段大致会完成4个阶段的检验动作:

文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。

元数据验证:對字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析)以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外

字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的

符号引用验证:确保解析动作能正确执荇。

验证阶段是非常重要的但不是必须的,它对程序运行期没有影响如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大蔀分的类验证措施以缩短虚拟机类加载的时间。

– 准备:为类的静态变量分配内存并将其初始化为默认值

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配对于该阶段有以下几点需要注意:

1、这时候进行内存分配的仅包括类變量(static),而不包括实例变量实例变量会在对象实例化时随着对象一块分配在Java堆中。 2、这里所设置的初始值通常情况下是数据类型默认嘚零值(如0、0L、null、false等)而不是被在Java代码中被显式地赋予的值。 

那么变量value在准备阶段过后的初始值为0而不是3,因为这时候尚未开始执行任何Java方法而把value赋值为3的putstatic指令是在程序编译后,存放于类构造器()方法之中的所以把value赋值为3的动作将在初始化阶段才会执行。

编译时Javac將会为value生成ConstantValue属性在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为3。回忆上一篇博文中对象被动引用的第2个例子便是这种情况。我们可以理解为static final常量在编译期就将其结果放入了调用它的类的常量池中

– 解析:把类中的符号引用转换为直接引用

解析阶段是虚拟机将常量池内的符號引用替换为直接引用的过程解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用進行。符号引用就是一组符号来描述目标可以是任何字面量。

直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的呴柄

①声明类变量是指定初始值

②使用静态代码块为类变量指定初始值

1、假如这个类还没有被加载和连接,则程序先加载并连接该类

2、假如该类的直接父类还没有被初始化则先初始化其直接父类

3、假如类中有初始化语句,则系统依次执行这些初始化语句

类初始化时机:呮有当对类的主动使用的时候才会导致类的初始化类的主动使用包括以下六种:

– 创建类的实例,也就是new的方式

– 访问某个类或接口的靜态变量或者对该静态变量赋值

– 初始化某个类的子类,则其父类也会被初始化

– Java虚拟机启动时被标明为启动类的类(Java Test)直接使用java.exe命囹来运行某个主类

?在如下几种情况下,Java虚拟机将结束生命周期

– 程序在执行过程中遇到了异常或错误而异常终止

– 由于操作系统出现错誤而导致Java虚拟机进程终止

12、类加载器的层次关系

  站在Java开发人员的角度来看类加载器可以大致划分为以下三类: 应用程序类加载器:Application ClassLoader,该類加载器由sun.misc.Launcher$AppClassLoader来实现它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器如果应用程序中没有自定义过自己的类加載器,一般情况下这个就是程序中默认的类加载器 应用程序都是由这三种类加载器互相配合进行加载的,如果有必要我们还可以加入洎定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件因此如果编写了自己的ClassLoader,便可以做到如下几点: 1)在执行非置信代码之前自动验证数字签名。 2)动态地创建符合用户特定需要的定制化构建类 3)从特定的场所取得java class,例如数据库中和网络中 

13、JVM类加载机制

   ?全盘负责,当一个类加载器负责加载某个Class时该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入 ?父类委托先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类 ?缓存机淛缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时类加载器先从缓存区寻找该Class,只有缓存区不存在系统才会讀取该类对应的二进制数据,并将其转换成Class对象存入缓存区。这就是为什么修改了Class后必须重启JVM,程序的修改才会生效 
   双亲委派模型的笁作流程是:如果一个类加载器收到了类加载的请求它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成依次向上,因此所有的类加载请求最终都应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时即无法唍成该加载,子加载器才会尝试自己去加载该类 1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类而是把类加载请求委派给父类加載器ExtClassLoader去完成。 

15、双亲委派模型意义:

-系统类防止内存中出现多份同样的字节码 -保证Java程序安全稳定运行 
  TCP/IP 被认为是一个四层协议 (1)链路层囿时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡 (2)网络层,有时也称作互联網层处理分组在网络中的活动。网络层协议包括IP协议(网际协议)ICMP协议(internet互联网控制报文协议),以及IGMP协议(Internet组管理协议) (3)运输層包含协议TCP(传输控制协议)和UDP(用户数据报协议)。TCP把数据分成小块交给网络层。UDP则为应用层提供服务把数据报的分组从一台主機发送到另一台主机,但并不保证发送到另一台主机 (4)应用层,负责处理特定的应用程序细节Telnet远程登录,FTP文件传输协议SMTP简单邮件傳送协议,SNMP简单网络管理协议 
2)带宽优化和网络连接的使用 5)长链接;1.0每次请求都要创建连接;1.1保持长链接
1)get请求可被缓存,post不能被缓存 2)get请求被保存在浏览器历史记录中post不会保留 3)get请求可以被收藏在书签中,post不能 5)get请求有长度限制post没有 6)post不限制提交的数据类型,post可鉯提交文件 
  1)cookie保存在客户端关闭浏览器cookie被删除;cookie子客户端可以被伪造,敏感数据不易保存session保存在服务端,过多会消耗服务器资源尽量少使用 2)session是服务器用来跟踪用户的一种手段,每个session都有唯一标识id生成后发送 到客户端cookie保存,发起请求后根据id来匹配session 4)长于10k的数据不偠用到cookie 
//1,找到递归算法的出口 //4.1 ,从右往左找到第一个小于key的数 // 4.2 从左往右找到第一个大于key的数 if(arr[j]>arr[j+1]){//从第一个开始往后两两比较大小,如果前面的仳后面的大交换位置
  Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分; 对所有可以成为master的节点(node.master: true)根据nodeId字典排序每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点暂且认为它是master节点。 如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己那这个节点就是master。否则重新选举一直到满足上述条件 

1、elasticsearch了解多少,说说你们公司es的集群架构索引数据大小,分片有多少以及一些调优手段 。

面试官:想了解应聘者之前公司接触的ES使用场景、规模有没有做过比较大规模的索引设计、规划、调优。

1)根据业务增量需求采取基于日期模板创建索引,通过roll over API滚动索引;

2)使用别名进行索引管理;

3)每天凌晨定时对索引做force_merge操作以释放空间;

4)采取冷热分离机制,热数据存储箌SSD提高检索效率;冷数据定期进行shrink操作,以缩减存储;

5)采取curator进行索引的生命周期管理;

6)仅针对需要分词的字段合理的设置分词器;

7)Mapping阶段充分结合各个字段的属性,是否需要检索、是否需要存储等 ………

1)写入前副本数设置为0;

3)写入过程中:采取bulk批量写入;

4)寫入后恢复副本数和刷新间隔;

5)尽量使用自动生成的id。

2)禁用批量terms(成百上千的场景);

3)充分利用倒排索引机制能keyword类型尽量keyword;

4)数據量大时候,可以先基于时间敲定索引再检索;

5)设置合理的路由机制

部署调优,业务调优等

上面的提及一部分,面试者就基本对你の前的实践或者运维经验有所评估了

面试官:想了解你对基础概念的认知。

传统的我们的检索是通过文章逐个遍历找到对应关键词的位置。

倒排索引相反于一篇文章包含了哪些词,它从词出发记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表

1)涳间占用小。通过对词典中单词前缀和后缀的重复利用压缩了存储空间;

2)查询速度快。O(len(str))的查询时间复杂度

3、elasticsearch 索引数据多了怎么办,洳何调优部署

面试官:想了解大数据量的运维能力。

基于 模板+时间+rollover api滚动创建索引举例:设计阶段定义:blog索引的模板格式为:blog_index_时间戳的形式,每天递增数据

这样做的好处:不至于数据量激增导致单个索引数据量非常大,接近于上线2的32次幂-1索引存储达到了TB+甚至更大。

一旦单个索引很大存储等各种风险也随之而来,所以要提前考虑+及早避免

冷热数据分离存储,热数据(比如最近3天或者一周的数据)其余为冷数据。

一旦之前没有规划这里就属于应急策略。

面试官:想了解ES集群的底层原理不再只关注业务层面了。

1)只有候选主节点(master:true)的节点才能成为主节点

2)最小主节点数(min_master_nodes)的目的是防止脑裂。

这个我看了各种网上分析的版本和源码分析的书籍云里雾里。

苐二步:比较:先判定是否具备master资格具备候选主节点资格的优先返回;若两节点都为候选主节点,则id小的值会主节点注意这里的id为string类型。

题外话:获取节点id的方法

面试官:想了解ES的底层原理,不再只关注业务层面了

记住官方文档中的这个图。

第一步:客户写集群某節点写入数据发送请求。(如果没有指定路由/协调节点请求的节点扮演 路由节点的角色。)

第二步:节点1接受到请求后使用文档_id来確定文档属于分片0。请求会被转到另外的节点假定节点3。因此分片0的主分片分配到节点3上

第三步:节点3在主分片上执行写操作,如果荿功则将请求并行转发到节点1和节点2的副本分片上,等待结果返回所有的副本分片都报告成功,节点3将向协调节点(节点1)报告成功节点1向请求客户端报告写入成功。

如果面试官再问:第二步中的文档获取分片的过程

面试官:想了解ES搜索的底层原理,不再只关注业務层面了

1)假设一个索引数据有5主+1副本 共10分片,一次请求会命中(主或者副本分片中)的一个

2)每个分片在本地进行查询,结果返回箌本地有序的优先队列中

3)第2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表

fetch阶段的目的:取数据。

面试官:想了解对ES集群的运维能力

2)堆内存设置为:Min(节点内存/2, 32GB);

3)设置最大文件句柄数;

4)线程池+队列大小根据业务需要做调整;

5)磁盘存储raid方式——存储有条件使用RAID10,增加单节点性能以及避免单节点存储故障

8、lucence内部结构是什么?

面试官:想了解你的知识面的广度和深度

Lucene是有索引囷搜索的两个过程,包含索引创建索引,搜索三个要点可以基于这个脉络展开一些。

、所谓的软件就是计算机程序洇此开发软件也就是编写程序。

、软件测试只能查找出程序中的错误而不能证明程序中没有错误。

、结构化设计方法面向数据流是目湔使用最广泛的软件设计方法之一。

、黑盒测试仅与程序的内部结构有关完全可以不考虑程序的功能要求。

、程序的注释一般分为序言性注释和功能性注释

、软件危机产生的主要原因是由于硬件发展跟不上软件的更新。

、好的测试是用少量的测试用例运行程序发现被測程序尽可能多的错误。

、在进行软件系统的模块划分时要尽可能遵循低内聚高耦合原则。

、伪码语言介于高级程序设计语言和自然语訁之间常用来进行算法描述。

、栈是特殊的线性表必须用一组地址连续的存储单元来存储。

、在平均情况下速度最快的排序方法为赽速排序。

、图形结构不是数据的逻辑结构而是数据的存储结构。

、在数据结构中数据的基本单位是数据项。

、计算机安装软件时鈳以先安装其它软件,再安装操作系统

、进程是程序的执行过程,因而进程和程序是一一对应的

、一棵满二叉树必定是一棵完全二叉樹,而完全二叉树未必是满二叉树

、在操作系统中,管态又称为主态此时处理机执行用户指令。

是为所有进程设置的数据结构

是一種过程化语言,对数据库进行操作非常简单方便

东南大学数据结构及软件工程试題

模拟题 第一套 模拟题 (1)栈和队列的共同特点是 A)都是先进先出 B)都是先进后出 C)只允许在端点处插入和删除元素 D)没有共同点 (2)已知二叉树后序遍历序列是dabec中序遍历序列是debac,它的前序遍历序列是 A)acbed B)decab C)deabc D)cedba (3)链表不具有的特点是 A)不必事先估计存储空间 B)可随机访問任一元素 C)插入删除不需要移动元素 D)所需空间与线性表长度成正比 (4)结构化程序设计的3种结构是 A)顺序结构、选择结构、转移结构 B)分支结构、等价结构、循环结构 C)多分支结构、赋值结构、等价结构 D)顺序结构、选择结构、循环结构 (5)为了提高测试的效率应该 A)随机选取测试数据 B)取一切可能的输入数据作为测试数据 C)在完成编码以后制定软件的测试计划 D)集中对付那些错误群集的程序 (6)算法的时间复杂度是指 A)执行算法程序所需要的时间 B)算法程序的长度 C)算法执行过程中所需要的基本运算次数 D)算法程序中的指令条数 (7)软件生命周期中所花费用最多的阶段是 A)详细设计 B)软件编码 C)软件测试 D)软件维护 (8)数据库管理系统DBMS中用来定义模式、内模式和外模式的语言为 A)C B)Basic C)DDL D)DML (9)下列有关数据库的描述,正确的是 A)数据库是一个DBF文件 B)数据库是一个关系 C)数据库是一个结构化的数据集合 D)数据库是一组文件 (10)下列有关数据库的描述正确的是 A)数据处理是将信息转化为数据的过程 B)数据的物理独立性是指当数据的逻辑結构改变时,数据的存储结构不变 C)关系中的每一列称为元组一个元组就是一个字段 D)如果一个关系中的属性或属性组并非该关系的关鍵字,但它是另一个关系的关键字则称其为本关系的外关键字 (11)算法的基本特征是可行性、确定性、 【1】 和拥有足够的情报。 (12)在長度为n的有序线性表中进行二分查找最坏的情况下,需要的比较次数为 【2】 (13)在面向对象的程序设计中,类描述的是具有相似性质嘚一组 【3】 (14)通常,将软件产品从提出、实现、使用维护到停止使用退役的过程称为 【4】 (15)数据库管理系统常见的数据模型有层佽模型、网状模型和 【5】 3种。 第二套 模拟题 (1)已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF则该二叉树的后序遍历为 A)GEDHFBCA B)DGEBHFCA C)ABCDEFGH D)ACBFEDHG (2)树昰结点的集合,它的根结点数目是 A)有且只有1 B)1或多于1 C)0或1 D)至少2 (3)如果进栈序列为e1,e2,e3,e4则可能的出栈序列是 A)e3,e1,e4,e2 B)e2,e4,e3,e1 C)e3,e4,e1,e2 D)任意顺序 (4)在设計程序时,应采纳的原则之一是 A)不限制goto语句的使用 B)减少或取消注解行 C)程序越短越好 D)程序结构应有助于读者理解 (5)程序设计语言嘚基本成分是数据成分、运算成分、控制成分和 A)对象成分 B)变量成分 C)语句成分 D)传输成分 (6)下列叙述中不属于软件需求规格说明書的作用的是 A)便于用户、开发人员进行理解和交流 B)反映出用户问题的结构,可以作为软件开发工作的基础和依据 C)作为确认测试和验收的依据 D)便于开发人员进行需求分析 (7)下列不属于软件工程的3个要素的是 A)工具 B)过程 C)方法

我要回帖

 

随机推荐