面試訓練營的同學,前幾天面試小米,都三面了,本來以爲穩了,但沒想到最後還是掛了。
按往年的經驗來看,小米相比與其他互聯網大廠來說,面試的難度比較低,而且薪資也比較低,所以拿到 Offer 的概率還是很大的。
但今年這個情況,這位同學還是碩士身份,最後還是掛在三面了,確實挺可惜的。
那咱們今天來看看,最近小米麪試的真題吧,帶大家看看小米的面試難度。
1.電商系統開發中都遇到了哪些問題?
電商系統遇到的常見問題:
- 高併發 -> 緩存、限流、熔斷。
- 庫存問題:
- 超賣:限流、分佈式鎖、Redis Lua(先判斷庫存 -> 減庫存 + 加訂單)、使用數據庫 update 操作庫存。
- 少賣:及時對賬系統 -> 人工介入處理。
- 弱網支付問題:支付平臺提供回調方法進行支付狀態的刷新、手動觸發主動出查詢得到支付狀態、定時任務進行刷新。
- 刷單:添加圖形驗證碼、IP 黑名單。
- 重複訂單問題:業務實現冪等性判斷、數據庫的唯一約束。
2.怎麼用Redis實現秒殺業務?
Redis Lua(先判斷庫存 -> 減庫存 + 加訂單)。
3.爲什麼Redis單線程執行還這麼快?
原因有以下幾個:
- 基於內存操作。
- Redis 瓶頸是在內存和帶寬,而不是在 CPU 操作。
- Redis 使用多路複用的 IO。
- 避免多線程切換和過度爭搶。
4.Redis如何掃描前綴相同的key?
Redis 查詢前綴相同的 Key 實現方式:
- keys -> keys user*。
- scan -> scan 0 math user* count 100。
5.Redis的keys和scan有什麼區別?
keys 查詢所有的匹配數據,scan 是可以查詢部分數據。
6.如何使用Redis實現分佈式鎖?
分佈式鎖實現:
- 原始方式:setnx key true(死鎖)/set key true ex 30 nx(鎖誤刪)-> 鎖重入問題。
- Redisson 框架實現方式:Redis + Lua 實現。
7.長連接的好處與壞處?
長連接優點:
- 避免了重複創建和銷燬連接。
- 提高傳輸效率。
- 實現實時傳輸。
- 節省了系統資源的浪費。
長連接缺點:
- 佔用了更多的資源。
- 增加了服務器的壓力。
- 對網絡環境的要求是比較高。
8.TCP和HTTP有什麼區別?
TCP VS HTTP:
- 層級不同:HTTP 屬於應用層協議;TCP 屬於傳輸層的協議。
- 數據傳輸方式不同:HTTP 傳輸文本或二進制文件;TCP 傳輸的是數據流。
9.說說HTTPS的執行流程?
HTTPS 執行流程:
- 客戶端(瀏覽器)發送 HTTPS 請求到服務器端。
- 服務器端使用非對稱加密,產生一個公鑰,將公鑰和 CA 證書給到客戶端。
- 客戶端驗證 CA 證書真僞,使用對稱加密生成一個共享祕鑰,使用剛纔的公鑰將共享祕鑰進行加密,將加密信息發送給服務器端。
- 服務器端得到信息之後,使用非對稱加密私鑰進行解密,得到對稱加密的共享祕鑰進行通訊。
10.說說ThreadLocal底層實現?
ThreadLocal 底層是通過 ThreadLocalMap 實現,key -> ThreadLocal;value -> 需要存儲的值。
11.ThreadLocal父線程和子線程的數據傳遞?
new InheritableThreadLocal();
12.爲什麼HashMap是線程不安全的?
HashMap 不是線程安全的原因:
- JDK 1.8 之前 -> 鏈表死循環問題、數據覆蓋的問題。
- JDK 1.8 之後 -> 數據覆蓋的問題。
13.synchronized和volatile有什麼區別?
synchronized VS volatile:
- 保證線程安全不同:synchronized 能保證線程安全;volatile 不能保證線程安全。
- 底層實現不同:
- synchronized 底層實現 -> JVM Monitor(監視器)-> C++ ObjectMonitor -> 操作系統 Mutex Lock。
- volatile 底層實現 -> 可見性(MESI 協議)、順序性(內存屏障)。
14.說說ThreadPoolExecutor的參數?
ThreadPoolExecutor 參數:
- 核心線程數。
- 最大線程數(核心線程數+臨時線程數)。
- 臨時線程在空閒時間可以存活的最大時間。
- 參數三的單位描述。
- 任務隊列。
- 線程池的創建工廠。
- 拒絕策略。
15.說說ThreadPoolExecutor運行機制?
運行機制(當任務來了之後的執行流程):
- 判斷核心線程數是否已滿;如果未滿創建核心線程執行任務;如果滿了執行後續操作。
- 判斷任務隊列是否已滿;如果未滿將任務添加到隊列;如果滿了執行後續流程。
- 判斷最大線程數是否已滿;如果未滿創建臨時線程執行任務;如果滿了執行後續流程。
- 執行拒絕策略(內置4種拒絕策略+自定義的拒絕策略)。
16.RocketMQ和Kafka有什麼區別?
RocketMQ VS Kafka 主要區別:
- 吐吞量區別:Kafka 吞吐量最高,到達單機百萬級的吞吐;RocketMQ 吐吞量是十萬到百萬級。
- 功能上區別:RocketMQ 本身支持死信隊列、延遲隊列、支持消息推和拉取消息;Kafka 本身不支持死信隊列、延遲隊列、消息獲取方式只能是消費者自己來拉取。
17.說說RocketMQ的重試機制?
RocketMQ 重試機制:
- 生產者重試:生成者發送消息的類型有同步發送、異步發送、單次發送(oneway),但模式爲同步發送、異步發送纔有消息重試機制。
- 消費者重試:消費者模式有廣播模式和集羣模式;廣播模式不會進行消息重試,它只會記錄警告信息;集羣模式會進行消息重試(通過延遲任務來實現消息重試,默認情況下如果重試超過 16 次就會將此消息存到死信隊列)。
18.說說MySQL的事務?
事務特性:
- 一致性
- 持久化
- 原子性
- 隔離性
- 讀未提交:存在髒讀、不可重複讀和幻讀問題。
- 讀已提交:不存在髒讀問題,但依然存在不可重複讀和幻讀的問題。
- 可重複讀(MySQL 默認的隔離級別):不存在髒讀問題、不可重複讀,依舊存在幻讀問題。
- 串行化:不存在髒讀問題、不可重複讀、幻讀問題,但執行效率不高。
19.說說MySQL的優化?explain有什麼用?
MySQL 優化措施:
- 使用合適的查詢語句,不要所有的都使用 select *。
- 使用合適的數據類型。
- 正確使用索引:
- 該創建索引的創建索引。
- 查詢時一定要正確的觸發索引。
- 數據量大分庫分表。
- 使用分佈式數據庫,例如 TiDB。
20.SpringCloud有哪些組件?
Spring Cloud 包含的組件:
- 註冊中心:Spring Cloud Alibaba Nacos、Spring Cloud Netflix Euruka。
- 配置中心:Spring Cloud Alibaba Nacos。
- 網關:Spring Cloud Gateway。
- 負載均衡器:Spring Cloud LoadBalancer。
- Restful 請求:Spring Cloud Openfeign。
- 限流、熔斷:Spring Cloud Alibaba Sentinel。
- 分佈式鎖事務:Spring Cloud Alibaba Seata。
- 分佈式鏈路追蹤系統:Skywalking。
21.Nacos和Euruka的區別?
Nacos VS Euruka 主要區別:
- 功能上不同:Nacos 既提供註冊中心又提供配置中心;Euruka 只有註冊中心。
- 通訊方式不同:Nacos 通訊方式是依靠 Netty 實現的長連接;Euruka 短連接+定時任務。
- CAP 理論支持不同:Nacos 默認是 AP 模式,但它支持手動設置 CP 模式;Euruka 只支持 AP 模式。
- 健康檢查機制不同:Nacos 健康檢查機制(默認臨時實例),每 5s 上報一次健康狀況;15s 未上報任務不健康;30s 會剔除此實例;Euruka 健康檢查機制,每 30s 上報一次健康狀況;60s 未收到認爲不健康;90s 未收到剔除此實例。
22.Nacos怎麼保證數據一致性的?
Nacos 通過 Raft 實現 Leader 節點的選舉,由 Leader 節點將數據同步給所有的普通節點,以保證數據的一致性的。
23.反向代理是什麼?
反向代理定義:用於客戶端和服務器端進行通訊,代理服務器端的一種代理,可以隱藏真實的服務器地址。反向代理的經典實現就是 Nginx。
優點:
- 反向代理服務器可以有緩存,增加查詢的效率。
- 可以實現負載均衡,從而提升服務器的 QPS,實現服務器的水平擴展。
- 反向代理通常自帶健康檢查機制,可以幫你正確的訪問健康的服務實例。
- 隱藏真實服務器的地址,一定程度的保證了服務器的安全性。
24.Spring事務是怎麼實現的?
Spring 事務實現方式:
- 編程式事務
- 聲明式事務:動態代理實現 -> 1.攔截目標方法;2.在方法執行前開啓事務;3.如果方法執行期間出現異常回滾事務;4.在方法執行完之後沒有異常,提交事務。
25.SpringBoot自動裝配的實現流程?
Spring Boot 實現流程:
- 啓動 Spring Boot 項目時,執行 @SpringBootApplication 註解類。
- 去框架資源文件 spring.factories 讀取需要自動裝配的類。
- 查找自動裝配類的 @Configuration + @Condition 條件註解,如果滿足自動裝配的條件,將此類通過反射機制創建,並放到 IoC 容器,反之則不創建。
最後
想要此面試題視頻解析的同學,加我微信:GG_Stone【備註:小米】,免費獲取小米麪試解析視頻。
本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。