1.Java基础

1.1JAVA中的几种基本数据类型是什么,各自占用多少字节。

  Java中有八种基本数据类型,分别是byte(1bit)、boolean(不占用)char(2bit)、short(2bit)、int(4bit)、long(8bit)、float(4bit)、double(8bit)。

1.2 String类能被继承吗,为什么。

  String类不能被继承,因为其被final关键字声明,不允许被继承。

1.3 String,Stringbuffer,StringBuilder的区别。

  1. String是一个不可变的字符串,线程安全;
  2. StringBuffer和StringBuilder都是可变的字符串,与String主要的区别是允许修改其内容,StringBuffer其内部方法是同步的,线程安全;
  3. StringBuilder内部方法不是同步的,线程不安全;由于StringBuffer内部方法是通过synchronized关键字修饰,在获取锁和释放锁消耗性能,因此在操作效率上低于StringBuilder。

1.4 ArrayList和LinkedList有什么区别。

  1. ArrayList底层是由动态数组构建的,LinkedList底层是链表结构
  2. ArrayList由于其数组结构并实现了RandomAccess接口,可以实现随机访问,而LinkedList不能
  3. LinkedList在头插、尾插元素(某些情况)效率上比ArrayList效率高
  4. ArrayList相对于LinkedList占用更少的内存,由于LinkedList需要存储前驱和后驱指针

1.5 讲讲类的实例化顺序,比如父类静态数据,构造函数,父类字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。

  • 父类静态数据----->子类静态数据----->父类字段----->父类构造方法----->子类字段----->子类构造方法
  • 静态初始化块和字段只在类中初始化一次。

1.6 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

  • 使用过HashMap、ConcurrentHashMap;HashMap是线程不安全的,ConcurrentHashMap是线程安全的。
  • HashMap和ConcurrentHashMap底层结构都是数组+链表/红黑树组成的。
  • HashMap默认容量为16,当集合中元素超过容量的0.75时,进行扩容,每次扩容增长为原来的两倍。为减少哈希冲突,需要将通过hashcode()方法计算得到的hash值与数组长度进行取余操作,将存储的元素散列到各个位置。如果除数为2的幂次,那么取余操作相当于除数减一的与操作,采用二进制与操作,能够提升运算效率。
  • ConcurrentHashMap默认容量和扩容机制同HashMap,在JDK1.7时,其由Segment数组和HashEntry组成来保证多个线程同步,在JDK1.8以后,通过CAS操作和Node数组以及synchronized关键字保证每个Node数组之间的安全性(只要不产生hash冲突)。

1.7 JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。

  JDK1.7的ConcurrentHashMap是利用Segment和HashEntry保证多个线程访问,Segment实现了Lock接口,是一种重量级锁,当数据分布不均匀时,会加剧锁竞争。使用CAS和局部重排序能够更细粒度实现线程同步,还能减少Segment分配的锁对象开销,提高性能。

1.8 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。

  TreeMap就是有顺序的Map实现类,它是通过实现Comparator的compareTo方法保证有序

1.9 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口

区别:

  • 接口强调对行为的约束,类强调的时从属关系;
  • 一个类只能继承一个父类,但是可以实现多个接口
  • 接口中的成员变量只能通过private static final修饰且必须初始化复制或构造函数赋值,抽象类中的成员变量是default类型,可由其子类重新定义或修改。

  类不能继承多个类,接口可以继承多个接口,类可以实现多个接口

1.10 继承和聚合的区别在哪。

  • 继承关注的是类之间的继承和扩展关系,而聚合关注的是类之间的组合和包含关系
  • 继承是一种强耦合关系,因为子类紧密依赖于父类的实现。而聚合是一种较弱的耦合关系,因为成员类可以独立于容器类存在和改变
  • 继承通常用于表示类之间的层次结构和抽象与具体的关系,而聚合用于表示类之间的组合和整体与部分的关系

1.11 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。

  • IO模型有NIO(同步非阻塞)、BIO(同步阻塞)、AIO(异步非阻塞)三种IO模型
  • BIO是指应用程序发起Read调用,会一直阻塞,直到内核把数据复制到应用层
  • NIO是指同步非阻塞,它可以通过多次发起Read调用不阻塞,但当内核将数据拷贝到应用层是阻塞的
  • AIO基于事件和回调机制实现,应用操作后直接返回,当后台处理完,操作系统通知响应线程进行后续操作。

