面试题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是什么?项目里面是什么怎么用的?