记录一次失败的面试 大家千万不要学我 请不要笑我

这一段时间因为已经的原因,老公司一直发展的不太好,所以想另寻出路,所以就想再找一份工作,然而就在前几天找到了一个面试机会,并且通过了初试,然而在复试的时候出现可致命的问题。九成栽了。所以在这里记录一下。

首先面试是采用的视频面试,但是面试官却迟到了40分钟。整整让我等了40分钟。让本人很不爽。


在这里插入图片描述

然后面试官出场了笔者也正式开始被虐了。

面试官:我看你简历上写着有做过秒杀的功能,麻烦你讲一下秒杀要注意什么吧?

布丁:秒杀要注意库存的控制。

面试官:还有呢?

还有?还有什么啊?我不知道啊。

秒杀要注意一些什么

1、要注意库存控制
2、注意接口限流

布丁:还有什么?其他的不太了解。

面试官:比如如何控制别人写个程序一直去请求啊。

布丁:可以使用Ip去控制,可以是一个Ip一段时间只能访问一次。

面试官:除了这种方式呢?

布丁:其他的不太了解。

如何防止一直刷接口

1、针对IP做限流,比如同一个IP 5秒内不允许重复访问
2、对接口操作做验证码处理
3、对同一个用户做限制,如秒杀接口使用用户ID做限制。同一个用 户ID不允许频繁请求
4、经过评论区的大佬指点知道了还可以通过MQ进行削峰,降低并发量,感谢大佬

到这里就还算可以,起码没有什么大问题,接下来就是高能了。。

面试官:那你讲一下如何使用redis控制库存吧。

布丁:redis控制库存,主要是在创建秒杀活动的时候吧库存存入redis中,然后通过递减的方式。每次先递减然后再判断值。直到0就证明没有库存了。

面试官: 到0?确定是到0吗?

布丁:沉默中。。难道不是吗?我记得当时是的啊。

布丁:是。没错。

面试官:你确定吗?

布丁:确定。

确定个屁啊。
比如商品总数是5,那么默认存入redis中的是5。
然后我们一个一个来数啊。
第一次 redis=5-1=4 不等于0 没问题。
第二次 redis=4-1=3 不等于0 没问题。
第三次 redis=3-1=2 不等于0 没问题。
第四次 redis=2-1=1 不等于0 没问题。
第五次 redis=1-1=0 等于0 库存卖光了。
到上面都还没有问题,然而接着往下看
第六次 redis=0-1=-1 不等于0 没问题。
第六次 redis=-1-1=-2 不等于0 没问题。
是不是出问题了,是不是。所以这里应该判断的是redis库存<=0就属于没有库存了,不应该是等于0
栽了,栽了。

接下来还有很多个跟头。

面试官:你来说一下mysql的乐观锁是怎么实现的吧。

布丁:mysql的乐观锁是在表中加一个版本的字段,然后获取的时候把版本获取回来。然后版本号+1,更新的时候判断一下数据库的版本号+1是不是等于自己的版本号。

面试官:你确定吗?确定是在更新的时候判读版本号吗?

布丁:应该是吧。心想:难道不是吗?我记得是这样啊。

面试官:你再考虑一下?

接下来就是长达一分钟的静默时间。。。
。。。。
。。。。
。。。。

面试官:好吧,我们先跳过这个问题。

你想个屁啊,不就是吗。不是在更新语句记一个判断吗。更新失败就更新失败了。没错啊。感觉被忽悠了。这也只能怪我自己不够自信栽了、栽了

在这里插入图片描述

经过上面的几轮打击,笔者的大脑已经开始混乱了于是出现了下面超级多的问题。。

在这里插入图片描述

面试官:我看你简历上面写着redis实现了一个生产者/消费者队列,你是怎么实现的呢?

布丁:我是使用一个redis的队列通过leftpush 和 rightpop实现的。启动一个线程池去持续的关注队列是否有数据插入,如果有数据插入和把数据发送到指定的类进行处理。

面试官:那redis列表可以进行持久化吗?

布丁:可以吧。不过没有了解过。


redis列表数据可以进行持久化吗

我试了一下,先使用lpush放入list几个元素

在这里插入图片描述

然后关闭redis然后开启,发现数据还是在的。这不就证明redis的列表数据是可以做持久化的。
不知道是我理解错了面试官说的话还是怎么样。。希望知道了大佬在评论区回复我一下