reactor模型

reactor模型是一种处理大量并发I/O请求的设计模式,常用于构建高性能服务器

  1. 单个或多个输入处理器(Reactor):负责监听和分发来自客户端的事件或请求到相应的处理器
  2. 事件处理器(Handler):负责处理实际的业务逻辑,如读取数据、执行计算、写回响应等。
  3. 多路复用:Reactor使用I/O多路复用技术(如select、poll、epoll等)来监听多个连接,而不是为每个连接分配一个线程。
  4. 事件驱动:系统基于事件驱动,当有新的事件发生时,Reactor会将事件分发给对应的处理器进行处理

1.12 反射的原理,反射创建类实例的三种方式是什么。

反射是指运行时分析类,执行类中方法的机制

反射创建实例的方法分为已知具体类和不知具体类

已知类使用lei.class方法

不知类

  1. Class.forName(“全路径”)方法
  2. 对象实例instance.getClass
  3. 类加载ClassLoader.getSystemClassLoader.loaderClass(“全路径”)方法

1.13 反射中,Class.forName和ClassLoader区别 。

  • Class.forName()和ClassLoader都用于加载类,但它们之间还是存在区别:
  • Class.forName()是一个静态方法,ClassLoader是一个类
  • Class.forName()和ClassLoader类都可能在加载类时出现ClassNotFoundException,但ClassLoader拥有更多加载选项和更细粒度控制。
  • Class.foName()加载的类如果没有初始化,那么它会通过Class.forName()进行初始化,ClassLoader默认不会初始化类,除非反射调用newIInstance()方法或其他初始化方法。

1.14 描述动态代理的几种实现方式,分别说出相应的优缺点。

JDK动态代理,代理接口,Proxy类的newProxyInstance()方法通过类加载器、接口、以及InvocationHandler对象以及重写InvocationHandler的invoke()方法实现动态代理

优点

  • 简单易用,只需重写InvocationHandler的invoke方法即可
  • 无需引入额外库
  • 目标类需要实现接口,才可创建代理对象

缺点

  • 目标类没有实现接口,无法使用JDK动态代理
  • final方法和private方法,无法进行代理

CGLIB动态代理,代理类。通过字节码技术,子类覆盖父类实现代理

优点

  • 无需类实现接口就能实现动态代理
  • 功能更强大,可代理final和private方法

缺点:

  • 需引入额外库(CG)
  • 相对于JDK代理更复杂,性能较差
  • 通过生成子类方法实现,可能会产生继承的副作用。

1.15 动态代理与cglib实现的区别。

  1. JDK动态代理是通过实现InvocationHandler的invoke方法结合反射增强被代理类,再Proxy.newProxyInstance()方法根据接口和InvocationHandler对象产生代理对象完成代理功能;
  2. CGLIB动态代理是通过实现MethodInterceptor接口中的intercept()方法结合反射增强被代理类,通过Enhancer.create()方法产生代理对象完成代理功能。

1.16 为什么CGlib方式可以对接口实现代理。

  其实CGlib是通过对接口的实现类实现动态代理,而不是对接口进行代理

1.17 final的用途。

  final可以用来修饰成员变量、类,方法。被final修饰的变量一旦赋值不能被修改。被final修饰的类不能被继承,被final修饰的方法不能被重写。

1.18 写出三种单例模式实现 。

饿汉

public class Singleton{
    private Singleton(){}
    private static Singleton singleton = new Singleton();
    private static Singleton(){
        return singleton;
    }
}

懒汉式(线程不安全)

public class Singleton{
    private Singleton(){}
    private static Singleton singleton;
    private static Singleton(){
        if(singleton == null){
             singleton = new Singleton();
        }
        return singleton;
    }
}

双重检测懒汉式(线程安全)

public class Singleton{
    private Singleton(){}
    private static Singleton singleton;
    private static Singleton(){
        if(singleton == null){
             sychronized(){
                  if(singleton == null){
                       singleton = new Singleton();
                  }
             }
        }
        return singleton;
    }
}

 枚举懒汉式

public enum Singleton{
    INSTANCE;
}

