這一段時間因為已經的原因,老公司一直髮展的不太好,所以想另尋出路,所以就想再找一份工作,然而就在前幾天找到了一個面試機會,並且通過了初試,然而在複試的時候出現可致命的問題。九成栽了。所以在這裡記錄一下。
首先面試是採用的視頻面試,但是面試官卻遲到了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、瞭解一個技術要了解透徹。
好了不說了,筆者要去準備下一場面試了(哪有下一場啊,混蛋)。這些都是本人的真實經歷,希望大家借鑑一下,笑笑就好。
閱讀更多 程序猿聚集地 的文章