记录一次失败的面试 大家千万不要学我 请不要笑我
這一段時(shí)間因?yàn)橐呀?jīng)的原因,老公司一直發(fā)展的不太好,所以想另尋出路,所以就想再找一份工作,然而就在前幾天找到了一個(gè)面試機(jī)會(huì),并且通過(guò)了初試,然而在復(fù)試的時(shí)候出現(xiàn)可致命的問(wèn)題。九成栽了。所以在這里記錄一下。
首先面試是采用的視頻面試,但是面試官卻遲到了40分鐘。整整讓我等了40分鐘。讓本人很不爽。
然后面試官出場(chǎng)了筆者也正式開(kāi)始被虐了。
面試官:我看你簡(jiǎn)歷上寫(xiě)著有做過(guò)秒殺的功能,麻煩你講一下秒殺要注意什么吧?
布丁:秒殺要注意庫(kù)存的控制。
面試官:還有呢?
還有?還有什么啊?我不知道啊。
秒殺要注意一些什么
1、要注意庫(kù)存控制
2、注意接口限流
布丁:還有什么?其他的不太了解。
面試官:比如如何控制別人寫(xiě)個(gè)程序一直去請(qǐng)求啊。
布丁:可以使用Ip去控制,可以是一個(gè)Ip一段時(shí)間只能訪問(wèn)一次。
面試官:除了這種方式呢?
布丁:其他的不太了解。
如何防止一直刷接口
1、針對(duì)IP做限流,比如同一個(gè)IP 5秒內(nèi)不允許重復(fù)訪問(wèn)
2、對(duì)接口操作做驗(yàn)證碼處理
3、對(duì)同一個(gè)用戶做限制,如秒殺接口使用用戶ID做限制。同一個(gè)用 戶ID不允許頻繁請(qǐng)求
4、經(jīng)過(guò)評(píng)論區(qū)的大佬指點(diǎn)知道了還可以通過(guò)MQ進(jìn)行削峰,降低并發(fā)量,感謝大佬🙏
到這里就還算可以,起碼沒(méi)有什么大問(wèn)題,接下來(lái)就是高能了。。
面試官:那你講一下如何使用redis控制庫(kù)存吧。
布丁:redis控制庫(kù)存,主要是在創(chuàng)建秒殺活動(dòng)的時(shí)候吧庫(kù)存存入redis中,然后通過(guò)遞減的方式。每次先遞減然后再判斷值。直到0就證明沒(méi)有庫(kù)存了。
面試官: 到0?確定是到0嗎?
布丁:沉默中。。難道不是嗎?我記得當(dāng)時(shí)是的啊。
布丁:是。沒(méi)錯(cuò)。
面試官:你確定嗎?
布丁:確定。
確定個(gè)屁啊。
比如商品總數(shù)是5,那么默認(rèn)存入redis中的是5。
然后我們一個(gè)一個(gè)來(lái)數(shù)啊。
第一次 redis=5-1=4 不等于0 沒(méi)問(wèn)題。
第二次 redis=4-1=3 不等于0 沒(méi)問(wèn)題。
第三次 redis=3-1=2 不等于0 沒(méi)問(wèn)題。
第四次 redis=2-1=1 不等于0 沒(méi)問(wèn)題。
第五次 redis=1-1=0 等于0 庫(kù)存賣(mài)光了。
到上面都還沒(méi)有問(wèn)題,然而接著往下看
第六次 redis=0-1=-1 不等于0 沒(méi)問(wèn)題。
第六次 redis=-1-1=-2 不等于0 沒(méi)問(wèn)題。
是不是出問(wèn)題了,是不是。所以這里應(yīng)該判斷的是redis庫(kù)存<=0就屬于沒(méi)有庫(kù)存了,不應(yīng)該是等于0
栽了,栽了。
接下來(lái)還有很多個(gè)跟頭。
面試官:你來(lái)說(shuō)一下mysql的樂(lè)觀鎖是怎么實(shí)現(xiàn)的吧。
布丁:mysql的樂(lè)觀鎖是在表中加一個(gè)版本的字段,然后獲取的時(shí)候把版本獲取回來(lái)。然后版本號(hào)+1,更新的時(shí)候判斷一下數(shù)據(jù)庫(kù)的版本號(hào)+1是不是等于自己的版本號(hào)。
面試官:你確定嗎?確定是在更新的時(shí)候判讀版本號(hào)嗎?
布丁:應(yīng)該是吧。心想:難道不是嗎?我記得是這樣啊。
面試官:你再考慮一下?
接下來(lái)就是長(zhǎng)達(dá)一分鐘的靜默時(shí)間。。。
。。。。
。。。。
。。。。
面試官:好吧,我們先跳過(guò)這個(gè)問(wèn)題。
你想個(gè)屁啊,不就是嗎。不是在更新語(yǔ)句記一個(gè)判斷嗎。更新失敗就更新失敗了。沒(méi)錯(cuò)啊。感覺(jué)被忽悠了。這也只能怪我自己不夠自信栽了、栽了
經(jīng)過(guò)上面的幾輪打擊,筆者的大腦已經(jīng)開(kāi)始混亂了于是出現(xiàn)了下面超級(jí)多的問(wèn)題。。
面試官:我看你簡(jiǎn)歷上面寫(xiě)著redis實(shí)現(xiàn)了一個(gè)生產(chǎn)者/消費(fèi)者隊(duì)列,你是怎么實(shí)現(xiàn)的呢?
布丁:我是使用一個(gè)redis的隊(duì)列通過(guò)leftpush 和 rightpop實(shí)現(xiàn)的。啟動(dòng)一個(gè)線程池去持續(xù)的關(guān)注隊(duì)列是否有數(shù)據(jù)插入,如果有數(shù)據(jù)插入和把數(shù)據(jù)發(fā)送到指定的類(lèi)進(jìn)行處理。
面試官:那redis列表可以進(jìn)行持久化嗎?
布丁:可以吧。不過(guò)沒(méi)有了解過(guò)。
redis列表數(shù)據(jù)可以進(jìn)行持久化嗎
我試了一下,先使用lpush放入list幾個(gè)元素
然后關(guān)閉redis然后開(kāi)啟,發(fā)現(xiàn)數(shù)據(jù)還是在的。這不就證明redis的列表數(shù)據(jù)是可以做持久化的。
不知道是我理解錯(cuò)了面試官說(shuō)的話還是怎么樣。。希望知道了大佬在評(píng)論區(qū)回復(fù)我一下
面試官:那你能說(shuō)一下redis的和普通的activeMQ有什么區(qū)別嗎?
布丁:這塊沒(méi)有了解過(guò),不太清楚
不太清楚個(gè)屁啊
redis隊(duì)列和其他隊(duì)列的區(qū)別和劣勢(shì)
優(yōu)點(diǎn):效率高,簡(jiǎn)單易懂
缺點(diǎn):redis隊(duì)列不具備有可靠性
到達(dá)這里筆者已經(jīng)要絕望了,只想讓面試官停止吧。再下去要死人的。。 然而,面試官聽(tīng)不見(jiàn)我內(nèi)心的呼救
面試官:你清楚springAOP嗎?
布丁:還好。
面試官:那你告訴我如果使用一個(gè)自定義的注解然后有這個(gè)注解方法全部都加上一個(gè)日志,要怎么做。
這還不簡(jiǎn)單嗎?我平時(shí)就寫(xiě)過(guò)啊。
布丁:首先先建立一個(gè)切點(diǎn),然后在使用@around環(huán)繞這個(gè)切點(diǎn)。然后打印就可以了。
面試官:那么如何建議一個(gè)切點(diǎn)呢?
當(dāng)問(wèn)出這句話的時(shí)候,筆者的大腦是懵的。大腦已經(jīng)想不起來(lái)了,只記得什么ex,ex,ex然后就沒(méi)有然后了。這個(gè)主要還是要怪,筆者平時(shí)寫(xiě)的時(shí)候都是復(fù)制別人寫(xiě)好的。
布丁:這個(gè)不太了解
面試官:好的。
springAOP自定義注解
1、定義自定義注解
2、定義切點(diǎn)
@Pointcut("@annotation("注解類(lèi)位置")
3、使用@Aspect注解類(lèi)
4、使用@Around或者其他的注解修飾方法。然后在方法中打印日志
面試官:那你直到注解是存在哪里的嗎?如何取到注解里面的數(shù)據(jù)?
布丁:不太清楚
springAOP注解是存在哪里的嗎?如何取到注解里面的數(shù)據(jù)?
目前還不清楚,之后查完補(bǔ)上
到這里筆者已經(jīng)要死了,只想趕快停止這個(gè)面試。趕快停止。。然而面試官并不就此善罷甘休。
面試官:你最近有學(xué)什么技術(shù)嗎?
問(wèn)得好,我最近正好在學(xué)HashMap,并且看了一些HashMap的源碼。問(wèn)吧。。
布丁:我最近在學(xué)HashMap。有在看一些源碼。
面試官:那你說(shuō)下hashCode 和 equles 的區(qū)別。
布丁:hashCode是獲取key的哈希值,equles是比較key的內(nèi)存地址是否一致如果不重寫(xiě)默認(rèn)就是==。
面試官:那為什么hashCode為什么要和equles一塊存在呢?誰(shuí)的級(jí)別更高使用一個(gè)不久可以了嗎?
愣住。。。
hashCode為什么要和equles一塊存在呢?誰(shuí)的級(jí)別更高使用一個(gè)不久可以了嗎?
hashCode是比較Hash值二equles默認(rèn)是比較地址。hashCode相同equles不一定相同。但是筆者還是沒(méi)有明白為什么hashCode為什么要和equles一塊存在呢,希望知道的同學(xué)可以給我解答一下。
經(jīng)過(guò)評(píng)論區(qū)大佬和我自己的學(xué)習(xí),我知道了
1、hash的存在是為了更快的對(duì)比兩個(gè)數(shù)的值,如果hash不同那么就沒(méi)必要對(duì)比后面的值了,因?yàn)閔ash是事先生成好了,所以速度是比較快的。
2、在沒(méi)有重寫(xiě)hash和equals的情況下,hash不相同,兩個(gè)對(duì)象就一定不同,hash相同兩個(gè)對(duì)象不一定相同,equals相同hash一定相同。
3、如果遇到了所謂的‘哈希碰撞’那么就需要使用equals進(jìn)行比較了。
4、基于以上兩點(diǎn),我們知道如果要是重寫(xiě)了equals,那么就必須要重寫(xiě)hash。
都是自己的理解,如果又不對(duì)的歡迎大佬評(píng)論指出
面試官:那你說(shuō)下HashMap的鏈表是頭插法還是尾插法。
再次愣住。。。我為什么要說(shuō)自己正在學(xué)HashMap呢,我是不是智障啊。自己沒(méi)學(xué)深,還來(lái)顯擺。要死了
布丁:不太清楚。
HashMap的鏈表是頭插法還是尾插法
JDK8以前是頭插法,JDK8后是尾插法
面試官:好了,沒(méi)什么了,可以的話通知你。
總結(jié):
1、要多自己寫(xiě)一些東西,不要老是復(fù)制。
2、面試的時(shí)候要腦子清晰,冷靜。不要被面試官帶著走。
3、了解一個(gè)技術(shù)要了解透徹。
好了不說(shuō)了,筆者要去準(zhǔn)備下一場(chǎng)面試了(哪有下一場(chǎng)啊,混蛋)。這些都是本人的真實(shí)經(jīng)歷,希望大家借鑒一下,笑笑就好。
厚顏無(wú)恥的推薦下我其他的博文
廁所和多線程有什么關(guān)系?讀不懂就去上廁所吧。最簡(jiǎn)單的多線程理解,小白都可以看
【RE:布丁JAVA學(xué)習(xí)】這大概是史上最詳細(xì)的JAVA泛型教程,不看后悔。
SpringBoot 使用 redis實(shí)現(xiàn) 生產(chǎn)者/消費(fèi)者模式 消息隊(duì)列
總結(jié)
以上是生活随笔為你收集整理的记录一次失败的面试 大家千万不要学我 请不要笑我的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面试官,求你了别再问我TCP三次握手和四
- 下一篇: 最近面试一些厂的面经整理(阿里,腾讯,字