1.19 如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。

   在Java中,我们不能直接在父类中为子类自动完成所有hashCode和equals方法的实现,因为每个类可能具有不同的相等性和哈希码计算逻辑。但可以创建一个通用基类或抽象类,提供默认的、基于对象状态的hashCode和equals方法,并鼓励子类重写这些方法以适应自己的需求。

优点

  • 父类提供的通用方法做模板,减少重复代码
  • 子类可以通过父类得到基本的equals方法和hashcode方法

缺点

  • 父类无法预知子类所有的字段,因此无法提供准确的equals方法和hashcode方法
  • 子类有不相等性规则时,不正确的继承会导致违反equals和hashcode约定

1.20 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。

  1. public
  • public访问修饰符表示成员(类、方法或变量)对所有其他类都是可见的,不受包或类层次结构的限制
  • 这有助于定义API(应用程序编程接口),因为公共接口是外部代码与类交互的主要方式,体现了“接口清晰且有限”的设计原则。
  • 公共类、方法和属性通常用作系统间通信的基础,提供了模块化和解耦的设计优势。
  1. private
  • private访问修饰符表示成员仅对其所在的类可见,对外部类完全不可见。
  • 封装的核心理念就是隐藏内部实现细节,只暴露必要的操作接口。通过将数据成员声明为私有,并提供公共的getter和setter方法(如果需要的话),可以更好地控制这些成员的状态变化,确保其一致性及安全性。
  • 私有成员有助于实现信息隐藏降低不同部分之间的耦合度,提高代码的可靠性和可维护性。
  1. protected
  • protected访问修饰符允许成员在同一个包内或者子类中可见,但在包外的其他类中不可见。
  • 保护成员对于实现继承关系下的复用和扩展特别有用。子类能够访问父类的受保护成员,以便于进行重写(override)或者使用父类的非公共功能
  • 使用protected关键字有助于实现OO中的继承和多态特性,同时保持一定程度的封装。
  1. default(无修饰符,也称为package-private):
  • 默认访问修饰符没有显式指定,成员仅在同一个包内的其他类中可见,而在包外则不可见。
  • 它支持同一包内的类之间共享某些功能,但不鼓励跨包间的直接访问,从而降低了不同包之间不必要的依赖关系。
  • 在包级私有成员的帮助下,可以构建更模块化的系统,其中各个包相对独立,相互之间只通过公共API进行通信。

1.21 深拷贝和浅拷贝区别。

  • 深拷贝和浅拷贝都是通过clone()方法拷贝父类引用。
  • 深拷贝是拷贝原对象的整个对象,包括原对象的内部对象。
  • 浅拷贝只是拷贝了原对象的内部对象的引用地址,浅拷贝对象和原对象还是公用同一个内部对象。

1.22 数组和链表数据结构描述,各自的时间复杂度。

  • 数组是内存连续的,支持随机访问,插入删除效率较链表低
  • 链表是内存不连续的,不支持随机访问,插入删除效率较数组高

1.23 error和exception的区别,CheckedException,RuntimeException的区别。

  • error和Exception有一个共同的父类Throwable。
  • error是应用程序无法处理的错误,不建议通过catch捕获,如虚拟机异常,Exception是程序可以处理的异常,可以使用catch进行捕获。
  • 异常分为受检查异常(CheckedException)和不受检查异常(RuntimeException及其子类)。
  • CheckedException是受检查异常,一定要捕获,不然无法编译通过
  • RuntimeException及其子类被称为非受检查异常,不捕获也能编译通过

1.24 请列出5个运行时异常。

  • NullPointerException(空指针错误)
  • IllegalArgumentException(参数错误比如方法入参类型错误)
  • NumberFormatException(字符串转换为数字格式错误,IllegalArgumentException的子类)
  • ArrayIndexOutOfBoundsException(数组越界错误)
  • ClassCastException(类型转换错误)

1.25 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。

不可以,String类是Java的核心类,由BootstrapClassLoader加载。Java类的加载遵循双亲委派加载机制。

1.26 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。

  hashcode和equal方法都是用来判断两个对象是否相等,其中先进行hashcode判断,如果不等,则两个对象不相等,反之进一步通过equals方法比较两个对象内存地址是否相等(Object默认),实际应用中一一判断两个对象的属性值是否全部相等,进而判断两个对象是否相等。

