8-18被捞
一面8-19 1h
晚上8点视频面,辛苦了
-
实习经历
-
说说日志 undo log、redo log(回滚/归档)
-
项目用的Redis存的什么数据结构(那肯定是string)
-
项目Redis用在什么地方?
-
Redis基本数据类型
-
Zset底层数据结构(跳表+hashmap)
-
过期键处理策略(内存淘汰机制)
-
跑3个服务,怎么保证同一时刻只有一个请求进来?(分布式锁,Redis/Redisson)
-
有哪些分布式锁?(Redis跟他儿子Redisson,应该还有zookeeper、数据库锁)
-
Redis分布式锁存些什么?怎么实现的(setnx,key锁名,value=uuid+线程名)
-
那你讲讲什么是分布式?(分布在不同机器、硬件上的服务,通过远程调用实现通信)
-
Redis做分布式锁,加锁宕机怎么办?(设置过期时间防止死锁)
-
那执行业务时间过长怎么办?(看门狗机制,过期时间30s,间隔10s检测服务是否存活)
-
Redis跟Memcached区别(没用过MC)
-
持久化机制(RDB、AOF)
-
知道Lua脚本吗?(将一组命令打包作为整体,原子执行,运行时不会被其他请求插入;减少网络io;复用)
-
MySQL底层索引结构(b+树)
-
为什么不用b树(链表串叶子节点、提高查询效率,降低树高度;磁盘io少没说)
-
间隙锁知道吗?(record lock,gap lock、next-key lock都抡一下)
-
怎么解决Redis宕机后服务不可用问题(吹)
-
Java对象存储在内存中的结构(说了堆,应该讲Java内存布局,对象头之类的)
-
Java对象包含什么?例如Java对象头(对象头、实例数据、对齐填充;MarkWord、类元指针,数组长度)
-
MarkWord里有什么?(锁标志等信息、hashcode、分代年龄、指向锁的指针)
-
锁升级?(无锁、偏向锁、轻量级锁、重量级锁)
-
synchronized底层加锁原理(ObjectMonitor获取监视器、mutex lock)
-
你用过什么Java的锁?(ReentrantLock、ReentrantReadWriteLock、StampedLock。。。)
-
循环CAS循环几次?(失败自旋无限次,比如说AtomicInteger的getAndAddInt,但是可以设置阈值)
-
这些锁跟synchronized区别(进入的线程状态不同说起,到LockSupport、UnsafeCAS)
-
synchronized可以加在代码块上吗?
-
快排+单词逆序+三个字母全排列(谢谢放过)
-
反问
二面8-23 30min
下午5点电话面
-
实习经历
- MySQL如何保证事务一致性(通过aid保证c、undo log回滚日志/redo log归档日志。加餐:隔离性加锁、原子性undo log回滚、持久性redo log归档)
-
事务四种隔离级别(读未提交、读已提交、可重复读、串行化)
- MySQL默认隔离级别(可重复读Repeated-Read)
-
如何保证序列化(应该是Serializable)?(加表锁,使事务串行执行)
-
SpringBoot项目中你怎么使用事务?(声明式事物加个注解@Transactional实现事务管理)
-
加一个注解就会生效吗?(不是,还需要数据源支持事务;无需配置,AOP拦截方法前后加入事务,根据执行情况进行回滚/提交;Springboot默认开启事务管理,也可以配置发生某些异常时不回滚rollbackfor)
-
项目什么场景下用到事务?(复合修改操作/增删改,有异常回滚;查询可以容忍数据丢失)
-
项目
- SQL:预约记录,求最多预约记录的用户id(大佬们,求更好的答案)
SELECT user_id FROM my_record GROUP BY user_id ORDER BY COUNT(*) DESC LIMIT 1; -- 子查询方式 select user_id from ( SELECT user_id,COUNT(*) as ct FROM record GROUP BY user_id ) t ORDER BY t.ct DESC LIMIT 1;
- LinkedList存储Integer,求两个list交集
public static void main(String[] args) { LinkedList<Integer> list1 = new LinkedList<>(); LinkedList<Integer> list2 = new LinkedList<>(); list1.add(1); list1.add(3); list1.add(5); list1.add(7); list2.add(2); list2.add(3); list2.add(5); // api,保留传入list相同元素,其他删除(求交集存储在调用者上) // list1.retainAll(list2); // contains判断,不存在则删除 // 使用迭代器遍历list,避免删除后边界、下标问题 Iterator<Integer> iterator = list1.iterator(); while (iterator.hasNext()) { if (!list2.contains(iterator.next())) { iterator.remove(); } } }回答的不好,贴一下对问题的理解吧
全部评论
(11) 回帖