面试题day7

携程网

  • 问了实习项目,承担什么职位?有什么困难?

  • 为什么选用这个技术?

  • 聊了下Nacos的源码,主要说了服务端注册和客户端注册的源码

  • 项目怎么解决Redis和MySQL数据库不一致问题?

    • 先删除缓存,再更新数据库

      • 问题
        • 请求1先把cache中的A数据删除;请求2从DB中读取数据将将数据A写入cache;请求1再把DB中的A数据更新。
      • 解决方案
        • 延迟双删策略:先删除缓存;再更新数据库;休眠1秒,再次删除缓存;
    • 先更新数据库,再删除缓存

      • 问题

        很难发生,数据库的写慢于缓存的写

        • 缓存刚好失效,请求1从DB读数据A;请求2写更新数据 A 到数据库并把删除cache中的A数据;请求1将数据A写入cache。
  • HashMap啥时候扩容,为什么扩容?

    链表散列/红黑树 (n-1)&hash 头插尾插

    扩容因子 循环链表 线程不安全

  • Reentrantlock加锁的源码

    底层为aqs类似(mesa),可重入锁

    等待队列(先进先出) 条件队列

    实现公平锁、非公平锁

  • MySQL的索引结构

    b+树 数据存储在叶子节点 io次数减少

    事务 锁 外键 mvcc 场景

  • 索引什么时候失效?

    违背最左前缀原则

    select *

    索引列上有计算

    索引列使用函数

    索引字段类型不同

    like左边包含%

    or关键字未全部使用索引

    not in和not exists

  • Kafka怎么保证消息可靠传输?

  • Kafka的结构,选举简单说下

  • 算法题是一道简单的找规律题,口答了思路

  • 平常读什么书,怎么学习的

  • 布隆过滤器,我说了谷歌版本的源码思路

    实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

  • 线程池参数及创建

    降低资源消耗 提高响应速度 提高线程的可管理性

    单例线程池 固定线程池 可变线程池 周期线程池 自定义线程池 ThreadPoolExecutor

    核心线程数 等待队列 最大线程数 存活时间 时间单位 拒绝策略 线程工厂

    自己调用 拒绝 丢弃 丢弃最早

  • 我把SpringIOC在源码层面从注册到生产bean,再到bean的生命周期讲了一遍

    • Spring的启动流程

      • 初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
      • 将配置类的BeanDefinition注册到容器中
      • 调用refresh()方法刷新容器
    • bean的创建过程

      • 推断构造方法
      • 依赖注入
      • 初始化前
      • 初始化
      • 初始化后
  • 说AOP的时候,从解析切面,到创建动态代理说了下

    Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用 Cglib 生成一个被代理对象的子类来作为代理。常用于计算接口运算时间、记录日志。

  • Redis数据类型,然后说了下zset的跳表,

    • string 缓存 session共享 分布式锁 int embstr简单动态字符串 简单动态字符串
    • list 消息队列 ziplist linkedlist
    • hash 存储对象 ziplist hashtable
    • set 集合 intset hashtable
    • zset 排行榜 ziplist skiplist
  • Redis为啥快

    内存数据库 单线程 io多路复用 自定义数据结构

  • Redis的集群模式,选举和脑裂

    • 主从模式
      • 是最为简单的redis集群模式
      • 主要工作模式是主从复制。
        • 主数据库可以执行读写功能,而从数据库只能执行读功能。
        • 主数据库数据发生变化,会自动同步到从数据库。
      • 主数据库为master,从数据库为slave
        • 一个master可以有多个slave
        • 一个slave只能有一个master
        • slave挂了,重新启动会从master同步数据
        • master挂了,服务器只能进行读功能,不能执行写功能,直到master重新启动同步数据后,才能提供写服务。
    • 哨兵模式:
      • 可以解决主从模式的弊端:master挂掉之后不能提供写功能。
      • 哨兵模式是建立在主从模式的
      • 当master挂掉之后,会自动从slave中选一个作为master。
        • 若master重新启动,master则会转化为现有的master下的一个slave
      • 当slave切换时,会通过发布订阅方式,将slave所对应的master更改
      • 注意:
        • 因为哨兵也是一个进程,所以也有挂掉的可能,需要配置多个哨兵互相监督。
        • 一个哨兵可以监督多个主从数据库。同样,一个主从数据库可以被多个哨兵监督。
    • Cluster模式
      • redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求,自动将数据进行分片,每个master上放一部分数据提供内置的高可用支持,部分master不可用时,还是可以继续工作的
      • 支撑N个redis master node,每个master node都可以挂载多个slave node
      • 高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master
  • 面试官口述了一道动态规划题,我简单说了下思路,面试官说可以就没继续说了,二面的面试官面评挺好的,说深度挺好的,接下来继续提高广度就好了,接着聊了下最近在用的Mongodb

阿里菜鸟

  • 简单介绍下团队情况,有多少人,然后你负责那一块?

  • acm比赛流程说一下?

  • 个人参加奖项说一下

  • 做题到底是做哪一类题目?

  • 核心能力是什么,能胜任的工作?

  • 讲一下你做的比较好一个项目吗?

  • 如果用redis做分布式锁,他的好处是什么,有考虑到其他方案吗?

    性能高,实现简单

  • spring 和 springboot的区别?

    自动配置、starter、监控

  • 除了spring你还接触过其他框架吗,java系列的?

    mybatis、slf4j

  • java 面向对象特性

    封装 继承 多态

    对象高度封装 扩展父类 重写(加载类时方法表,先加载父类方法,再加载子类覆盖)、重载

    static 属于类 解耦 final 引用指针不可变(类不可继承、方法不能重写、变量不可变)

  • 创建对象

    new clone 序列化 反射

  • 反射的运用场景

    开发各种通用框架

  • spring 哪里运用到了反射

    创建 Bean 实例时的反射

    构造方法依赖注入时的反射

    setter() 方法依赖注入时的反射

    @Autowired 依赖注入时的反射

  • jdk哪里东西用了反射

    log4j,Servlet、SSM的底层

  • 集合的序列化和反序列化里面内容是什么,原理是什么?

    字节流 Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程

  • 设计模式?项目里面是怎么用的?

    单例模式、工厂模式、代理模式

  • 项目用什么垃圾回收器

    g1

    cms parnew

    parallel parallelold

    serial serialold

    静态变量 常量 虚拟机栈引用对象 本地方法区的引用对象

  • 索引特性

    提高数据库的性能,不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。查询速度的提高是以插入、更 新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。

  • 做的最复杂的sql是什么?项目里面是什么怎么用的?

posted @ 2022-07-12 20:34  Faetbwac  阅读(22)  评论(0编辑  收藏  举报