场景

  • 类作为哈希表的键或值
  • 基于字段判断对象是否相等
  • 一旦重写equals方法,必须重写hashcode方法,保证两个相等的对象hash值相等

1.27 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。

  泛型在编译时,通过参数表示类型,再具体使用(运行)时实现类型转换。

1.28 这样的a.hashcode() 有什么用,与a.equals(b)有什么关系。

  求对象的hash值,在使用equals比较两个对象是否相等时,会先计算两个对象的hashcode是否相等,如果不等则两个对象不相等,如果相同,则进一步通过equals方法比较两个对象的内存地址判断两个对象是否相等(Object默认),实际应用是一一判断两个对象的属性值是否全部相等

1.29 有没有可能2个不相等的对象有相同的hashcode。

  有可能,因为两个对象并不是具有相同的hashcode就是同一对象,这还需要通过equals()方法比较两个对象中内存地址相等(Object默认),实际应用中一一判断两个对象的全部属性值是否相等,才能决定两个对象是否相等。

1.30 Java中的HashSet内部是如何工作的。

  HashSet用于存储唯一且不重复的元素,当一个元素加入HashSet时,会先根据哈希算法计算该元素的hash值,如果hash值与HashSet中已加入元素的hash值不同,则加入到HashSet中;反之则进一步通过元素的equals方法计算它们是否相等,如果相等则该元素已存在,不必加入HashSet中;反之则通过拉链法解决哈希冲突,将元素以链表或红黑树形式链接。

1.31 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。

  序列化是将对象转换为二进制字节流进行数据传输。在Java中类可以通过实现Serializable接口实现序列化,也可以引入其他序列化协议进行序列化,如kryo、protobuf、Hession等。网络数据传输、文件存储、数据库、内存存储都是以二进制字节流流进行存储。如果我们需要将对象进行网络数据传输、文件、数据库、内存存储就需要进行序列化。

反序列化问题

安全问题:

兼容性问题:

性能问题:

异常处理:

数据一致性问题:

1.32 java8的新特性

  • lambda表达式:简洁方式定义匿名函数,提高代码可读性,简化集合流操作、事件处理
  • Stream流:简化集合的排序、过滤、映射、聚合操作
  • removeIf:简化集合中元素删除操作

2.JVM知识

2.1 什么情况下会发生栈内存溢出。

  • 递归调用过深:超过了JVM为线程(多个栈帧(局部变量、操作数栈、方法返回地址))分配的栈空间,导致栈内存溢出。确保递归有合理退出条件
  • 大量本地变量占用大内存:方法中声明过多大对象(几百K或几M的对象)作为局部变量如数组、大型对象占用大量栈空间,导致栈内存溢出;尽量将大对象放入堆中
  • 栈线程设置过小:JVM通过-Xss设置线程大小,因栈限制导致栈内存溢出;适当增加-Xss参数,增大线程大小。
  • 死锁或循环等待引起栈内存溢出

2.2 JVM的内存结构,Eden和Survivor比例。

  在JVM内存结构中,Eden和Survivor都是堆中的新生代内存模块,主要用于存储新创建的对象其中Survivor有Survivor0区和Survivor1区,Eden与其余连个Survivor内存占比为8:1:1

2.3 JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。

2.4 JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。

2.5 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

2.6 垃圾回收算法的实现原理。

2.7 当出现了内存溢出,你怎么排错。

2.8 JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。

2.9 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

2.10 讲讲JAVA的反射机制。

2.11 你们线上应用的JVM参数有哪些。

2.12 g1和cms区别,吞吐量优先和响应优先的垃圾收集器选择。

2.13 怎么打出线程栈信息。

2.14 请解释如下jvm参数的含义:

-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -
XX:MaxTenuringThreshold=20XX:CMSInitiatingOccupancyFraction=80 -
XX:+UseCMSInitiatingOccupancyOnly。

3.开源框架知识

3.1 简单讲讲tomcat结构,以及其类加载器流程,线程模型等。

3.2 tomcat如何调优,涉及哪些参数 。

3.3 讲讲Spring加载流程。

3.4 Spring AOP的实现原理。

3.5 讲讲Spring事务的传播属性。

3.6 Spring如何管理事务的。

3.7 Spring怎么配置事务(具体说出一些关键的xml 元素)。

