寫文章前感謝帥丙,對我技術棧的深度有很大的幫助(尤其是redis)
文章中的回答不是標準答案,是本人當時的回答
一面
面試官:簡單介紹下你做過的項目。
小白:略(主要是SpringCloud,redis,消息隊列)
面試官:ok,那我先問點基礎的東西,瞭解設計模式嗎?
小白:用到的有單例模式,工廠模式,觀察者模式。
面試官:單例模式你能說下有哪幾種實現方式嗎?
小白:懶漢式,餓漢式,雙重校驗。
面試官:HashMap的數據結構瞭解嗎?
小白:jdk1.7是數組+鏈表,jdk1.8是數組+鏈表+紅黑樹。鏈表擴充到size=8就將鏈表轉化爲紅黑樹,頭插入改爲尾插入。
面試官:假設我這批數據剛好恰巧都插入到了一個鏈表裏,怎麼辦?
小白:那就擴容吧。
面試官:除了擴容呢?
小白:可以重寫hashcode方法嗎?
面試官:可以,這就是我想要的答案。那你說說在判斷對象相等的時候爲什麼要重寫equals和hashcode方法?
小白:比如這兩個對象相等,只重寫equals方法而不重寫hashcode方法在放入map的時候就會發現這是兩個key,與兩個對象相等相違背,造成困擾
面試官:hashMap支持併發嗎?
小白:不支持,可以用hashTable和concurrentHashMap來替代。
面試官:那你說說他倆的區別
小白:hashTable是在hashMap的基礎上,在方法上加上synchronized鎖,concurrentHashMap在jdk1.7時採用segements做分段鎖,jdk1.8時採用synchronized+CAS鎖來實現
面試官:CAS鎖怎麼實現?
小白:用volatile標記變量,保證可見性,確保每次拿到的數據是最新的數據,在更新的時候再做比較,如果之前沒有發生過變更,再update。
面試官:這是樂觀鎖還是悲觀鎖?
小白:樂觀鎖。
面試官:項目中的redis分佈式鎖怎麼實現?
小白:根據請求id和自定義key去生成,把他作爲一個key放入redis中,完成操作以後再刪掉釋放鎖。
面試官:那我要是沒完成操作怎麼辦?不是就形成死鎖了?
小白:key會設置過期時間。
面試官:刪掉key是直接delelte key嗎?
小白:不是,爲了確保原子性是將luna腳本放置到redis裏執行。
面試官:redis和memoryCache有什麼區別?
小白:redis支持持久化,memoryCache不支持,如果掛掉了裏面的數據就全沒了。
面試官:還有呢?
小白:我對memoryCache不太瞭解,沒用過。
面試官:redis是單線程的還是多線程的?
小白:應該是單線程的吧
面試官:是的,自信點,不然怎麼實現分佈式鎖呢。你們設備指令下發怎麼保證安全性呢?如果被截取了不是可以輕鬆破解嗎?
小白:發送的數據是加密的。
面試官:你都知道哪些加密方式呢?
小白:比如MD5,單向加密,像數據庫存放密碼不可能存放明文,所以一般存放md5加密後的數據。還有RSA加密,他是用公鑰加密,私鑰解密,所以他是可以獲取到明文的。
面試官:線程池有了解過嗎?怎麼實現。
小白:可以用Executors獲取線程池,也可以new threadPoolExecutor。
面試官:他倆有啥區別嗎?
小白:前者在阿里開發規範裏被否定了,因爲會無限擴容,所以更推薦後者。
面試官:那你知道threadPoolExecutor有哪些參數嗎?
小白:存活線程數,最大線程數,然後兩個是失效時間,一個隊列,還有線程工廠和錯誤策略。
面試官:你有什麼想問的嗎?
小白:有技術分享會嗎
面試官:這個是有的,每週都會定期舉辦分享會,有很多大牛會介紹自己的經驗。
二面
面試官:介紹下你的項目經歷
小白:略。
面試官:之前有碰到過高併發的場景嗎?
小白:有的,設備指令同時批量下發,打崩過數據庫。
面試官:爲什麼會打崩
小白:因爲同一時間大面積的reids key失效,所有的請求都打到了數據庫。
面試官:怎麼解決的呢?
小白:分批去處理數據,岔開redis key的失效時間。
面試官:這麼大的問題之前沒有發現嗎?
小白:這個是發生在開發環境的,生產環境不會出現這個問題。
面試官:你們redis是怎麼實現的?
小白:用AOP攔截大屏的接口,如果redis裏有數據就返回,如果沒有再訪問數據庫。
面試官:我看你項目經歷有調優經驗,那你說說如果一個接口返回比較慢了怎麼入手調優?
小白:先打斷點,看看主要耗時在哪裏,如果是後臺處理的慢,則要具體分析,改代碼,如果sql執行慢就要分析sql,重寫sql或者建立索引。
面試官:sql慢你怎麼分析呢?
小白:可以打開慢查詢日誌,確認到執行慢的sql然後explain,看他有沒有走索引,還是全表掃描了。
面試官:explain主要看哪幾個參數?
小白:有個rows代表掃描走過的行數,其他好像還有什麼all,如果出現了all就代表全表掃描了。
面試官:索引失效瞭解嗎?談談什麼場景下會索引失效
小白:比如用in ,not in,或者在索引字段上做計算函數都有可能發生索引失效。
面試官:聯合索引什麼情況下會失效呢?
小白:如果建立的時候是A,B那麼查詢的時候用B,A就會失效。
(後面問了很多場景,比如CBA,BCA)
面試官:有做過壓力測試嗎?
小白:有的
面試官:主要看哪些指標呢?
小白:QPS,還有錯誤率。
面試官:如果壓測效果不好怎麼辦呢?
小白:前端限流,後端限流,jvm設置併發線程數。
面試官:我看你用的項目是springcloud,熔斷降級怎麼實現?
小白:引入Hystrix,然後他可以去攔截錯誤的接口,返回定義好的錯誤返回。
面試官:你瞭解哪些熔斷的參數呢?
小白:有個分鐘數,錯誤次數,熔斷時間吧。
面試官:那你怎麼提高你接口的吞吐量呢。
小白:利用eureka做負載均衡,比如設備模塊這種併發量高的可以多啓動幾個微服務。
面試官:負載均衡的分配策略有哪些呢?
小白:輪詢,隨機,併發數最少,那幾個英文忘掉了。
面試官:當初爲什麼選擇SpringCloud呢?dubbo也可以啊
小白:確實可以,但是當時比較尷尬,dubbo還沒有被阿里重啓,而且dubbo用的是RPC,springCloud用的是http,大家又對spirng更熟悉,所以選用了SpringCloud
面試官:談談你對RPC呢?
小白:是遠程進程調用。具體我也不太清楚
面試官:Java怎麼實現RPC呢?
小白:不會
面試官:開發工具用的什麼?
小白:IDEA
三面
面試官:介紹下項目經驗
小白:略
面試官:你們sql最大的表有多少數據?
小白:幾十萬。
面試官:我看設備一直上報數據,表裏無限增長,爲什麼數據量那麼少。
小白:做了冷熱數據分離,數據庫裏只保留三天的數據,之前的數據寫成csv按照日期作爲文件名存儲起來
面試官:那我想要一個月前的數據怎麼辦?
小白:我們提供了接口獲取數據,csv裏保存的是json數據,所以依舊是可以查詢的。
面試官:那相對於sql查詢肯定慢很多吧。
小白:那是肯定的,所以儘量支持一些數據段提取,不要有什麼複雜的操作,類似於tsdb。
面試官:你覺得你有什麼缺點呢?(送命題)
小白:比較犟,跟同事會對方案要吵出一個最優解來。
面試官:如果就事論事的話我還是支持的,但是要注意說話的方式,儘量溫和一點。那你覺得你的優點呢?
小白:接受新事物能力比較強吧,近期公司讓我開發一些前端內容,雖然之前沒接觸過也可以照葫蘆畫瓢。
面試官:那你平時學習一些技術都是靠哪些渠道呢?
小白:csdn,微信公衆號比如像阿里技術,架構之路之類的,github會看些項目相關或者類似的項目。
面試官:你不看一些專業書嗎?
小白:相比專業書我更喜歡看史書。因爲現在技術更新換代太快了,可能我看完一本書實現原理又變了,比如hashmap jdk1.7和1.8的區別。
面試官:看書其實可以訓練你的編程思維,單純看一些文章的話很多情況下會忘記,最好看完之後code一下,才能鞏固
小白:瞭解
面試官:你對加班有什麼看法呢?
小白:我覺得互聯網人加班是很正常的,自己的事情幹好了再下班。但是我比較反感明明沒事還裝作有事在那加班,或者自己能力不行然後裝可憐。
面試官:之前有帶過人嗎?談談項目從立項到完結的流程
小白:略(各公司不一樣)
面試官:你有什麼想問的嗎?
小白:既然提到加班,我想問下公司績效和加班時間掛鉤嗎?
面試官:肯定不掛鉤的。
小白:那我這邊沒問題了
面試官:等hr聯繫
總結:一面面的比較廣,主要是對項目中用到的技術做個大致瞭解,判斷下你是不是真的會用,摸一摸你的基礎。二面的話就會刨根問底,對一個技術棧深挖你的瞭解程度以及一些架構設計。三面就比較水了,技術問題不多,判斷下你是否符合公司文化。
後續:拿到數據中臺部門的offer。