Java相關面試題總結+答案(九)

【MySQL】node


164. 數據庫的三範式是什麼?mysql

  • 第一範式:強調的是列的原子性,即數據庫表的每一列都是不可分割的原子數據項。
  • 第二範式:屬性徹底依賴於主鍵(知足第一範式的前提下),即任意一個字段只依賴於表中的同一個字段。
  • 第三範式:任何非主屬性不依賴於其它非主屬性(知足第二範式的前提下)。即不存在傳遞依賴。

165. 一張自增表裏面總共有 7 條數據,刪除了最後 2 條數據,重啓 MySQL 數據庫,又插入了一條數據,此時 id 是幾?nginx

  • 數據庫引擎若是是 MyISAM ,那 id 就是 8。
  • 數據庫引擎若是是 InnoDB,那 id 就是 6。

  InnoDB 表只會把自增主鍵的最大 id 記錄在內存中,因此重啓以後會致使最大 id 丟失。算法

166. 如何獲取當前數據庫版本?sql

  使用 select version() 獲取當前 MySQL 數據庫版本。數據庫

167. 說一下 ACID 是什麼?緩存

  • Atomicity(原子性):一個事務(transaction)中的全部操做,或者所有完成,或者所有不完成,不會結束在中間某個環節。事務在執行過程當中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。即,事務不可分割、不可約簡。
  • Consistency(一致性):在事務開始以前和事務結束之後,數據庫的完整性沒有被破壞。這表示寫入的資料必須徹底符合全部的預設約束、觸發器、級聯回滾等。
  • Isolation(隔離性):數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。事務隔離分爲不一樣級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事務處理結束後,對數據的修改就是永久的,即使系統故障也不會丟失。

168. char 和 varchar 的區別是什麼?性能優化

  • char(n) :固定長度類型,好比訂閱 char(10),當你輸入"abc"三個字符的時候,它們佔的空間仍是 10 個字節,其餘 7 個是空字節。

  char 優勢:效率高;缺點:佔用空間;適用場景:存儲密碼的 md5 值,固定長度的,使用 char 很是合適。服務器

  • varchar(n) :可變長度,存儲的值是每一個值佔用的字節再加上一個用來記錄其長度的字節的長度。

  因此,從空間上考慮 varcahr 比較合適;從效率上考慮 char 比較合適,兩者使用須要權衡。網絡

169. float 和 double 的區別是什麼?

  • float 最多能夠存儲 8 位的十進制數,並在內存中佔 4 字節。
  • double 最可能夠存儲 16 位的十進制數,並在內存中佔 8 字節。

170. MySQL 的內鏈接、左鏈接、右鏈接有什麼區別?

內鏈接關鍵字:inner join;左鏈接:left join;右鏈接:right join。

內鏈接是把匹配的關聯數據顯示出來;左鏈接是左邊的表所有顯示出來,右邊的表顯示出符合條件的數據;右鏈接正好相反。

171. MySQL 索引是怎麼實現的?

索引是知足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。

具體來講 MySQL 中的索引,不一樣的數據引擎實現有所不一樣,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,能夠到達二分法的性能,找到數據區域以後就找到了完整的數據結構了,全部索引的性能也是更好的。

172. 怎麼驗證 MySQL 的索引是否知足需求?

使用 explain 查看 SQL 是如何執行查詢語句的,從而分析你的索引是否知足需求。

explain 語法:explain select * from table where type=1。

173. 說一下數據庫的事務隔離?

MySQL 的事務隔離是在 MySQL. ini 配置文件裏添加的,在文件的最後添加:transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。

    • READ-UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其餘事務讀取(會出現幻讀、髒讀、不可重複讀)。
    • READ-COMMITTED:提交讀,一個事務提交後才能被其餘事務讀取到(會形成幻讀、不可重複讀)。
    • REPEATABLE-READ:可重複讀,默認級別,保證屢次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(會形成幻讀)。
    • SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止髒讀、不可重複讀、幻讀。

