1. arraylist和linkdlist区别

    arraylist和linkedlist都是实现list接口的方式来使用的,所以都具有索引,元素可以重复,存储和取出有顺序的特性,并且list和set都是实现集合的顶级接口Collection,所以arrylist和linkedlist也可以通过Collection的APi对集合进行操作,但是arraylist底层是基于数组结构,数据结构是可以直接通过对应的地址值进行查询或修改,所以查询或修改任何数据的耗时都是相同的,而linkedlist底层是基于链表结构,链表是由一个个数据和地址值,并且每个数据的地址都会指向下一个数据的地址进行连接,形成一条链,删除和添加的效率会比较高;

    1. 常见的数据库优化有哪些?(sql优化)
    • sql的优化
    • 索引的优化,确保索引都有效,可以参考索引失效的七字口诀
    • 表结构的优化,选用适用的字段属性
    • 事务的处理,不是所有的数据库操作都可以只用一条,或者少数几条sql就可以完成的,更多的时候是需要用到一系列的语句来完成某种工作,可以保持数据库中数据的完整性和一致性
    • 锁表问题,由于在事务执行的过程中,数据库会被锁定,因此其他用户的请求只能等待这个事务结束,所以有些时候,可以通过优化锁表获得更好的性能
    • 系统配置的优化,包括系统的连接数,断开资源的回收设置,打开文件的数量的限制,mysql的连接数的设置,内存设置,慢查询设置等…
    • 硬件的优化,包括服务器硬件和网络宽带的优化,
    • 分库分表(mysql集群)
    • 存储引擎的选择
    1. springioc、aop、di的理解
    • Spring两大核心是IOC(控制反转)和AOP(面向切面编程) DI(依赖注入)
    • IOC是把创建对象的操作交给Spring容器去执行
    • AOP是在不修改源代码的基础上对功能进行增强,底层使用的是动态代理的方式
    • DI是把创建的对象赋值给某个类的变量去使用
    1. redis缓存穿透、击穿、雪崩的产生原因和解决方案(以及了解redis数据类型)
    • 缓存穿透:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大.

    解决方法:

    1. 接口层增加校验,如用户鉴权校验;
    2. 从缓存取不到的数据,在数据库中也没有取到,这时可以在缓存中存储一个空值,这样可以防止攻击用户反复用同一个id暴力攻击。
    • 缓存击穿:key对应的数据存在,但在redis中过期,此时若有⼤量并发请求过来,这些请求发现缓存过期⼀般都会从后端DB加载数据并回设到缓存,这个时候⼤并发的请求可能会瞬间把后端innoDB压垮。

    解决方法:

    1. 设置热点数据永远不过期。
    2. 数据进行热加载在服务器启动的时候对热门数据进行读取,并存放到缓存中。
    • 缓存雪崩:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

    解决方法:

    1. 缓存数据的过期时间设置不同,防止同一时间大量数据过期现象发生。
    2. 设置热点数据永远不过期。
    • redis数据类型:

    set,zset(有序的set集合),list,string,hash

    1. springcloud常用组件

      Eureka: 注册中心, 服务注册和发现
      Ribbon: 负载均衡, 实现服务调用的负载均衡
      Hystrix: 熔断器
      Feign: 远程调用
      Gateway: 网关
      Spring Cloud Config: 配置中心

    spirngCloud常用组件主要有6种
    第一是注册中心,包括“Eureka”和“nacos”
    第二个是负载均衡“Ribbon”,负责请求的分配方式,默认使用的是轮寻的方式进行分配,可以通过重写IRule接口来指定不同的分配方式
    第三个是远程调用OpenFeign
    第四个是网关Gateway,可以对请求进行路由、限流、权限校验、负载均衡、跨域等操作
    第五个是微服务保护Sentinel,主要用于解决微服务的雪崩问题,可以通过超时处理,舱壁模式,溶断降级,流量控制的方式去处理雪崩问题
    第六个是分布式配置SpringCloudConfig和Nacos;

    1. 为什么要用elasticsearch,倒排索引是什么,底层原理是怎样的
    • elasticsearch是用于替代数据库查询的搜索技术,可以很大程度提高查询的效率,其中最为明显的是模糊查询时候的效率会有一个很大的提升,es是通过倒排索引进行查询操作
    • 倒排索引是由若干条文档组合成的索引表,其中文档包括了词条、文档id等数据,词条是由正向索引的每一行数据通过分词器进行分词并存储到词条中,并把关联的数据id存储到文档id中,其中文档id是可以存储多个关联数据id
    • es的底层是基于lucene开发的,lucene提供了搜索引擎的核心api,相比与lucene,es支持分布式,且可水平扩展,并提供restful接口,可被多种语言应用
    1. 常见的数据库锁有哪些

      1.行锁和表锁
      2.悲观锁和乐观锁

    2. sql慢查询是怎样优化

      1. 根据业务场景建立复合索引只查询业务需要的字段,如果这些字段被索引覆盖,将极 大的提高查询效率。
      2. 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率.
      3. where 条件字段上需要建立索引, 但 Where 条件上不要使用运算函数,以免索引失效.
      4. 排序字段上, 因为排序效率低, 添加索引能提高查询效率.
      5. 优化 insert 语句: 批量列插入数据要比单个列插入数据效率高.
      6. 优化 order by 语句: 在使用 order by 语句时, 不要使用 select *, select 后面要查有 43 索引的列, 如果一条 sql 语句中对多个列进行排序, 在业务允许情况下, 尽量同时用升 序或同时用降序.
      7. 优化 group by 语句: 在我们对某一个字段进行分组的时候, Mysql 默认就进行了排序, 但是排序并不是我们业务所需的, 额外的排序会降低效率. 所以在用的时候可以禁止 排序, 使用 order by null 禁用. select age, count(*) from emp group by age order by null 禁用。
      8. 尽量避免子查询, 可以将子查询优化为 join 多表连接查询.
    3. 悲观锁和乐观锁的区别

    (1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是 在做操作之前先上锁。
    (2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会 上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等 机制。 乐 观 锁 适 用 于 多 读 的 应 用 类 型 , 这 样 可 以 提 高 吞 吐 量 , 像 数 据 库 如 果 提 供 类 似 于 write_condition 机制的其实都是提供的乐观锁

    1. 线程池有哪些
    • newCachedThreadPool:创建一个可进行缓存重复利用的线程池
    • newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无 界队列方式来运行这些线程,线程池中的线程处于一定的量,可以很好的控制线程的并发量
    • newSingleThreadExecutor : 创 建 一 个 使 用 单 个 worker 线 程 的 Executor ,以无界队列方式来运行该线程。线程池中最多执行一个线程,之后提交的线程 将会排在队列中以此执行
    • newSingleThreadScheduledExecutor:创建一个单线程执行程序,它可 安排在给定延迟后运行命令或者定期执行
    • newScheduledThreadPool:创建一个线程池,它可安排在给定延迟后运行 命令或者定期的执行
    • newWorkStealingPool:创建一个带并行级别的线程池,并行级别决定了 同一时刻最多有多少个线程在执行,如不传并行级别参数,将默认为当前系统的 CPU
    1. jvm调优原理、内存溢出(OOM)

    2. hashmap底层原理

      HashMap 在 JDK1.8 之前的实现方式 数组+链表, 但是在 JDK1.8 后对 HashMap 进行了底层优化,改为了由 数组+链表或者数值+红黑树 实现,主要的目的是提高查找效率

    索引的类型
    组件 唯一 复合 普通 全文索引