阿里P8架構師面試總結:Mysql+Redis+Spring+多線程(含答案)

2019-08-23     IT技術分享

Mysql

1、我們如何在mysql中運行批處理模式? 以下命令用於在批處理模式下運行: mysql; mysql mysql.out

2、MyISAM表格將在哪裡存儲,並且還提供其存儲格式? 每個MyISAM表格以三種格式存儲在磁碟上: ·「.frm」文件存儲表定義 ·數據文件具有「.MYD」(MYData)擴展名 索引文件具有「.MYI」(MYIndex)擴展名

3.、Mysql中有哪些不同的表格? 共有5種類型的表格:  MyISAM  Heap  Merge  INNODB  ISAM MyISAM是Mysql的默認存儲引擎。

4、ISAM是什麼? ISAM 簡稱為索引順序訪問方法。它是由IBM 開發的,用於在磁帶等輔助存儲系統上存儲 和檢索數據。

5、InnoDB是什麼? lnnoDB是一個由Oracle公司開發的Innobase Oy事務安全存儲引擎。

6、Mysql如何優化DISTINCT? DISTINCT在所有列上轉換為GROUP BY,並與ORDER BY子句結合使用。 SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;

7、如何輸入字符為十六進位數字? 如果想輸入字符為十六進位數字,可以輸入帶有單引號的十六進位數字和前綴(X),或者 只用(Ox)前綴輸入十六進位數字。 如果表達式上下文是字符串,則十六進位數字串將自動轉換為字符串。

Spring

1. 什麼是 Spring 的依賴注入? 依賴注入,是 IOC 的一個方面,是個通常的概念,它有多種解釋。這概念是說你不 用創建對象,而只需要描述它如何被創建。你不在代碼里直接組裝你的組件和服務, 但是要在配置文件里描述哪些組件需要哪些服務,之後一個容器(IOC 容器)負責把 他們組裝起來。

2. 有哪些不同類型的 IOC(依賴注入)方式? 構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實現的,該類有一 系列參數,每個參數代表一個對其他類的依賴。 Setter 方法注入:Setter 方法注入是容器通過調用無參構造器或無參 static 工廠 方 法實例化 bean 之後,調用該 bean 的 setter 方法,即實現了基於 setter 的依賴注 入。

3. 哪種依賴注入方式你建議使用,構造器注入,還是 Setter 方法注入? 你兩種依賴方式都可以使用,構造器注入和 Setter 方法注入。最好的解決方案是用 構造器參數實現強制依賴,setter 方法實現可選依賴。

4. 一個 Spring 的應用看起來象什麼?

一個定義了一些功能的接口

這實現包括屬性,它的 Setter , getter 方法和函數等

Spring AOP  Spring 的 XML 配置文件

使用以上功能的客戶端程序

Redis

1、都有哪些辦法可以降低Redis的內存使用情況呢? 如果你使用的是 32 位的 Redis 實例,可以好好利用 Hash,list,sortedset,set 等集合類型數據, 因為通常情況下很多小的 Key-Value 可以用更緊湊的方式存放到一起。

43、查看Redis使用情況及狀態信息用什麼命令? info

2、Redis的內存用完了會發生什麼? 如果達到設置的上限,Redis 的寫命令會返回錯誤信息(但是讀命令還可以正常返回。)或 者你可以將Redis當緩存來使用配置淘汰機制,當Redis達到內存上限時會沖刷掉舊的內容。

3、Redis是單線程的,如何提高多核CPU 的利用率? 可以在同一個伺服器部署多個 Redis 的實例,並把他們當作不同的伺服器來使用,在某些時 候,無論如何一個伺服器是不夠的, 所以,如果你想使用多個 CPU,你可以考慮一下分片(shard)。

4、一個 Redis 實例最多能存放多少的 keys?List、Set、 SortedSet他們最多能存放多少元素? 理論上 Redis 可以處理多達 232 的 keys,並且在實際中進行了測試,每個實例至少存放了 2 億 5 千萬的 keys。我們正在測試一些較大的值。

任何 list、set、和 sortedset 都可以放 232 個元素。

換句話說,Redis 的存儲極限是系統中的可用內存值。

5、Redis常見性能問題和解決方案?

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF 日誌文件

(2) 如果數據比較重要,某個Slave開啟AOF 備份數據,策略設置為每秒同步一次

(3) 為了主從複製的速度和連接的穩定性,Master和Slave最好在同一個區域網內

多線程

1、怎麼喚醒一個阻塞的線程? 如果線程是因為調用了 wait()、sleep()或者 join()方法而導致的阻塞,可以中斷線程, 並且通過拋出 InterruptedException 來喚醒它;如果線程遇到了 IO 阻塞,無能為力, 因為 IO是作業系統實現的,Java 代碼並沒有辦法直接接觸到作業系統。

2、不可變對象對多線程有什麼幫助? 不可變對象保證了對象的內存可見性,對不可變對象的讀取不需要進行額外的同步 手段,提升了代碼執行效率。

3、多線程上下文切換是什麼意思? 多線程的上下文切換是指 CPU 控制權由一個已經正在運行的線程切換到另外一個 就緒並等待獲取 CPU 執行權的線程的過程。

4、Java 中用到了什麼線程調度算法? 搶占式。一個線程用完 CPU 之後,作業系統會根據線程優先級、線程飢餓情況等 數據算出一個總的優先級並分配下一個時間片給某個線程執行。

5、Thread.sleep(0)的作用是什麼? 由於 Java 採用搶占式的線程調度算法,因此可能會出現某條線程常常獲取到 CPU 控制權的情況,為了讓某些優先級比較低的線程也能獲取到 CPU 控制權,可以使 用 Thread.sleep(0)手動觸發一次作業系統分配時間片的操作,這也是平衡 CPU 控制 權的一種操作。

6、Java 中堆和棧有什麼不同? 每個線程都有自己的棧內存,用於存儲本地變量,方法參數和棧調用,一個線程中 存儲的變量對其它線程是不可見的。而堆是所有線程共享的一片公用內存區域。對 象都在堆里創建,為了提升效率線程會從堆中弄一個緩存到自己的棧,如果多個線 程使用該變量就可能引發問題,這時 volatile 變量就可以發揮作用了,它要求線程 從主存中讀取變量的值。

7、你如何在 Java 中獲取線程堆棧? 對於不同的作業系統,有多種方法來獲得 Java 進程的線程堆棧。當你獲取線程堆 棧時,JVM會把所有線程的狀態存到日誌文件或者輸出到控制台。在 Windows 你 可以使用 Ctrl + Break 組合鍵來獲取線程堆棧,Linux 下用 kill -3 命令。你也可以 用 jstack 這個工具來獲取,它對線程 id 進行操作,你可以用 jps 這個工具找到 id。

8、如何創建線程安全的單例模式? 單例模式即一個 JVM 內存中只存在一個類的對象實例分類 1、懶漢式 類加載的時候就創建實例 2、餓漢式 使用的時候才創建實例。

轉發+關注,然後私信回復「資料」即可免費獲得資料的領取方式!

文章來源: https://twgreatdaily.com/zh-hk/j77BP20BJleJMoPM0qQp.html