髒讀 :表示一個事務可以讀取另外一個事務中還未提交的數據。好比,某個事務嘗試插入記錄 A,此時該事務還未提交,而後另外一個事務嘗試讀取到了記錄 A。

不可重複讀 :是指在一個事務內,屢次讀同一數據。

幻讀 :指同一個事務內屢次查詢返回的結果集不同。好比同一個事務 A 第一次查詢時候有 n 條記錄,可是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺。發生幻讀的緣由也是另一個事務新增或者刪除或者修改了第一個事務結果集裏面的數據,同一個記錄的數據內容被修改了,全部數據行的記錄就變多或者變少了。

174. 說一下 MySQL 經常使用的引擎?

  • InnoDB 引擎:mysql 5.1 後默認的數據庫引擎,提供了對數據庫 acid 事務的支持,而且還提供了行級鎖和外鍵的約束,它的設計的目標就是處理大數據容量的數據庫系統。MySQL 運行的時候,InnoDB 會在內存中創建緩衝池,用於緩衝數據和索引。可是該引擎是不支持全文搜索,同時啓動也比較的慢,它是不會保存表的行數的,因此當進行 select count(*) from table 指令的時候,須要進行掃描全表。因爲鎖的粒度小,寫操做是不會鎖定全表的,因此在併發度較高的場景下使用會提高效率的。
  • MyIASM 引擎:不提供事務的支持,也不支持行級鎖和外鍵。所以當執行插入和更新語句時,即執行寫操做的時候須要鎖定這個表,因此會致使效率會下降。不過和 InnoDB 不一樣的是,MyIASM 引擎是保存了表的行數,因而當進行 select count(*) from table 語句時,能夠直接的讀取已經保存的值而不須要進行掃描全表。因此,若是表的讀操做遠遠多於寫操做時,而且不須要事務的支持的,能夠將 MyIASM 做爲數據庫引擎的首選。

175. 說一下 MySQL 的行鎖和表鎖?

MyISAM 只支持表鎖,InnoDB 支持表鎖和行鎖,默認爲行鎖。

    • 表級鎖:開銷小,加鎖快,不會出現死鎖。鎖定粒度大,發生鎖衝突的機率最高,併發量最低。
    • 行級鎖:開銷大,加鎖慢,會出現死鎖。鎖力度小,發生鎖衝突的機率小,併發度最高。
  • 176. 說一下樂觀鎖和悲觀鎖?
  • 樂觀鎖:每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在提交更新的時候會判斷一下在此期間別人有沒有去更新這個數據。
  • 悲觀鎖:每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻止,直到這個鎖被釋放。

  數據庫的樂觀鎖須要本身實現,在表裏面添加一個 version 字段,每次修改爲功值加 1,這樣每次修改的時候先對比一下,本身擁有的 version 和數據庫如今的 version 是否一致,若是不一致就不修改,這樣就實現了樂觀鎖。

177. MySQL 問題排查都有哪些手段?

  • 使用 show processlist 命令查看當前全部鏈接信息。
  • 使用 explain 命令查詢 SQL 語句執行計劃。
  • 開啓慢查詢日誌,查看慢查詢的 SQL。

178. 如何作 MySQL 的性能優化?

  • 爲搜索字段建立索引。
  • 避免使用 select *,列出須要查詢的字段。
  • 垂直分割分表。
  • 選擇正確的存儲引擎。

【Redis】


179. Redis 是什麼?都有哪些使用場景?

Redis 是一個使用 C 語言開發的高速緩存數據庫。

Redis 使用場景:

    • 記錄帖子點贊數、點擊數、評論數;
    • 緩存近期熱帖;
    • 緩存文章詳情信息;
    • 記錄用戶會話信息。

180. Redis 有哪些功能?

  • 數據緩存功能
  • 分佈式鎖的功能
  • 支持數據持久化
  • 支持事務
  • 支持消息隊列