3.8 说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。

3.9 Springmvc 中DispatcherServlet初始化过程。

3.10 netty的线程模型,netty如何基于reactor模型上实现的。

3.11 为什么选择netty。

3.12 什么是TCP粘包,拆包。解决方式是什么。

3.13 netty的fashwheeltimer的用法,实现原理,是否出现过调用不够准时,怎么解决。

3.14 netty的心跳处理在弱网下怎么办。

3.15 netty的通讯协议是什么样的。

3.16 springmvc用到的注解,作用是什么,原理。

3.17 springboot启动机制。

4.操作系统

4.1 Linux系统下你关注过哪些内核参数,说说你知道的。

4.2 Linux下IO模型有几种,各自的含义是什么。

4.3 epoll和poll有什么区别。

4.4 平时用到哪些Linux命令。

4.5 用一行命令查看文件的最后五行。

4.6 用一行命令输出正在运行的java进程。

4.7 介绍下你理解的操作系统中线程切换过程。

4.8 进程和线程的区别。

4.9 top 命令之后有哪些内容,有什么作用。

4.10 线上CPU爆高,请问你如何找到问题所在。

5.多线程

5.1 多线程的几种实现方式,什么是线程安全。

5.2volatile的原理,作用,能代替锁么。

5.3 画一个线程的生命周期状态图。

5.4 sleep和wait的区别。

5.5 sleep和sleep(0)的区别。

5.6 Lock与Synchronized的区别 。

5.7 synchronized的原理是什么,一般用在什么地方(比如加在静态方法和非静态方法的区别,静态方法和非静态方法同时执行的时候会有影响吗),解释以下名词:重排序,自旋锁,偏向锁,轻

量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁。

5.8 用过哪些原子类,他们的原理是什么。

5.9 JUC下研究过哪些并发工具,讲讲原理。

5.10 用过线程池吗,如果用过,请说明原理,并说说newCache和newFixed有什么区别,构造函数的各个参数的含义是什么,比如coreSize,maxsize等。

5.11 线程池的关闭方式有几种,各自的区别是什么。

5.12 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有10个线程同时调用它,如何做到?

5.13 spring的controller是单例还是多例,怎么保证并发的安全。

5.14 用三个线程按顺序循环打印abc三个字母,比如abcabcabc。

5.15 ThreadLocal用过么,用途是什么,原理是什么,用的时候要注意什么。

5.16 如果让你实现一个并发安全的链表,你会怎么做。

5.17 有哪些无锁数据结构,他们实现的原理是什么。

5.18 讲讲java同步机制的wait和notify。

5.19 CAS机制是什么,如何解决ABA问题。

5.20 多线程如果线程挂住了怎么办。

5.21 countdowlatch和cyclicbarrier的内部原理和用法,以及相互之间的差别(比如

5.22 countdownlatch的await方法和是怎么实现的)。

5.23 对AbstractQueuedSynchronizer了解多少,讲讲加锁和解锁的流程,独占锁和公平所加锁有什么不同。

5.24 使用synchronized修饰静态方法和非静态方法有什么区别。

5.25简述ConcurrentLinkedQueue和LinkedBlockingQueue的用处和不同之处。

5.26导致线程死锁的原因?怎么解除线程死锁。

5.27 非常多个线程(可能是不同机器),相互之间需要等待协调,才能完成某种工作,问怎么设计这种协调方案。

5.28 用过读写锁吗,原理是什么,一般在什么场景下用。

5.29 开启多个线程,如果保证顺序执行,有哪几种实现方式,或者如何保证多个线程都执行完再拿到结果。

5.30 延迟队列的实现方式,delayQueue和时间轮算法的异同。

6.HTTP与TCP

http1.0和http1.1有什么区别。

TCP三次握手和四次挥手的流程,为什么断开连接要4次,如果握手只有两次,会出现什么。

TIME_WAIT和CLOSE_WAIT的区别。

说说你知道的几种HTTP响应码,比如200, 302, 404。

