面試知識點準備
面試知識點準備
容器
常見集合容器底層實現原理
- interface Collection
- interface Set
- interface SortedSet
- class TreeSet 基於紅黑樹,有序,查詢效率低
- class HashSet 基於雜湊表,無序,查詢效率高
- class LinkedHashSet 基於雙向連結串列,有序,查詢效率高
- interface SortedSet
- interface List
- class ArrayList 基於動態陣列,支援隨機訪問
- class Vector 與ArrayList類似,但是執行緒安全
- class LinkedList 基於雙向連結串列,順序訪問,可快速增刪元素.可用作棧,佇列和雙向佇列
- interface Queue
- class LinkedList 可用作雙向佇列
- class PriorityQueue 基於堆,可以實現優先佇列
- interface Set
- interface Map
- interface SortedMap
- class TreeMap 基於紅黑樹
- class HashMap 基於雜湊表,JDK8後變為陣列+連結串列+紅黑樹
- class HashTable 和HashMap類似,但是執行緒安全
- class LinkedHashMap 基於雙向連結串列
- interface SortedMap
HashMap與HashTable
- HashMap是非執行緒安全的,HashTable是執行緒安全的.
- HashMap的初始容量為1>>4即16,擴容為2倍,比較耗時.HashTable初始為11,擴容為2倍+1.(超過閾值=容量 * 負載因子時擴容)
- HashMap中存放Entry物件
- HashMap可以存放null作為key,HashTable不可以.
- HashMap存貯結構為陣列+連結串列,在JDK8中變為陣列+連結串列+紅黑樹(連結串列中長度超過8或容量超過64時)
ConcurrentHashMap什麼時候用
因為HashTable在多執行緒下的效率低下(容器全鎖),因此在多執行緒下推薦使用ConcurrentHashMap
併發
synchronized與Lock
- 都是可重入鎖,預設都是非公平鎖,Lock可通過建構函式建立公平鎖
- ReentrantLock鎖的粒度和靈活度優於synchronized
- synchronized是沒有超時不可中斷的,ReentrantLock有超時可中斷
- ReentrantLock鎖可以繫結多個條件,可用Condition類實現分組喚醒
- 在資源競爭不激烈的情況下,效能推薦使用synchronized
- 在資源競爭激烈的情況下,效能會下降幾十倍,推薦使用ReentrantLock
volatile
當一個變數定義為 volatile 之後,將具備兩種特性
- 保證此變數的變化能夠被其他執行緒獲取
- 禁止指令重排序優化
執行緒池有哪幾種
執行緒池都使用Executors來建立,可以使用execute()和submit()來執行執行緒任務,前者只接收Runnable作為引數,後者還可接收Callable作為引數,並通過Future物件來獲取返回值及儲存的異常資訊,使用get()獲取返回值會阻塞主執行緒,直到該執行緒執行結束得到返回值,因此常用Callable+FutureTask來獲取返回值
- newCachedThreadPool - 可快取執行緒池,理論上執行緒數無上限
- newFixedThreadPool - 可重用固定個數的執行緒池
- newScheduledThreadPool - 可重用固定個數的執行緒池,執行定時及週期性任務
- newSingleThreadExecutor - 單執行緒核心的執行緒池
- newSingleThreadScheduledExecutor - 單執行緒核心的執行緒池,執行定時及週期性任務
- newWorkStealingPool - 具有搶佔式操作的執行緒池
阿里巴巴強制執行緒池不允許使用Executors去建立,而是通過ThreadPoolExecutor建構函式的方式
執行緒池的引數
- corePoolSize 執行緒池核心執行緒大小
- maximumPoolSize 執行緒池最大執行緒數量
- keepAliveTime 空閒執行緒存活時間
- unit 空間執行緒存活時間單位
- workQueue 工作佇列
- threadFactory 執行緒工廠
- handler 拒絕策略
前五個是必須的
MySQL
SQL執行速度慢
- 在伺服器上確認伺服器狀態資訊,是否磁碟滿或資源佔用高
- 查詢語句寫的不合理
- 建立的索引失效
- 關聯查詢太多join
- 伺服器調優及各個引數設定
儲存引擎InnoDB、MyISAM
- InnoDB支援事務,支援四種隔離級別.MyISAM不支援事務.
- InnoDB支援行級鎖及外來鍵約束,可支援寫併發.MyISAM支援表級鎖.
- 不儲存總行數.MyISAM有一個變數儲存總行數.
- Innodb不支援全文索引.MyISAM支援全文索引.
- Innodb必須有唯一索引如主鍵,如果沒有會自己找或生產一個.MyISAM可以沒有
- InnoDB支援外來鍵,而MyISAM不支援
InnoDB支援事務,行級鎖,外來鍵必須有唯一索引,不支援全文索引,不存貯總行數
MyISAM不支援事務和外來鍵,只支援表級鎖,有一個變數儲存總行數,可以沒有主鍵,支援全文索引
事務的四大特性
- 原子性A
- 一致性C
- 隔離性I
- 永續性D
索引
索引是MySQL高速獲取資料的資料結構,可以提高查詢效率,簡單的說是排好序的快速查詢資料結構
索引型別: 單值索引 / 唯一索引 / 複合索引 / 全文索引
語法:
CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length));
ALTER TABLE tableName ADD INDEX indexName (columnName);
索引失效的情況
- 有or必全有索引
- 複合索引未用左列欄位
- like以%開頭
- 需要型別轉換
- where中索引列有運算
- where中索引列使用了函式
- 如果mysql覺得全表掃描更快時(資料少)
隔離級別
Isolation Level | 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 預設 | 解釋 |
---|---|---|---|---|---|---|
READ-UNCOMMITTED | 讀取未提交 | 1 | 1 | 1 | 最低的隔離級別,允許讀取尚未提交的資料變更 | |
READ-COMMITTED | 讀取已提交 | 0 | 1 | 1 | 允許讀取併發事務已經提交的資料 | |
REPEATABLE-READ | 可重複讀 | 0 | 0 | 1 | 預設 | 對同一欄位的多次讀取結果都是一致的 |
SERIALIZABLE | 可序列化 | 0 | 0 | 0 | 最高的隔離級別,完全服從ACID的隔離級別 |
資料庫表優化
- 限定資料範圍
- 書寫分離 主庫負責寫,從庫負責讀
- 垂直拆分 拆分成多張表,欄位不同
- 水平拆分 最好分庫
NoSQL
Redis相比memcache的優勢在哪裡
兩者都是基於記憶體的資料庫,就是NoSQL,效能都很高,都常作快取使用,都有國企策略
- mem只支援KV形式的資料,即hash型別;Redis除此之外,還支援string/list/set/sorted set資料結構
- Redis支援資料的持久化,因此具有災難恢復機制,mem只能儲存在記憶體中
- mem是多執行緒的,早期的Redis是單執行緒的,更容易開發維護,後期加入了多執行緒的支援
Redis如何判斷資料是否過期
Redis有一個過期字典來儲存資料過期的時間.
Redis的持久化機制有哪些
- RDB快照(snapshotting) 預設
- AOF只追加檔案(append-only file) 實時性更好,主流
Redis可能回出現的問題
快取穿透: 快取和資料庫中都沒有的資料,而使用者不斷髮起請求,如發起為id為“-1”的資料或id為特別大不存在的資料。這時的使用者很可能是攻擊者,攻擊會導致資料庫壓力過大。
- 介面層增加校驗,如使用者鑑權校驗,id做基礎校驗,id<=0的直接攔截
- 從快取取不到的資料,在資料庫中也沒有取到,這時也可以將key-value對寫為key-null,快取有效時間可以設定短點,如30秒(設定太長會導致正常情況也沒法使用)。這樣可以防止攻擊使用者反覆用同一個id暴力攻擊
快取擊穿: 快取中沒有但資料庫中有的資料(一般是快取時間到期),這時由於併發使用者特別多,同時讀快取沒讀到資料,又同時去資料庫去取資料,引起資料庫壓力瞬間增大,造成過大壓力。
- 設定熱點資料永遠不過期
- 加互斥鎖
快取雪崩: 快取中資料大批量到過期時間,而查詢資料量巨大,引起資料庫壓力過大甚至down機。
- 快取資料的過期時間設定隨機,防止同一時間大量資料過期現象發生。
- 如果快取資料庫是分散式部署,將熱點資料均勻分佈在不同搞得快取資料庫中。
- 設定熱點資料永遠不過期。
和快取擊穿不同的是,快取擊穿指併發查同一條資料,快取雪崩是不同資料都過期了,很多資料都查不到從而查資料庫。
框架
Spring
Spring Boot
Spring Cloud
- 服務註冊中心 Eureka -> Nacos
- 服務呼叫1 Ribbon -> LoadBalancer
- 服務呼叫2 Feign -> OpenFeign
- 服務降級 Hystrix -> Alibaba Sentinel
- 服務閘道器 Zuul -> Gateway
- 服務配置 Config -> Nacos
- 服務匯流排 Bus -> Nacos
- 服務註冊中心
- Eureka 自帶,已停更
- Zookeeper 老專案常用
- Consul 不建議
- Nacos 完美替換Eureka
- 服務呼叫1
- Ribbon 慢慢被淘汰
- LoadBalancer 正在發展
- 服務呼叫2
- Feign 已停更
- OpenFeign 替換方案
- 服務降級
- Hystrix 已停更,但仍大量使用
- resilience4j 國外使用較多
- Alibaba Sentinel 推薦使用
- 服務閘道器
- Zuul 已停更
- Gateway 目前的主流
- 服務配置
- Config 已不推薦
- Nacos 推薦
- 服務匯流排
- Bus 已不推薦
- Nacos 推薦
中介軟體
訊息中介軟體MQ
核心目標: 解耦、非同步、削峰
- ActiveMQ 時間早,社群不活躍
- RabbitMQ erlang語言
- RocketMQ 阿里出品,吞吐量大
- Kafka scala語言,大資料首選,吞吐量大
生產者 - 消費者(主題,訂閱)
演算法與資料結構
演算法
- 遞推法
- 遞迴法
- 窮舉法
- 貪心演算法
- 分治法
- 動態規劃法
- 迭代法
- 分支界限法
資料結構
- 陣列(Array)
- 棧(Stack)
- push() 新增元素
- pop() 彈出棧頂元素
- peek() 獲取棧頂元素
- empty() 判斷棧是否為空
- 佇列(Queue)
- add() 新增元素,可能只丟擲異常新增失敗
- offer() 新增元素,推薦使用
- remove() 移除頭部元素並返回,空佇列拋異常
- element() 返回頭部元素不移除,空佇列拋異常
- poll() 移除頭部元素並返回,空佇列返回null
- peek() 返回頭部元素不移除,空佇列返回null
- 連結串列(Linked List)
- 樹(Tree)
- 圖(Graph)
- 堆(Heap)
- 散列表(Hash)