面試總結
一、spring相關
1. Spring Security角色管理實現
在智慧種植蟲害識別系統中,我實現了農戶端和企業端的雙角色權限控制,這一部分是這樣實現的:
MySQL 表時設計區分農戶和企業的角色表與權限表。登錄時,JWT 令牌包含用戶 ID、角色表和權限表字段。通過配置 Spring Security 的 Security Config 攔截請求,獲取角色權限字段,判斷能否訪問當前接口
2. Spring MVC工作流程
- 用戶發送HTTP請求至前端控制器
DispatcherServlet
。 DispatcherServlet
通過HandlerMapping
(處理器映射器)查找對應的Controller
(處理器)。Controller
執行業務邏輯后,返回ModelAndView
(包含數據模型和視圖信息)。DispatcherServlet
通過視圖解析器對ModelAndView
進行渲染,生成最終視圖并響應給客戶端。
3. AOP原理及代理類型
AOP(面向切面編程)是Spring的核心特性之一,用于解決代碼冗余問題,實現日志、事務等功能的復用:
- 原理:通過代理模式,在不修改目標代碼的情況下,為目標方法添加額外功能(如前置通知、后置通知、異常通知等)。
- 代理類型:
- JDK動態代理:基于接口生成代理類,要求目標類必須實現接口。
- CGLIB動態代理:基于目標類生成代理子類,無需目標類實現接口,通過繼承實現代理。
- 應用場景:日志記錄、事務管理、權限校驗等。
二、消息隊列(RabbitMQ)
1. 點餐系統中的異步處理
在點餐系統中,我用RabbitMQ實現了下單流程的異步化,提升系統吞吐量:
- 下單流程:
- 后端接收下單請求,先校驗菜品在售狀態和用戶余額。
- 校驗通過后,生成訂單號,將訂單狀態設為“待支付”并存入MySQL,同時向用戶發送“下單成功”消息。
- 生產者向RabbitMQ發送訂單信息,消費者監聽隊列,負責執行扣減菜品庫存、記錄下單日志等非核心流程。
- 用戶支付后,系統更新訂單狀態,觸發后續配送等流程。
2. 訂單超時未支付處理方案
(下單超過一定時間之后提醒用戶)
針對訂單超時未支付場景,使用RabbitMQ延遲隊列實現自動處理:
- 實現邏輯:
- 下單成功后,系統向RabbitMQ發送延遲消息(設置消息過期時間,如30分鐘)。
- 消息過期后,消費者監聽并接收消息,根據訂單號查詢數據庫中訂單狀態。
- 若訂單仍為“未支付”狀態,執行以下操作:向用戶發送“訂單超時”短信、回滾菜品庫存、更新訂單狀態為“已取消”。
3. 延遲隊列實現方式
延遲隊列可通過RabbitMQ的“死信隊列+消息存活時間(TTL)”實現:
- 消息設置過期時間(TTL),并指定死信交換機和死信隊列。
- 消息過期后,自動從原隊列轉發到死信隊列。
- 消費者監聽死信隊列,處理超時任務(如訂單超時、優惠券過期等)。
三、數據結構與集合
HashMap核心機制
HashMap是Java中常用的鍵值對集合,其底層實現與擴容機制如下:
- 默認初始化容量:16(必須是2的冪次方,便于哈希計算)。
- 負載因子:0.75,當元素數量達到“容量×負載因子”時觸發擴容。
- 擴容機制:擴容至原容量的2倍,重新計算所有元素的哈希值并遷移至新數組。
- 結構轉換:
- 當鏈表長度>8且數組長度>64時,鏈表轉為紅黑樹(提升查詢效率)。
- 當紅黑樹節點數<6時,轉回鏈表(減少紅黑樹維護成本)。
四、數據庫操作
SQL分組統計查詢思路
以“按產品和月份統計銷售額并取前三”為例,查詢思路如下:
- 使用
MONTH()
或DATE_FORMAT()
函數從訂單時間中提取月份。 - 按“產品ID+月份”分組(
GROUP BY
)。 - 用
SUM()
函數計算每組的銷售額(SUM(金額字段)
)。 - 按銷售額降序排序(
ORDER BY 銷售額 DESC
)。 - 取前三條結果(
LIMIT 3
)。
示例SQL:
SELECT product_id, DATE_FORMAT(order_time, '%Y-%m') AS month, SUM(amount) AS sales
FROM orders
GROUP BY product_id, month
ORDER BY sales DESC
LIMIT 3;
補充:也可以用窗口函數實現
WITH MonthlySales AS (SELECT product_id,DATE_TRUNC('month', order_time) AS month,SUM(order_amount) AS total_salesFROM ordersGROUP BY product_id, DATE_TRUNC('month', order_time)
),
RankedSales AS (SELECT product_id,month,total_sales,ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY total_sales DESC) AS sales_rankFROM MonthlySales
)
SELECT product_id,month,total_sales
FROM RankedSales
WHERE sales_rank <= 3
ORDER BY product_id, sales_rank; -- 可選:按產品、排名排序,結果更清晰
分組聚合 :先按產品 + 月份匯總銷售額,得到基礎統計;
窗口函數 :通過 ROW_NUMBER() 給每個產品的月份銷售額 “內部排序”,生成排名;
篩選結果 :保留排名前 3 的記錄,實現 “每個產品最高三個月份” 的需求。
SQL窗口函數:數據分析的"透視窗"
在SQL數據分析中,窗口函數是繞不開的關鍵工具。它像給數據開了"透視窗",能在保留明細的同時做分組計算,高效解決排名、累計、對比類需求。整理了核心知識點,速記備用👇
窗口函數:對數據集的"特定子集(窗口)"計算,保留原始行結構,不合并數據。
語法模板:
函數名(參數) OVER ([PARTITION BY 列名] -- 分組窗口(可選)[ORDER BY 列名] -- 窗口內排序(可選)[ROWS/RANGE 范圍] -- 行范圍(進階,可選)
)
常用:
1. 排名函數
ROW_NUMBER()
:同分組內生成唯一序號(值相同也跳號)RANK()
:值相同則排名相同,后續排名跳號(如 1,1,3…)DENSE_RANK()
:值相同則排名相同,后續排名不跳號(如 1,1,2…)
2. 聚合函數
SUM()
/AVG()
/MAX()
/MIN()
結合窗口,實現累計計算或移動統計(如累計銷售額、近3月平均值)。
3. 偏移函數
LAG(列名, n)
:取當前行前n行數據(用于環比對比,如本月 vs 上月)LEAD(列名, n)
:取當前行后n行數據(反向環比)
典型場景
- TopN 需求:按產品分組,取銷售額最高的3個月份
- 趨勢分析:計算用戶消費的累計金額、月均消費
- 波動對比:用
LAG/LEAD
分析銷售額環比變化
與 GROUP BY 區別
特性 | GROUP BY 聚合 | 窗口函數 |
---|---|---|
結果行數 | 每組1行(合并數據) | 保留原始行數(明細+計算) |
數據視角 | 僅看分組匯總 | 能透視分組內所有行數據 |
五、開發工具與流程
1. Git常用命令(提交與推送代碼)
git pull
:拉取遠程倉庫最新代碼,避免沖突。git add <文件名>
或git add .
:將文件添加到暫存區。git commit -m "提交說明"
:將暫存區文件提交到本地倉庫。git push
:將本地倉庫代碼推送到遠程倉庫。
2. Maven模塊依賴處理
當多模塊項目中模塊A被模塊B依賴,修改A后需處理依賴更新:
- 模塊A修改后,執行
mvn install
:將A打包并安裝到本地倉庫。 - 模塊B執行
mvn clean
(清理舊文件)→mvn compile
(編譯)→mvn package
(打包),確保依賴更新。 - 分布式環境中,可通過
mvn deploy
將A推送到私服,供其他模塊拉取。
六、Redis數據結構
Redis是高性能的鍵值對數據庫,支持多種數據結構,適用于不同場景:
- String(字符串):存儲文本、數字等,如用戶token、計數器。
- List(列表):有序可重復,支持頭插(
lpush
)、尾插(rpush
),可用于消息隊列、任務隊列。 - Hash(哈希):鍵值對集合,適用于存儲對象(如用戶信息:
user:{id} -> {name: "xxx", age: 20}
)。 - Set(集合):無序不可重復,支持交集、并集運算,適用于標簽、好友關系。
- Sorted Set(有序集合):帶分數的Set,按分數排序,適用于排行榜、延時任務。