2024年面试记录

3.20日哈啰面试纪要

1.介绍自己,巴拉巴拉
2.面试官谈到了redis
问:redis在项目中你们主要用来干什么的?
答:分布式锁、存储图标信息
问:你们hash类型主要用来做什么?
答:主要用来存储token
问:token不应该怎么存吧
答:尴尬
问:redis存储list数据的几个基本指令
答:lpush、lpop(尴尬,要注意list是队列有顺序的)
问:redis的redission包具体解决了哪些问题,当中的过期时间会导致什么场景
答:没答好(建议重新归纳总结一下)
补充:主要解决了不可重入、上锁失败后重试、续约过期时间、redis集群锁同步。应该问我们用什么会锁过期,像redission的话,会循环续约过期时间,根本不会过期,除非是服务宕掉了。而我们自定义的上锁,过期了就会导致其他线程进来,而本线程有可能会删掉其他线程上的锁而导致没有锁。
问:怎么解决redis的读写不一致的问题
答:redis有一个注解,是针对更新接口的,一旦更新了这个接口就会让redis即时刷新(应该说细一点,这个注解是怎么工作的,是先删后插还是怎么样)
补充:在更新接口应该先做完业务以后,删除key,再创建一个key。再说一下为什么
问:一个热点key失效,导致缓存击穿怎么处理(但是他这里说他是缓存穿透,我记得可以用布隆过滤器去解决缓存穿透,但他说错了,导致我不敢说)
答:没答好
3.开始聊MySQL了
问:mysql慢查询怎么解决的?怎么去查慢查询日志的
答:我们一般都是会在mysql中开启慢查询日志的,生成一个slow.log文件,然后通过查询语句去查到慢sql(最好说一下什么语句),或者是通过测试定位到慢接口,去对他进行处理
问:怎么去优化sql语句
答:使用explain关键字去分析sql语句,join用大表连小表,是否连表过多,是否使用到了索引,索引是否遵循最左前缀原则
问:索引的类型有哪些
答:索引分为聚簇索引和非聚簇索引。聚簇索引就是主键,非聚簇索引有普通索引、唯一索引、全文索引。
问:select * from 表 where id = 1 和 select id from 表 where id = 1哪个效率高一些?
答:差不多,因为b+树的特性,它的主键是带着这一行的其他字段的,如果忽略掉网络的话,两者是一样的。
4.聊了一下项目秒杀
问:如果秒杀成功了,下单失败了
答:我这边经过redis实际上就是完成了下单了,后续对db的操作交给rabbitmq做,rabbitmq如果失败会去重试的,我这边最多只能在消费者那边catch到,记录到日志做补偿机制(建议看一下高并发场景下怎么处理的)
问:生产者生产完以后返回一个什么数据
答:返回一个布尔型的数据
问:你怎么样防止超卖的,请说出多个方案
答:1.加分布式锁 2.用rabbitmq顺序消费 3.mysql设置事务隔离级别 serilizable(面试官补充可以用乐观锁去做)
补充:1.mysql的写锁(悲观锁)是可以去做的
问:mysql集群怎么样保证数据的一致性
答:通过读取binlog(应该是错的)

4月9号外包面试纪要

就问了一些面经,这一场不行,但是也说一下我的一些问题
问:Java中的泛型指的是什么
答:是给代码定义的一个规范
补充:
问:mysql的in中最多有多少个值才会使索引失效
补充:

4月10号国际支付外包面试纪要

这场主要问了项目,让我知道项目中一些知识点错了
问:项目中的JVM调优
答:(当时脑子不清醒说错了,这里直接说正确的答案好了)我们使用arthas发现服务隔几分钟就进行一次full gc ,发现是对象进入新生代以后,在s区没经过几代就直接进入老年代,最终导致老年代占满。因为我们新生代的 eden:s0:s1 是 8:1:1,在经过minor gc以后,对象就放到s区里,而s区设置的过小,导致触发了动态年龄判断(年龄1-n的占用内存大于s区的一半的时候,年龄大于n的直接进老年代)。最终的解决办法是调整新生代的比例为2:1:1。
问:你们默认用的垃圾回收器是什么
答:(没答出来,这里重新说一下了)jdk1.8的默认垃圾回收器是parallel scavenge和parallel old并行垃圾回收器,它的优点是高吞吐量,但是gc时间相对较长一点,适合对系统资源有一定要求但又不希望停顿时间过长的场景。而1.9以后默认采用的是G1全代垃圾回收器,
问:秒杀功能,你说你在redis里面做之前还要去库里查一下用户积分是否足够?
答:我们应该直接同步用户的积分到redis里面的用户信息中,不应该去mysql查而是在lua脚本里直接查redis
问:你这边可以直接用分布式锁啊,没有必要写在lua脚本里吧,
答:分布式锁锁商品也是可以达到这种效果的,但是直接操作redis会相对快一些

这里说一下几个名词,tps和qbs.
QPS(TPS):每秒钟request/事务 数量 。对于接口而言我们可以认为它们是一个东西

4月10号中华保险外包一面面试纪要

问:怎么解决的慢sql的问题
答:(这里整体答的还可以,说一下存在的问题)应该用小表驱动大表,因为走索引以后,我们查找的匹配次数=驱动表的行数*副表的b+树层数,层数一般不会超过4。
问:如果一张表的数据量过大,应该怎么去分库分表,我们怎么去评估呢,应该分多少张表或者多少个库
答:尽量不让每张表的行数超过百万。
补充:
问:雪花算法怎么实现
答:不知道
补充:这里简单说一下雪花算法,它是由时间戳(毫秒级别)+机器ID+序列号(用于解决在同一毫秒内生成多个id的问题日,序列号的部分是应该自增的计数器,同一毫秒中,直接递增)组成的
问:你在使用阻塞队列的接口中使用了completableFuture还使用了线程池,你知道completableFuture执行的时候用了线程池的吗?
答:我是把它作为属性放进线程池的,并且使用的是complete方法,不是异步的,此时completableFuture使用的线程池就是我当前的这个线程池。
问:zset跳表有没有了解
答:没有。
补充:
问:大key问题怎么解决?
答:
问:@autowired和@resource的区别
答:(我这里说反了)@autowired先按类型去找,再根据名字;@resource先按名字去找,再根据类型
问:mybatis的架构,它分成哪些层,然后做了什么事情
答:不知道
补充:
问:幂等性有处理过吗
答:不知道
补充:1.幂等性校验(在接口里面先查再做操作) 2.用saveOrUpdate的方式保证 3.使用乐观锁 4.使用唯一标识,如traceId 5.使用状态标记 6.使用一次性token 7.使用缓存记录操作日志
问:索引的字段查询的时候反过来,还会走索引吗
答:走一部分(错!)
补充:走,实际上优化器就会把这个顺序问题给他处理掉的,和顺序没关系的。
问:索引下推有了解吧。我建立了一个索引 a,b,c,查询语句是select * from 表 where a=‘’ and b>‘’ and c<‘’,这时候索引下推下推的应该是哪个东西
答:c。34.05 35.05

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值