面试官:那你能说一下redis的和普通的activeMQ有什么区别吗?

布丁:这块没有了解过,不太清楚

不太清楚个屁啊

redis队列和其他队列的区别和劣势

优点:效率高,简单易懂
缺点:redis队列不具备有可靠性

到达这里笔者已经要绝望了,只想让面试官停止吧。再下去要死人的。。 然而,面试官听不见我内心的呼救

在这里插入图片描述

面试官:你清楚springAOP吗?

布丁:还好。

面试官:那你告诉我如果使用一个自定义的注解然后有这个注解方法全部都加上一个日志,要怎么做。

这还不简单吗?我平时就写过啊。

在这里插入图片描述

布丁:首先先建立一个切点,然后在使用@around环绕这个切点。然后打印就可以了。

面试官:那么如何建议一个切点呢?

当问出这句话的时候,笔者的大脑是懵的。大脑已经想不起来了,只记得什么ex,ex,ex然后就没有然后了。这个主要还是要怪,笔者平时写的时候都是复制别人写好的。

布丁:这个不太了解

面试官:好的。


springAOP自定义注解

1、定义自定义注解
2、定义切点
@Pointcut("@annotation("注解类位置")
3、使用@Aspect注解类
4、使用@Around或者其他的注解修饰方法。然后在方法中打印日志


面试官:那你直到注解是存在哪里的吗?如何取到注解里面的数据?

布丁:不太清楚


springAOP注解是存在哪里的吗?如何取到注解里面的数据?

目前还不清楚,之后查完补上


在这里插入图片描述

到这里笔者已经要死了,只想赶快停止这个面试。赶快停止。。然而面试官并不就此善罢甘休。

面试官:你最近有学什么技术吗?

问得好,我最近正好在学HashMap,并且看了一些HashMap的源码。问吧。。

布丁:我最近在学HashMap。有在看一些源码。

面试官:那你说下hashCode 和 equles 的区别。

布丁:hashCode是获取key的哈希值,equles是比较key的内存地址是否一致如果不重写默认就是==。

面试官:那为什么hashCode为什么要和equles一块存在呢?谁的级别更高使用一个不久可以了吗?

愣住。。。


hashCode为什么要和equles一块存在呢?谁的级别更高使用一个不久可以了吗?

hashCode是比较Hash值二equles默认是比较地址。hashCode相同equles不一定相同。但是笔者还是没有明白为什么hashCode为什么要和equles一块存在呢,希望知道的同学可以给我解答一下。

经过评论区大佬和我自己的学习,我知道了
1、hash的存在是为了更快的对比两个数的值,如果hash不同那么就没必要对比后面的值了,因为hash是事先生成好了,所以速度是比较快的。
2、在没有重写hash和equals的情况下,hash不相同,两个对象就一定不同,hash相同两个对象不一定相同,equals相同hash一定相同。
3、如果遇到了所谓的‘哈希碰撞’那么就需要使用equals进行比较了。
4、基于以上两点,我们知道如果要是重写了equals,那么就必须要重写hash。
都是自己的理解,如果又不对的欢迎大佬评论指出


面试官:那你说下HashMap的链表是头插法还是尾插法。

再次愣住。。。我为什么要说自己正在学HashMap呢,我是不是智障啊。自己没学深,还来显摆。要死了

布丁:不太清楚。


HashMap的链表是头插法还是尾插法

JDK8以前是头插法,JDK8后是尾插法


面试官:好了,没什么了,可以的话通知你。

在这里插入图片描述

总结:
1、要多自己写一些东西,不要老是复制。
2、面试的时候要脑子清晰,冷静。不要被面试官带着走。
3、了解一个技术要了解透彻。

好了不说了,笔者要去准备下一场面试了(哪有下一场啊,混蛋)。这些都是本人的真实经历,希望大家借鉴一下,笑笑就好。

厚颜无耻的推荐下我其他的博文

厕所和多线程有什么关系?读不懂就去上厕所吧。最简单的多线程理解,小白都可以看
【RE:布丁JAVA学习】这大概是史上最详细的JAVA泛型教程,不看后悔。
SpringBoot 使用 redis实现 生产者/消费者模式 消息队列

在这里插入图片描述

你可能感兴趣的:(记录一次失败的面试 大家千万不要学我 请不要笑我)