当你用浏览器打开一个链接(如:https://docs.qq.com/doc/DWEZjdlBqU3ppZWhu)的时候,计算机做了哪些工作步骤。

TCP/IP如何保证可靠性,说说TCP头的结构。

如何避免浏览器缓存。

如何理解HTTP协议的无状态性。

简述Http请求get和post的区别以及数据包格式。

HTTP有哪些method

简述HTTP请求的报文格式。

HTTP的长连接是什么意思。

HTTPS的加密方式是什么,讲讲整个加密解密流程。

Http和https的三次握手有什么区别。

什么是分块传送。

Session和cookie的区别。

7.架构设计与分布式

 

8.算法

 

9.数据库知识

9.1 数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。

9.2 什么是幻读。

9.3 MYSQL有哪些存储引擎,各自优缺点。

9.4 高并发下,如何做到安全的修改同一行数据。

9.5 乐观锁和悲观锁是什么,INNODB的标准行级锁有哪2种,解释其含义。

9.6 SQL优化的一般步骤是什么,怎么看执行计划,如何理解其中各个字段的含义。

9.7 数据库会死锁吗,举一个死锁的例子,mysql怎么解决死锁。

9.8 MYsql的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

9.9 聚集索引和非聚集索引的区别。

9.10 select for update 是什么含义,会锁表还是锁行或是其他。

9.11 为什么要用Btree实现,它是怎么分裂的,什么时候分裂,为什么是平衡的。

9.12 数据库的ACID是什么。

9.13 某个表有近千万数据,CRUD比较慢,如何优化。

9.14 Mysql怎么优化table scan的。

9.15 如何写sql能够有效的使用到复合索引。

9.16 mysql中in 和exists 区别。

9.17 数据库自增主键可能的问题。

9.18 MVCC的含义,如何实现的。

9.19 你做过的项目里遇到分库分表了吗,怎么做的,有用到中间件么,比如sharding jdbc等,他们的原理知道么。

9.20 MYSQL的主从延迟怎么解决。

10 消息队列

10.1 消息队列的使用场景。

10.2 消息的重发,补充策略。

10.3 如何保证消息的有序性。

10.4 用过哪些MQ,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗,你们公司的MQ服务架构怎样的。

10.5 MQ系统的数据如何保证不丢失。

10.6 rabbitmq如何实现集群高可用。

10.7 kafka吞吐量高的原因。

10.8 kafka 和其他消息队列的区别,kafka 主从同步怎么实现。

10.9 利用mq怎么实现最终一致性。

10.10 使用kafka有没有遇到什么问题,怎么解决的。

10.11 MQ有可能发生重复消费,如何避免,如何做到幂等。

10.12 MQ的消息延迟了怎么处理,消息可以设置过期时间么,过期了你们一般怎么处理。

11.缓存

11.1 常见的缓存策略有哪些,如何做到缓存(比如redis)与DB里的数据一致性,你们项目中用到了什么缓存系统,如何设计的。

11.2 如何防止缓存击穿和雪崩。

11.3 缓存数据过期后的更新如何设计。

11.4 redis的list结构相关的操作。

11.5 Redis的数据结构都有哪些。

11.6 Redis的使用要注意什么,讲讲持久化方式,内存设置,集群的应用和优劣势,淘汰策略等。

11.7 redis2和redis3的区别,redis3内部通讯机制。

11.8 当前redis集群有哪些玩法,各自优缺点,场景。

11.9 Memcache的原理,哪些数据适合放在缓存中。

11.10 redis和memcached 的内存管理的区别。

11.11 Redis的并发竞争问题如何解决,了解Redis事务的CAS操作吗。

11.12 Redis的选举算法和流程是怎样的。

11.13 redis的持久化的机制,aof和rdb的区别。

11.14 redis的集群怎么同步的数据的。

11.15 知道哪些redis的优化操作。

11.16 Reids的主从复制机制原理。

11.17 Redis的线程模型是什么。

11.18请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存。

11.19 如何看待缓存的使用(本地缓存,集中式缓存),简述本地缓存和集中式缓存和优缺点。

11.20 本地缓存在并发使用时的注意事项。

12.搜索

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

12.2 elasticsearch 索引数据多了怎么办,如何调优,部署。

12.3 elasticsearch是如何实现master选举的。

12.4 详细描述一下Elasticsearch索引文档的过程。

12.5 详细描述一下Elasticsearch搜索的过程。

12.6 Elasticsearch在部署时,对Linux的设置有哪些优化方法?

12.7 lucence内部结构是什么。