181. Redis 和 memcache 有什麼區別?

  • 存儲方式不一樣:memcache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小;Redis 有部份存在硬盤上,這樣能保證數據的持久性。
  • 數據支持類型:memcache 對數據類型支持相對簡單;Redis 有複雜的數據類型。
  • 使用底層模型不一樣:它們之間底層實現方式,以及與客戶端之間通訊的應用協議不同,Redis 本身構建了 vm 機制,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
  • value 值大小不一樣:Redis 最大能夠達到 512mb;memcache 只有 1mb。

182. Redis 爲何是單線程的?

由於 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且 cpu 又不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了。

關於 Redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求。

並且單線程並不表明就慢 nginx 和 nodejs 也都是高性能單線程的表明。

183. 什麼是緩存穿透?怎麼解決?

緩存穿透:指查詢一個必定不存在的數據,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將致使這個不存在的數據每次請求都要到數據庫去查詢,形成緩存穿透。

解決方案:最簡單粗暴的方法若是一個查詢返回的數據爲空(不論是數據不存在,仍是系統故障),咱們就把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。

184. Redis 支持的數據類型有哪些?

  Redis 支持的數據類型:string(字符串)、list(列表)、hash(散列表)、set(集合)、zset(有序集合)。

185. Redis 支持的 Java 客戶端都有哪些?

  支持的 Java 客戶端有 Redisson、jedis、lettuce 等。

186. jedis 和 Redisson 有哪些區別?

  • jedis:提供了比較全面的 Redis 命令的支持。
  • Redisson:實現了分佈式和可擴展的 Java 數據結構,與 jedis 相比 Redisson 的功能相對簡單,不支持排序、事務、管道、分區等 Redis 特性。

187. 怎麼保證緩存和數據庫數據的一致性?

  • 合理設置緩存的過時時間。
  • 新增、更改、刪除數據庫操做時同步更新 Redis,可使用事物機制來保證數據的一致性。

188. Redis 持久化有幾種方式?

Redis 的持久化有兩種方式,或者說有兩種策略:

    • RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。
    • AOF(Append Only File):每個收到的寫命令都經過write函數追加到文件中。

189. Redis 怎麼實現分佈式鎖?

Redis 分佈式鎖其實就是在系統裏面佔一個「坑」,其餘程序也要佔「坑」的時候,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試。

佔坑通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,使用完調用 del 釋放鎖。

190. Redis 分佈式鎖有什麼缺陷?

  Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行若是超出了鎖的超時時間就會出現問題。

191. Redis 如何作內存優化?

  儘可能使用 Redis 的散列表,把相關的信息放到散列表裏面存儲,而不是把每一個字段單獨存儲,這樣能夠有效的減小內存使用。好比將 Web 系統的用戶對象,應該放到散列表裏面再總體存儲到 Redis,而不是把用戶的姓名、年齡、密碼、郵箱等字段分別設置 key 進行存儲。

192. Redis 淘汰策略有哪些?

  • volatile-lru:從已設置過時時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。
  • volatile-ttl:從已設置過時時間的數據集(server. db[i]. expires)中挑選將要過時的數據淘汰。
  • volatile-random:從已設置過時時間的數據集(server. db[i]. expires)中任意選擇數據淘汰。
  • allkeys-lru:從數據集(server. db[i]. dict)中挑選最近最少使用的數據淘汰。
  • allkeys-random:從數據集(server. db[i]. dict)中任意選擇數據淘汰。
  • no-enviction(驅逐):禁止驅逐數據。

193. Redis 常見的性能問題有哪些?該如何解決?

  • 主服務器寫內存快照,會阻塞主線程的工做,當快照比較大時對性能影響是很是大的,會間斷性暫停服務,因此主服務器最好不要寫內存快照。
  • Redis 主從複製的性能問題,爲了主從複製的速度和鏈接的穩定性,主從庫最好在同一個局域網內。
相關文章
相關標籤/搜索