
資料庫原理
- MYISAM與innodb搜索引擎原理MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址,其采用索引檔案與資料檔案,索引檔案只存放索引,葉子節點存放資料的物理地址,資料檔案存放資料,其索引方式是非聚集的,
- InnoDB也使用B+Tree作為索引結構,但是它的主索引與資料都放在一個檔案中,這種索引叫做聚集索引,因為InnoDB的資料檔案本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含欄位作為主鍵,這個欄位長度為6個位元組,型別為長整形,
- 區別一:InnoDB的主索引與資料都放在一個檔案中,而MYISAM是分開存放的,
- 區別二:InnoDB的輔助索引data域存盤相應記錄主鍵的值而不是地址,
- 區別三:InnoDB的主鍵索引是聚集索引,而MYISAM不是聚集索引,
3.索引,聚簇索引和二級索引的加鎖區別
- 聚集(clustered)索引,也叫聚簇索引,資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,一個表中只能擁有一個聚集索引,
- 非聚集(unclustered)索引,該索引中索引的邏輯順序與磁盤上行的物理存盤順序不同,一個表中可以擁有多個非聚集索引,會發生二次查詢,
- 稠密索引:稠密索引檔案中的索引塊保持鍵的順序與檔案中的排序順序一致,
- 稀疏索引:稀疏索引沒有為每個資料都創建一個索引,它比稠密索引節省了更多的存盤空間,但查找給定值的記錄需更多的時間,只有當資料檔案是按照某個查找鍵排序時,在該查找鍵上建立的稀疏索引才能被使用,而稠密索引則可以應用在任何的查找鍵,
- 聯合索引:將一張表中多個列組成聯合索引(col1,col2,col3),其生效方式滿足最左前綴原則,
- 覆寫索引:對于二級索引而言,在innodb中一般是需要先根據二級索引查詢到主鍵,然后在根據一級索引查詢到資料,但是如果select的列都在索引中,就避免進行一級查詢,
4.主鍵選擇
- 在使用InnoDB存盤引擎時,如果沒有特別的需要,請永遠使用一個與業務無關的自增欄位作為主鍵,
- where 1 = 1:能夠方便我們拼sql,但是使用了之后就無法使用索引優化策略,因此會進行全表掃描,影響效率,
5.分表分庫
- 水平拆分:依據表中的資料的邏輯關系,將同一個表中的資料依照某種條件拆分到多臺資料庫(主機)上面,按照1個或多個欄位以及相應的規則,將一張表重的資料分到多張表中去,比如按照id%5的規則,將一張大表拆分成5張小表,適合具有超大表的系統,
- 垂直拆分:依照不同的表(或者Schema)來切分到不同的資料庫(主機)之上,一般按照模塊來分庫,適合各業務之間耦合度非常低的系統,
6.隔離級別
- read uncommit:讀不加鎖,寫加共享鎖,會產生臟讀、幻讀,
- read commit:讀加共享鎖,寫加排它鎖,但不加間隙鎖,間隙鎖的主要作用是防止不可重復讀,但會加大鎖的范圍,
- repeatable read(innodb默認):讀加共享鎖,寫加間隙排它鎖,注意,Innodb對這個級別進行了特殊處理,使得這個級別能夠避免幻讀,但不是所有引擎都能夠防止幻讀!(網易面試官問)
- serialization:會給整張表加鎖,強一致,但是效率低,
7.innodb中的鎖
- MVCC(multi-Version Concurrency Control):讀不加鎖,讀寫不沖突,適合寫少讀多的場景,讀操作分為:快照讀(回傳記錄的可見版本,不加鎖)、當前讀(記錄的最新版本,加鎖,保證其它記錄不修改),
- LBCC(Lock-Based Concurrency Control):
- join原理Simple Nested-Loop Join:效率最低,按照join的次序,在join的屬性上一個個掃描,并合并結果,
- Index Nested-Loop Join:效率最高,join的屬性上面有索引,根據索引來匹配,
- Block Nested-Loop Join:用于沒有索引的列,它會采用join buffer,將外表的值快取到join buffer中,然后與內表進行批量比較,這樣可以降低對外表的訪問頻率
8.galera
- 多主架構:真正的多點讀寫的集群,在任何時候讀寫資料,都是最新的,
- 同步復制,各節點間無延遲且節點宕機不會導致資料丟失,
- 緊密耦合,所有節點均保持相同狀態,節點間無不同資料,
- 無需主從切換操作,
- 無需進行讀寫分離,
- 并發復制:從節點在APPLY資料時,支持并行執行,有更好的性能表現,
- 故障切換:在出現資料庫故障時,因為支持多點寫入,切的非常容易,
- 熱插拔:在服務期間,如果資料庫掛了,只要監控程式發現的夠快,不可服務時間就會非常少,在節點故障期間,節點本身對集群的影響非常小,
- 自動節點克隆:在新增節點,或者停機維護時,增量資料或者基礎資料不需要人工手動備份提供,Galera Cluster會自動拉取在線節點資料,最終集群會變為一致,
- 對應用透明:集群的維護,對應用程式是透明的,幾乎感覺不到,
9.LSM Tree,主要應用于nessDB、leveldb、hbase
- 核心思想的核心就是放棄部分讀能力,換取寫入的最大化能力,它假設假定記憶體足夠大,因此不需要每次有資料更新就必須將資料寫入到磁盤中,而可以先將最新的資料駐留在記憶體中,等到積累到最后多之后,再使用歸并排序的方式將記憶體內的資料合并追加到磁盤隊尾,(使用歸并排序是要因為帶排序樹都是有序樹)
- LSM具有批量特性,存盤延遲,B樹在insert的時候可能會造成分裂,可能會造成隨機讀寫,而LSM將多次單頁隨機寫,變成一次多頁隨機寫,復用了磁盤尋道時間,極大提升效率,
- LSM Tree放棄磁盤讀性能來換取寫的順序性,
- 一般會使用Bloom Filter來優化LSM,當將記憶體中的資料與磁盤資料合并的時候,先要判斷資料是否有重復,如果不用Bloom Filter就需要在磁盤上一層層地找,而使用了之后就會降低搜索代價,
領取方法 :關注后 添加下方圖中小助手VX即可獲取
網路編程
- ISO模型與協議
- http1.0:需要使用keep-alive引數來告知服務器端要建立一個長連接
- http1.1:默認長連接,支持只發送header資訊,可以用作權限請求,支持Host域,
- http2.0:多路復用的技術,做到同一個連接并發處理多個請求,HTTP2.0使用HPACK演算法對header的資料進行壓縮,支持HTTP2.0的web server請求資料的時候,服務器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次創建連接發送請求到服務器端獲取,這種方式非常合適加載靜態資源,
- 會話層:負責管理主機之間的會話行程,負責建立、管理、終止行程之間的會話,
- 傳輸層:將上層資料分段并提供端到端的、可靠的或不可靠的傳輸,還要處理端到端的差錯控制和流量控制問題,協議TCP、UDP、SPX
- 網路層:對子網間的資料包進行路由選擇,此外,網路層還可以實作擁塞控制、網際互連等功能,協議IP、IPX、RIP、OSPF
- 資料鏈路層:在不可靠的物理介質上提供可靠的傳輸,該層的作用包括:物理地址尋址、資料的成幀、流量控制、資料的檢錯、重發等,協議SDLC、HDLC、PPP、STP、幀中繼
- TCP\IP模型與協議
- 應用層:單位是資料段,協議有FTP、TELNET、HTTP、SMTP、SNMP、TFTP、NTP、DNS
- 運輸層:單位是資料包,協議有TCP、UDP
- 網路層:單位是資料幀,協議有IP
- 網路介面層:單位是位元,ARP、RARP
- 三次握手與四次揮手
- BIO NIO AIO
- BIO:同步阻塞IO,每個請求都要一個執行緒來處理,
- NIO:同步非阻塞IO,一個執行緒可以處理多個請求,適用于短連接、小資料,
- AIO:異步非阻塞IO,一個執行緒處理多個請求,使用回呼函式實作,適用于長連接、大資料,
- DDOS攻擊原理與防御方式
- HTTP Get Flood:發送大量會產生sql查詢的連接,使得資料庫負載很高,
- CSRF跨站請求偽造原理攻擊者盜用了你的身份,以你的名義發送惡意請求,
- CSRF攻擊是源于WEB的隱式身份驗證機制!WEB的身份驗證機制雖然可以保證一個請求是來自于某個用戶的瀏覽器,但卻無法保證該請求是用戶批準發送的!
- 防御方式:1.驗證碼;2. 后臺生成token,讓前端請求攜帶,3.使用對稱加密,后端隨機給前端一個密鑰,前端進行加密,后端解密,
- 會話劫持通過暴力破解、 預測、竊取(通過XSS攻擊)等方式獲取到用戶session
- XSS攻擊XSS攻擊是Web攻擊中最常見的攻擊方法之一,它是通過對網頁注入可執行代碼且成功地被瀏覽器執行,達到攻擊的目的,形成了一次有效XSS攻擊,一旦攻擊成功,它可以獲取用戶的聯系人串列,然后向聯系人發送虛假詐騙資訊,可以洗掉用戶的日志等等,有時候還和其他攻擊方式同時實施比如SQL注入攻擊服務器和資料庫、Click劫持、相對鏈接劫持等實施釣魚,它帶來的危害是巨大的,是web安全的頭號大敵,
- XSS反射型攻擊,惡意代碼并沒有保存在目標網站,通過引誘用戶點擊一個鏈接到目標網站的惡意鏈接來實施攻擊的,
- XSS存盤型攻擊,惡意代碼被保存到目標網站的服務器中,這種攻擊具有較強的穩定性和持久性,比較常見場景是在博客,論壇等社交網站上,但OA系統,和CRM系統上也能看到它身影,比如:某CRM系統的客戶投訴功能上存在XSS存盤型漏洞,黑客提交了惡意攻擊代碼,當系統管理員查看投訴資訊時惡意代碼執行,竊取了客戶的資料,然而管理員毫不知情,這就是典型的XSS存盤型攻擊,
- 解決方法
- 在表單提交或者url引數傳遞前,對需要的引數進行過濾
- 過濾用戶輸入,檢查用戶輸入的內容中是否有非法內容,如<>(尖括號)、”(引號)、 ‘(單引號)、%(百分比符號)、;(分號)、()(括號)、&(& 符號)、+(加號)等
28.RPC與HTTP服務的區別
多執行緒
- synchronized、CAS
- Collections
- 支持高并發的資料結構,如ConcurrentHashMap
- 基于AQS實作的鎖、信號量、計數器原理
- Runnable與Callable的區別
- 執行緒池
- 作用
- 減少在創建和銷毀執行緒上所花的時間以及系統資源的開銷 ,
- 當前任務與主執行緒隔離,能實作和主執行緒的異步執行,特別是很多可以分開重復執行的任務,
8.阻塞佇列
9.threadlocal
Spring框架
- IOC/DI
- Core、Beans、Context、Expression Language
- JDBC、ORM、OXM、JMS、Transaction
- AOP
- Web
- Test
- @Autowired原理
- 工廠模式
- 反射
- 自動配置@ConfigurationProperties(prefix = "hello"):讀取以hello為開頭的配置,屬性類使用
- @Configuration:指名當前類為配置類
- @EnableConfigurationProperties(Properties):指名配置屬性類
- @ConditionalOnClass(Condition.class):條件類,只有Condition.class存在,當前配置類才生效
- Spring Boot在spring.factories配置了很多全限定名的配置類,
Redis
核心原理
- 常用資料型別String:二進制安全,可以存任何資料,比如序列化的圖片,最大長度位512M.
- Hash:是KV對集合,本質是String型別的KV映射,適合存盤物件,
- List:簡單字串鏈表,可以在left、right兩邊插入,本質是雙向鏈表,緩沖區也是用這個實作,
- Set:String型別的無序集合,內部實作是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因,
- zset:有序集合,每個元素會關聯一個double型別的score,然后根據score進行排序,注意:元素不能重復,但是score是可以重復的,使用HashMap和跳躍表(SkipList)來保證資料的存盤和有序,HashMap里放的是成員到score的映射,而跳躍表里存放的是所有的成員,排序依據是HashMap里存的score.
- pub/sub:在Redis中,你可以設定對某一個key值進行訊息發布及訊息訂閱,當一個key值上進行了訊息發布后,所有訂閱它的客戶端都會收到相應的訊息,
持久化
- RDB:一種是手動執行持久化命令來持久化快照;另一種是在組態檔中配置策略,來自動持久化,持久化命令有save、bgsave兩種,bgsave會呼叫fork命令,產生子行程來進行持久化,而父行程繼續處理資料,但是持久化的快照是fork那一刻的快照,因此這種策略可能會丟失一部分資料,特點:每次都記錄所有資料,恢復快,子行程不影響父行程性能,
- AOF:append only file,將每條操作命令都記錄到appendonly.aof檔案中,但是不會立馬寫入硬碟,我們可以配置always(每有一個命令,都同步)、everysec(每秒同步一次)、no(沒30秒同步一次),往往everysec就夠了,aof資料損失要比RDB小,特點:有序記錄所有操作,資料丟失更少,會對操作做壓縮優化,bgrewriteaof也會fork子行程,不影響父行程性能
事務
- Transactions:不是嚴格的ACID的事務,但是這個Transactions還是提供了基本的命令打包執行的功能(在服務器不出問題的情況下,可以保證一連串的命令是順序在一起執行的,中間有會有其它客戶端命令插進來執行),
- Redis還提供了一個Watch功能,你可以對一個key進行Watch,然后再執行Transactions,在這程序中,如果這個Watched的值進行了修改,那么這個Transactions會發現并拒絕執行,
KafKA
- topic
- broker
- partition
- consumer
- producer
- stream
- 存盤機制
- 網路模型
- 注意:partition之間是無序的
- 訊息佇列的生產者消費者中消費者沒有收到訊息怎么辦,訊息有順序比如1.2.3但是收到的卻是1.3.2怎么辦?訊息發過來的程序中損壞或者出錯怎么辦
Spring security
- 攔截器堆疊
- @PreAuthorize
- @PostAuthorize
- 支持Expression Language
jvm原理
記憶體模型、垃圾收集器、CMS與G1是重點
垃圾收集演算法
- 標記-清除(CMS)容易產生碎片,當碎片太多會提前觸發Full GC
- 復制(年輕代基本用這個演算法)會浪費一半的可能感覺
- 標記-整理(serial Old、Parallel Old)
- Serial:采用單執行緒stop-the-world的方式進行收集,當記憶體不足時,串行GC設定停頓標識,待所有執行緒都進入安全點(Safepoint)時,應用執行緒暫停,串行GC開始作業,采用單執行緒方式回收空間并整理記憶體,串行收集器特別適合堆記憶體不高、單核甚至雙核CPU的場合,
- ParNew
- Parallel Scavenge
CMS:
- 初始標記(stop of world)
- 并行標記、預清理
- 重新標記(stop of world)
- 并行清理
G1
將堆分成很多region,可以同時堆年輕代與老年代進行收集
- 初始標記(stop of world):初始標記(Initial Mark)負責標記所有能被直接可達的根物件(原生堆疊物件、全域物件、JNI物件)
- 并行標記:
- 重新標記(stop of world):
- 清理(stop of world):
- 重置
gc觸發條件
- 從年輕代磁區拷貝存活物件時,無法找到可用的空閑磁區,會觸發Minor GC
- 從老年代磁區轉移存活物件時,無法找到可用的空閑磁區,會觸發Major GC
- 分配巨型物件時在老年代無法找到足夠的連續磁區,會觸發Major GC
- 可達性分析:通過檢查一塊記憶體空間能否被root達到,來判斷是否對其進行回收,
jdk不同版本新增的部分特性
jvm調優
- VisualVM:JDK自帶JVM可視化工具,能過對記憶體、gc、cpu、thread、class、變數等等資訊進行可視化,
設計模式
- 單例雙重檢查
- 觀察者模式
- 裝飾者模式:jdk中輸入輸出流用到了該模式
- 配接器模式:jdk中Reader、writer用到了該模式
- 代理模式
- 靜態代理
- JDK動態代理
- Cglib到動態代理
- 生產者消費者模式
- 工廠模式
專案管理與運維工具
- git+Jenkins
- maven
- K8Spod:Pod是所有業務型別的基礎,所有的容器均在Pod中運行,它是一個或多個容器的組合,每一個Pod都會被指派一個唯一的Ip地址,在Pod中的每一個容器共享網路命名空間,包括Ip地址和網路埠,Pod能夠被指定共享存盤卷的集合,在Pod中所有的容器能夠訪問共享存盤卷,允許這些容器共享資料,
- kubelet:kubelet負責管理pods和它們上面的容器,images鏡像、volumes、etc,
- ingress,用于負載均衡
- docker
- docker與虛擬機的區別
資料結構
- 平衡二叉樹AVL
- 高度log(n)
- 插入時間復雜度log(n)
- 紅黑樹
- 插入時間復雜度log(n)
- 查找時間復雜度log(n)
- 在查找是,紅黑樹雖然復雜度也是log(n),但是從效率上比要略低于AVL,但是其優勢在于插入元素的時候,不會像AVL那樣頻繁地旋轉,
- B+Tree:只有葉子節點存值,非葉子節點只存key和child,因此同樣大小的物理頁上能存放更多的節點,每一層的節點數量越多,意味著層次越少,也就意味著IO次數越少,因此非常適合資料庫以及檔案系統,
- 大根堆:采用陣列存盤樹,是一個完全樹,先插入到陣列最后的位置上,然后采用上浮的思想,將該元素與比它小的父元素調換,直到parent>target,浮到root;然后將root與未排序的最后一個元素交換位置;重復以上步驟,直到所有元素都有序,插入如查找的復雜度都是log(n),
- 優先佇列PriorityQueue,Java中使用小根堆實作,非執行緒安全,
- 優先阻塞佇列PriorityBlockQueue,執行緒安全,
演算法
- 快排
- 時間復雜度O(nlog(n))
- 空間復雜度O(log(n))
- 堆排序
- 時間復雜度O(nlog(n))
- 空間復雜度O(1)
- 歸并排序
- 時間復雜度O(nlog(n))
- 空間復雜度O(n)
- 跳表時間復雜度O(log(n))
- 空間復雜度O(2n)
- 高度O(log(n))
分布式
cap理論
- 可用性
- 一致性
- 磁區容忍性:對網路斷開的容忍度,有點像魯棒性
- 拜占庭將軍問題
Raft 演算法
- 有leader、follower、candidate
同步流程
- 由客戶端提交資料到Leader節點,
- 由Leader節點把資料復制到集群內所有的Follower節點,如果一次復制失敗,會不斷進行重試,
- Follower節點們接收到復制的資料,會反饋給Leader節點,
- 如果Leader節點接收到超過半數的Follower反饋,表明復制成功,于是提交自己的資料,并通知客戶端資料提交成功,
- 由Leader節點通知集群內所有的Follower節點提交資料,從而完成資料同步流程,
zookeeper
- Zab(Zookeeper Atomic Broadcast)協議,有兩種模式:
- 它們分別是:恢復模式(選主)和廣播模式(同步),
- 有兩種演算法:1. basic paxos;2. fast paxos(默認)
- 檔案系統:zookeeper的通知機制、分布式鎖、佇列管理、配置管理都是基于檔案系統的,
- 分布式鎖:有了zookeeper的一致性檔案系統,鎖的問題變得容易,鎖服務可以分為兩類,一個是保持獨占,另一個是控制時序,
- 獨占鎖:將zookeeper上的一個znode看作是一把鎖,通過createznode的方式來實作,所有客戶端都去創建 /distribute_lock 節點,最終成功創建的那個客戶端也即擁有了這把鎖,用完洗掉掉自己創建的distribute_lock 節點就釋放出鎖,
- 控制時序鎖:/distribute_lock 已經預先存在,所有客戶端在它下面創建臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完洗掉,
- 佇列管理,分為同步佇列、非同步佇列
- 資料復制的好處
- 容錯:一個節點出錯,不致于讓整個系統停止作業,別的節點可以接管它的作業;
- 提高系統的擴展能力 :把負載分布到多個節點上,或者增加節點來提高系統的負載能力;
- 提高性能:讓客戶端本地訪問就近的節點,提高用戶訪問速度,
5.一致性hash演算法原理
微服務
Spring cloud
- 網關:zuul
- 分布式\版本化配置 config
- 服務注冊和發現:Eureka,配置時需要注意多久重繪串列一次,多久監測心跳等,
- service-to-service 呼叫
- 負載均衡:Ribbon;在生成RestTemplate的bean時,通過@LoadBalanced注解可以使得RestTemplate的呼叫
- 斷路器:Hystrix
- 監控:spring admin,在啟動類上加@EnableAdminServer注解,
java web
- servlet作業原理
- tomcat作業原理,好文,強推
- container
linux
- 系統結構,講得很好,強推
- 硬鏈接與軟連接
- 硬鏈接:資料節點通過參考計數的方式來對指向它的硬鏈接計數,當計數為0就洗掉,
- 軟連接:我們可以把它看成是快捷方式,它只是記錄了某個檔案的硬鏈接的路徑,如果我們把源檔案洗掉,再重新創建一個相同名字的檔案,那么軟連接指向的就是新創建的檔案,
- 虛擬檔案系統(VFS):檔案系統是有很多實作的,比如ext2、ext3、FAT等等,而VFS則是存在于應用程式與檔案系統中間,它封裝了open、close、read、write等等操作檔案系統的介面,為應用程式屏蔽掉不同檔案系統之間的差異,
- VFS資料結構
其它
- bitmap,大檔案交集
- Elasticsearch索引原理
- 從記憶體到螢屏經歷了啥
- 高并發場景的限流,你怎么來確定限流限多少,模擬場景和實際場景有區別怎么解決,
騰訊面試
- 說一下redis與kafka,redis持久化策略
- git中rebase與merge區別
- docker底層原理,依賴作業系統的什么
- ls -l | grep xxx的執行程序,盡可能的細,是多行程還是單行程?
- 兩個有序陣列求中位數
- 演算法 3Sum、中序遍歷非遞回實作、回圈列印矩陣
- final、finally、finanize
- jvm記憶體模型
- 垃圾回收器
- Spring特點介紹下
- Synchronize與ReentrantLock的區別、使用場景
- CAS使用場景
- 聊了下git+jekins+K8S+docker實作自動化部署
- innodb原理,使用場景,與MYISAM在場景上的區別
- weakReference、softReference等
- Hbase的原理,LSM Tree
- Linux中,哪種行程可以使用管道
京東面試
- 權限模型
- 介紹下執行緒池,阻塞佇列的用法,無界佇列真的無界嗎?
- 說一下redis
- kafka存盤模型與網路模型
- zookeeper與redis實作分布式鎖
- 樂觀鎖與悲觀鎖
- 演算法:有n個人,給你ai與aj的身高關系,如ai比aj高,進行身高排序,如果條件不滿足,則輸出“不滿足”
- Spring boot的特性
以上是總結出的最全技術面試題目,以下是最新總結出的BAT面試java必考題目和答案,
2018最新BAT高級java面試68題和答案

領取方法 :關注后 添加下方圖中小助手VX即可獲取

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164649.html
標籤:python
