關系型數據庫MySQL
1、數據庫底層
MySQL數據庫的底層是B+樹。說到B+樹,先說下B樹,B樹也叫多路平衡查找樹,所有的葉子節點位於同一層,具有以下特點:1)一個節點可以容納多個值;2)除非數據已滿,不會增加新的層,B樹追求最少的層數;3)子節點中的值與父節點的值有嚴格的大小對應關系。一般來說,如果父節點有a個值,那么就有a+1個子節點;4)關鍵字集合分布在整棵樹中;5)任何一個關鍵字出現且只出現在一個節點中;6)搜索可能在葉子結點結束,其搜索性能等價於在關鍵字全集做一次二分查找。
B+樹是基於B樹和葉子節點順序訪問指針進行實現,它具有B樹的平衡性,並且通過順序訪問指針來提高區間查詢的性能,一個葉子節點中的key從左至右非遞減排列。特點在於:1)非葉子節點中含有n個關鍵字,關鍵字不保存數據,只作為索引,所有數據都保存在葉子結點;2)有的葉子節點中包含了全部關鍵字的信息及只想這些關鍵字記錄的指針,即葉子節點包含鏈表結構,能夠方便進行區間查詢;3)所有的非葉子結點可以看成是索引部分,節點中僅包含其子樹中的最大(或最小)關鍵字;4)同一個數字會在不同節點中重復出現,根節點的最大元素就是B+樹的最大元素。
MySQL中的InnoDB引擎是以主鍵ID為索引的數據存儲引擎。InnoDB通過B+樹結構對ID建立索引,在葉子節點存儲數據。若建索引的字段不是主鍵ID,則對該字段建索引,然后再葉子節點中存儲的是該記錄的主鍵,然后通過主鍵索引找到對應的記錄。因為不再需要全表掃描,只需要對樹進行搜索即可,所以查找速度很快,還可以用於排序和分組。
InnoDB和MyISAM引擎都是基於B+樹,InnoDB是聚簇索引,數據域存放的是完整的數據記錄;MyISAM是非聚簇索引,數據域存放的是數據記錄的地址。InnoDB支持表鎖、行鎖、間隙鎖、外鍵以及事務,MyISAM僅支持表鎖,同時不支持外鍵和事務。InnoDB注重事務,MyISAM注重性能。
2、SQL語言之DQL、DML、DDL和DCL
DQL指的是Data Query Language,數據庫查詢語言,主要是select命令;
DML指的是Data Manipulation Language,數據庫操作語言,主要有insert、delete、update等命令;
DDL指的是Data Defined Language,數據庫定義語言,主要是對數據庫的某些對象,如database和table進行管理,主要有create、alter、drop等命令,比如創建數據庫和表格、更改表結構和設置約束、刪除表和數據庫;
DCL指的是Data Control Language,數據庫控制語言,主要是用於授予或回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的時間及效果,主要有grant、rollback等命令。
DML和DDL的區別:DML操作可以手動控制事務的開啟、提交和回滾,而DDL是隱形提交不能回滾。
3、數據庫連接協議
JDBC驅動協議:默認TCP協議
客戶端和Oracle服務器之間通信協議是TCP的,但是一個數據庫連接也會其一個UDP端口。
MySQL的連接方式有兩種:Socket和TCP/IP
-- Socket連接方式
mysql -uroot -padmin -S/application/mysql/tmp/mysql.sock
-- TCP/IP連接方式
mysql -uoot -padmin -h192.1.1.20
4、索引和主鍵的區別
主鍵用於標識數據庫記錄的唯一性,不允許記錄重復且鍵值不能為空。主鍵是特殊索引,但索引不一定是主鍵。
索引可以提高查詢速度,可以不需要進行全表掃描而快速查詢到結果。
使用主鍵,數據庫會自動創建主鍵索引,同時也可以再非主鍵上創建索引。
數據表中只能由一個主鍵,但可以有多個索引。
5、數據庫四范式
范式:創建數據庫的過程中必須遵循的准則。其作用在於減少數據庫中的數據冗余,以增加數據的一致性。
候選鍵:唯一識別該表的屬性或屬性表。
第一范式(1NF):屬性不可拆分或無重復的列;
第二范式(2NF):數據庫中的每一行必須被唯一地區分,即表中字段必須完全依賴於全部主鍵而非部分主鍵;
第三范式(3NF):消除傳遞依賴,數據庫非主鍵外的所有字段僅能以來於候選鍵,不存在與其他非主鍵關聯;
第四范式(4NF):一個表的主鍵只對應一個多值,即消除多值依賴。
6、SQL基礎
數據庫的創建與使用:
create database test;
use test;
創建表:
create table mytable (
id int not null auto_increment,
name varchar(20)
);
修改表:
alter table mytable add sex varchar(20);
增刪改:
insert into mytable(id,name,sex) values(1,'zhangsan','male');
delete from mytable where id = 1;
update mytable set name = 'lisi' where id = 1;
清空表:
truncate table mytable;
distinct:用於返回唯一不同的值
select distinct name from mytable;
limit:檢索記錄行
-- 檢索前5個記錄行
select * from mytable limit 5;
-- 檢索記錄行1-5行
select * from mytable limit 0, 5;
-- 檢索6-last行
select * from mytable limit 5, -1;
排序:
-- 默認升序
select * from mytable order by col1 DESC, col2 ASC;
like匹配:
-- %匹配大於等於1個任意字符
select * from mytable where name = 'z%';
-- _匹配1個任意字符
select * from mytable where name = 'l_s_';
-- []匹配集合內的字符
select * from mytable where name = '[zl]%';
-- [!]匹配除開集合內的字符
select * from mytable where name = '[!z]%';
concat():用於將多個字符串連接成一個字符串
select concat(trim(col1), '(', trim(col2), ')') as new from mytable;
函數:
-- 均值
select avg(col) as col_avg from mytable;
-- 計數
select count(col) as col_count from mytable;
-- 類似的sum()、max()、min()等
-- 時間
select now();
分組:
select col, count(*) as num from mytable where col > 2 group by col having by num > 2;
子查詢中只能返回一個字段的數據:
select * from mytable1 where col1 in (select col2 from mytable2);
組合查詢:
select * from mytable where col = 1 union select col from mytable where col = 2;
視圖:
create view as myview as select * from mytable where id > 2;
存儲過程:
create procedure myprocedure(out ret int)
begin
...
end
7、 刪除操作delete、truncate和drop
delete:直接刪除表中的某一行數據,並且同時將該行的刪除操作作為事務記錄在日志中保存便於進行回滾,因此delete操作更加占用資源,數據空間不釋放。delete可以對table和view對象進行操作。
delete from mytable where id = 1;
truncate:一次性從數據表中刪除所有數據(釋放存儲表數據所用的數據頁來刪除數據),因此不能回滾,占用資源更加少,速度更快。數據空間釋放后,表和索引所占用的空間會回復到初始大小。只能對沒有關聯視圖的table進行操作,對於外鍵約束引用的表,不能使用truncate,需要使用delete。
truncate mytable;
drop:刪除整個表,包括表的結構、數據、定義等。屬於永久抹去,空間會釋放,無法恢復,對table和view都能操作。
drop mytable;
總結:
在速度上,drop > truncate > delete;
在操作對象上,delete和drop可以對table和view操作,truncate只能對table操作;
在表和索引所占空間上,delete操作不會減少表和索引占用的空間,truncate操作后表和索引所占用的空間會恢復至初始大小,drop將表所占用的空間全部釋放;
在回滾上方面,delete操作為DML語句可以回滾,truncate和drop為DDL語句,隱式提交無法回滾;
在刪除限制上,delete可以操作帶有外鍵約束引用的表,而truncate不可以;
8、char和varchar的區別
char的長度是不可變的,而varchar的長度是可變的。例如,創建表時定義一個char[10]和varchar[10],當存入一個字符串sql
時,char所占的長度依然為10,除了字符sql
外后面跟7個空格,而varchar所占的長度變為字符串的實際長度3。在取數據時,char類型的要用trim()
函數去掉多余的空格,而varchar類型不需要。
char類型的存取速度比varchar快得多,因為其長度固定方便存儲與查找;但char類型會付出空間的代價,是以空間換時間來爭取高的時間效率,而varchar是以空間效率為首。
char對英文字符(ASCII)占用1個字節,對漢字占用2個字節;varchar對英文字符和漢字都是占用2個字節。
9、 數據庫的冷備份與熱備份
冷備份(off,慢,時間點上恢復):需要數據庫正常關閉,會提供一個完整的數據庫;將關鍵性文件拷貝到另外位置;對於備份數據庫信息而言,冷備份是最快最安全的方法。
優點:易歸檔、能夠回復到某個時間點;
缺點:數據庫必須處於關閉狀態;
熱備份(on,塊):數據庫運行的情況下,備份數據庫操作的sql語句,當數據庫發生問題時可以重新執行一遍備份的sql語句。
優點:備份時數據庫仍可以使用、快速恢復、屬於表或數據庫級別的備份,並且時間短
缺點:不能出錯
10、數據庫的事務及ACID屬性
事務:邏輯上的一組操作,要么都執行,要么都不執行。
四大特性:
A原子性:事務是最小的執行單位,不可分割,要么全部執行,要么都不執行;
C一致性:事務執行前后,數據庫的數據保持一致,多個事務對同一數據讀取的結果是相同的;
I隔離性:並發訪問數據庫時,事務之間互不打擾,各並發事務之間的數據庫是獨立的;
D持久性:一個事務被提交之后,該事務對數據庫所做的改變是持久的,不會被回滾。
11、並發事務的問題
臟讀:一個事務讀取到了另一個事務還未提交的修改數據,如果另一個事務進行了回滾,這個數據就是臟數據。
修改丟失:一個事務讀取數據並進行了修改,另一個事務頁讀取了該數據進行了修改,這樣第一個事務的修改結果就丟失了,也就是修改丟失問題。
不可重復讀:一個事務對同一數據進行多次修改,期間另一事務也讀取了該數據並進行了修改,這樣第一個事務讀取到的數據可能不一致,稱為不可重復讀。
幻讀:一個事務在讀取多行數據時,另一個並發事務插入了一些新數據,后續查詢中第一個事務會查找到一些原本不存在的數據記錄,稱為幻讀。在Mysql
中利用MVCC
解決了快照讀幻讀
,利用間隙鎖
解決了當前讀幻讀
。
12、隔離級別
讀未提交:最低隔離級別,允許讀取尚未提交的數據變更,會導致臟讀、不可重復讀和幻讀;
讀已提交:允許讀取並發事務已經提交的數據,可以阻止臟讀,會導致不可重復讀和幻讀;
可重復讀:對同一字段多次讀取的結果都是一樣的,可以阻止臟讀和不可重復讀,會導致幻讀;
串行化:最高隔離界別,可以阻止臟讀、不可重復讀和幻讀。
MySQL中InnoDB引擎默認支持的隔離級別是可重復讀,使用的是next-key Lock算法,可以避免幻讀的產生,可以完全保證事務的隔離性要求
13、多表查詢
一對多關系:從表使用主表的主鍵作為外鍵;主表中有的數據,從表中可以沒有;主表必須有數據,才能向從表中添加數據;要先刪除從表的相應數據才能刪除主表的數據;
多對多關系:老師與學生,一個老師可以教多個學生,一個學生也可以從多個老師那里學習知識。創建表格時,將多對多的關系拆分為多個一對多關系。
14、數據庫表的連接方式
內連接:inner join……on…… :取交集
外連接:
- 1)left join……on…… :以左表為准,查詢出左表的所有數據,右表中有對應的則顯示出來,沒有對應的則顯示為null;
- 2)right join……on…… :以右表為准,查詢出右表的所有數據,左表中有對應的則顯示出來,沒有對應的則顯示為null;
- 3)full join……on…… :left和right的集合,某表中某一行在另一表中無匹配行,則相應列的內容為null;
交叉連接:cross join…… :笛卡爾積,相當於兩個表中的所有行進行排列組合。
15、存儲過程與存儲函數
存儲過程:為以后的使用而保存的一條或多條SQL語句的集合,相當於批處理。存儲過程被編譯后會被直接保存在數據庫中,成為數據庫的一部分,以后就可以反復調用、運行速度快。
-- in表示輸入變量,out表示輸出變量,inout輸入輸出均可
create procedure myprocedure([IN|OUT|INOUT] 參數名 數據類型, [IN|OUT|INOUT] 參數名 數據類型, ...)
begin
...
end
存儲函數:
create function myfunction(參數名 數據類型, ...) returns 返回類型
begin
...
end
二者區別:
- 存儲函數限制較多,例如不能使用臨時表,只能用表變量,而存儲過程限制較少;
- 存儲過程可以實現復雜的功能,存儲函數針對性比較強;
- 返回值不同,存儲過程可以沒有返回值,也可以返回單個或多個結果集,而存儲函數有且僅有一個返回值;
- 調用不同。存儲過程通過call語句調用,存儲函數通過select調用;
- 參數不同。存儲過程的參數類型可以是in、out、inout,而存儲函數的參數類型只有in類型。
16、觸發器
SQL觸發器是一種特殊類型的存儲過程,不由用戶調用。它在指定的表中的數據發生變化時自動生效。喚醒調用觸發器以響應Insert、Update和Delete語句。他可以查詢其它表,並可以包含復雜的Transact-SQL語句。將觸發器和觸發它的語句作為可在觸發器內回滾的單個事務對待。如果檢測到嚴重錯誤,整個事務自動回滾。
優點:
- 觸發器可通過數據庫中的相關表實現級聯更改;
- 觸發器可以強制比用check約束定義的約束更為復雜的約束;
- 在約束所支持的功能無法滿足應用程序的功能要求時,觸發器就極為有用。
create trigger trigger_order after insert on orders for each row
begin
update product set pnum = pnum - new.onum where pid = new.pid;
end
17、數據庫的鎖機制
MyISAM和InnoDB存儲引擎使用的鎖:
MyISAM采用表級鎖(table-level locking),InnoDB支持行級鎖(row-level locking)和表級鎖,默認為行級鎖。
二者對比:
- 表級鎖:MySQL中粒度最大的鎖,對當前操作的整張表加鎖,實現簡單,資源消耗少,加鎖快,不會出現死鎖。鎖沖突的概率高,並發度低。
- 行級鎖:MySQL中粒度最小的鎖,只針對當前操作的行進行加鎖。行級鎖能大大減少數據庫操作的沖突。加鎖慢,開銷大,並發度高,會出現死鎖。
InnoDB引擎的鎖算法:
-
Record lock:記錄鎖。條件為精准匹配時,鎖住具體的索引項;
-
Gap lock:間隙鎖。鎖定一個范圍,不包括記錄本身。
-
Next-key lock:臨鍵鎖。鎖定一個范圍,包含記錄本身。
按思想分為樂觀鎖和悲觀鎖
- 樂觀鎖:事務並發操作時認為不會發生沖突,對數據進行更新並提交,如果檢測到沖突就返回。
- 悲觀鎖:事務並發操作使認為會發生沖突,先進行加鎖操作。
18、日志
bin log:二進制日志(服務層):涉及到主從復制;
redo log:重做日志(引擎層):數據的災后重新提交,物理日志。包括兩部分,內存中的日志緩存(redo log buffer)(易失性)和磁盤上的重做日志(redo log file)(持久性),需要將redo log buffer通過操作系統內核空間的OS buffer刷到磁盤上的log file中。
undo log:回滾日志(引擎層):主要用於數據修改的回滾,邏輯日志。會給予與操作相反的語句,當事務回滾時從undo log中反向讀取內容。
MVCC:Multiversion concurrency control,多版本並發控制,實現並發和回滾的重要功能。它指的是數據庫中的每一條數據,會存在多個版本。對同一條數據而言,MySQL 會通過一定的手段(ReadView 機制)控制每一個事務看到不同版本的數據,這樣也就解決了不可重復讀的問題。
19、解決幻讀
在Innodb
引擎中,每條聚集索引都會有兩個隱藏字段:trx_id
和roll_pointer
,每次事務對一條記錄進行改動時,就會將事務id
賦值給trx_id
,並且會將舊數據寫入一條undo日志,每條undo日志都有roll_pointer
屬性,可以將這些undo日志都連起來,串成一個鏈表,undo日志的寫入采用頭插法,新數據在前。
- 快照讀:
MVCC
中有一個ReadView
的概念,其中記錄了生成ReadView
時的活躍事務id列表:m_ids
、最小事務id:min_trx_id
、將要分配給下一個事務的id:max_trx_id
、生成ReadView的事務id:creator_trx_id
。如果被訪問版本的trx_id
與creator_trx_id
相同或者小於min_trx_id
,則可以訪問;如果被訪問版本的trx_id
大於等於max_trx_id
,則不能訪問;如果被訪問版本的trx_id
在min_trx_id
和max_trx_id
之間,則當trx_id
不在m_ids
中時才能訪問。 - 當前讀:
InnoDB
存儲引擎有三種鎖:Record lock
:單個行記錄上的鎖;Gap lock
:間隙鎖,鎖定一個范圍,不包括記錄本身;Next-key lock
:record+gap
鎖定一個范圍,包含記錄本身。innodb
對於行的查詢使用next-key lock
,當查詢的索引含有唯一屬性時,將next-key lock
降級為record key
。
20、數據庫的索引機制
需要創建索引的情況:
- 主鍵自動建立唯一索引;
- 頻繁作為查詢條件的字段;
- 查詢與其它表關聯的字段,外鍵關系建立索引;
- 查詢中排序的字段(通過索引訪問將大大提高排序速度);
- 查詢中統計或分組的字段。
不需要創建索引的情況:
- 表記錄太少;
- 經常增刪改的表;
- 頻繁更新的字段;
- where條件里用不到的字段;
- 數據重復且分布平均的字段
21、explain關鍵字
id:選擇標識符;select_type:查詢的類型;table:輸出結果集的表;type:表的連接類型;possible_keys:可能使用的索引;key:實際使用的索引;key_len:索引字段的長度;ref:列與索引的比較;rows:掃描出的行數;extra:執行情況的描述和說明。
22、索引優化思路
開啟慢查詢日志設置閾值;explain做慢SQL分析。
查詢截取分析:using filesort效率低,using index效率高;最左前綴原則
23、索引創建規則
最左前綴匹配原則:mysql會一直向右匹配指導遇到范圍查詢(betwee、like)就停止查詢;選擇區分度高的列作為索引;選擇唯一性索引;盡量使用數據量少的索引;盡量使用前綴來索引;索引列不能參與計算;盡量的擴展索引不要新建索引;限制索引的數目。
24、索引過多的問題
一般一個表對應5個索引左右,索引過多會導致:查找數據變慢;對insert語句影響很大,尤其是無序插入;刪除數據多的情況下索引也需要更新;索引文件過大,占用存儲空間,尋址的查詢時間長;mysql優化器需要評估更多的組合。
25、數據庫數據導入與索引建立的順序
數據庫插入大量數據時需要先刪除索引,插入完成后在重建索引,索引會影響插入數據的速度,因此先導入數據再插入索引。
26、MySQL調優
合理添加索引;做索引的列不包含null值;用復合索引代替單索引;使用短索引;減少模糊掃描like和not in;讀寫分離;redis緩存;limit分頁機制。
27、MySQL主從復制
什么是主從復制
主從復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;
主從復制的作用
實時災備,用於故障切換;架構擴展,提升機器性能;讀寫分離,避免影響業務
主從復制的原理
數據庫有個bin-log二進制文件,記錄了所有sql語句。
目標就是把主數據庫的bin-log文件的sql語句復制過來。
使其在從數據庫的relay-log重做日志文件中再執行一次這些sql語句即可。
主從復制配置具體需要三個線程:
- binlog輸出線程:每當有從庫連接到主庫的時候,主庫都會創建一個線程然后發送binlog內容到從庫。在從庫里,當復制開始的時候,從庫就會創建以下兩個線程進行處理。
- 從庫I/O線程:當START SLAVE語句在從庫開始執行之后,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog里面的更新記錄到從庫上。從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。
- 從庫SQL線程:從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。
對於每一個主從復制的連接,都有三個線程。擁有多個從庫的主庫為每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。
非關系型數據庫Redis
28、緩存
緩存就是數據交換的緩沖區,當硬件要讀取數據時首先在緩存中查找,不存在時從內存中查找。緩存查找比內存查找更快。
緩存在不同場景下的應用:磁盤緩存——減少磁盤的機械操作;數據庫緩存——減少對數據庫的訪問(redis)。客戶端瀏覽器緩存——減少瀏覽器對服務器的訪問。
數據庫緩存的用處在於應對慢查詢,環境數據庫壓力,適用於高性能高並發並且對實時性要求不高的場景。
緩存失效的策略:FIFO(先進先出,根據存儲的時間進行淘汰),LRU(最近最少使用,根據使用時間淘汰最遠的數據)、LFU(最不經常使用,根據使用頻率進行淘汰)。
29、redis簡介
簡介:非關系型數據庫,廣泛應用於緩存方向,提供了String(key-value類型,計數器)、List(鏈表,粉絲列表/消息列表)、Hash(底層hashtable,key是key,value可以看作是一個map,用於存儲個人信息)、Set(底層是hashtable,可以實現交並差集操作,用於記錄共同關注/共同喜好)以及ZSet(常用於排行榜)數據類型支持不同的場景業務。redis支持事務、持久化、集群等。
為什么用:高性能及高並發場景、減少數據庫訪問壓力等。
與Memcached的區別:redis支持更豐富的數據類型,后者僅支持string;redis支持持久化(RDB和AOF),后者不支持;redis具有半事務支持(MULTI開啟事務,EXEC執行事務塊,DISCARD清空事務隊列,WATCH監視),后者不支持;redis支持集群,可以進行主從復制進行數據備份,后者不可以;redis是單線程的,后者是多線程的。
內存淘汰策略:1)volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰;2)volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰;3)volatile-random:從已設置過期時間的數據集中任意挑選數據淘汰;4)allkeys-lru:從所有數據集中選擇最近最少使用的數據淘汰;5)allkeys-random:從所有數據集中隨機選擇數據淘汰;6)no-eviction:禁止淘汰數據。7)4.0版本后新增volatile-lfu和allkeys-lfu。
持久化:RDB快照:將某個時間點的所有數據都存放到硬盤上;AOF快照:將寫命令添加到AOF文件末尾。使用AOF持久化需要設置同步選項,從而確保寫命令何時會同同步到磁盤文件上。AOF比RDB更新頻率高,優先使用AOF;AOF比RDB更安全;RDB性能比AOF好;優先加載AOF。
30、redis的問題及解決辦法
緩存穿透:大量請求的key不存在於緩存中,導致請求直接到了數據庫上,沒有經過緩存這一層。采用布隆過濾器可以解決這個問題。將可能存在請求的key放在布隆過濾器,當有非法key訪問時,先判斷是否再布隆過濾器存在,不存在直接返回參數錯誤信息。
緩存雪崩:緩存同一時間大面積失效,后面的請求都落在數據庫上,造成數據庫短時間承受大量請求而崩掉。解決辦法:1)事前:盡量保證整個redis集群的高可用性,發現有機器宕掉后盡快補上。同時選擇合適的淘汰策略;2)事中:本地encache緩存+hystrix限流&降級,避免MySQL崩掉;3)事后:利用redis持久化機制恢復緩存。
緩存擊穿:過於熱點的數據在緩存過期的瞬間,數據庫會被過量訪問。解決方法:1)設置熱點數據永不過期;2)加互斥鎖。
一致性:讀請求和寫請求串行化,串到一個內存隊列中,保證雙寫一致性,但會系統導致吞吐量下降。延時雙刪保證一致性,先刪除緩存,然后更新數據,再延時n ms后刪除緩存。
部分情景題
31、微服務設計模式
聚合器微服務設計模式、代理微服務設計模式、分支微服務設計模式、鏈式微服務設計模式、數據共享微服務設計模式、異步消息傳遞微服務設計模式
32、Spring的優點
輕量:大小和開銷都是輕量的,非侵入式,即對象不依賴於Spring特定類;控制反轉(IOC):將所有對象的創建和依賴關系的維護工作都交給IOC容器來管理,大大的降低了組件之間的耦合性;面向切面(AOP):把將一些通用任務,如安全、事物、日志等進行集中式處理,從而提高了程序的復用性;方便集成各種優秀框架,如MyBatis、Hibernate等;方便程序測試,提供可對Junit4的支持;支持聲明式事務處理,通過配置文件就可以完成對事務的管理,無須手動編程。
33、Springboot的優點
創建獨立的Spring應用程序;嵌入的Tomcat,無序部署war文件;簡化配置;自動配置Spring;快速整合第三方框架;能夠於Spring生態的Spring JDBC、Spring Security等快速整合;提高了開發效率。
34、系統架構風格以及優缺點
1)單體架構
介紹:把系統中所用的功能、模塊耦合在一個應用中的架構方式。特點:打包成一個獨立的單元(一個jar包或者war包),以進程的方式來運行。
優點:項目易於管理,部署簡單。
缺點:測試成本高、可伸縮性差、可靠性差、迭代困難、跨語言程度差、團隊協作難。
2)MVC架構
介紹:MVC是模型(Model)、視圖(View)和控制器(Controller)。Model,主要是數據、業務邏輯和業務規則;View的目的在於提供與用戶交互的界面;Contorller指的是控制器,主要負責與model和view打交道。
優點:MVC三層各司其職、互不干涉;有利於開發中的分工;有利於組件的重用。
缺點:增加了系統結構和實現的復雜性;View和Controller鍵連接過於緊密;View對Model數據的訪問效率低。
3)面向服務架構(SOA)
介紹:SOA是一個組件模型,將應用程序拆分為不同功能單元(稱為服務),通過這些服務間定義良好的接口和契約聯系起來,使得構建在各種系統中的服務可以以一種同一和通用的方式進行交互。特點在於系統由多個服務組成,每個服務可以單獨部署,每個服務內部室高內聚的,外部是低耦合的。
優點:測試容易、可伸縮性強、可靠性強、迭代容易、跨語言程度更靈活、團隊協作容易。
缺點:服務部署過多導致運維成本高;分布式系統的復雜性等。
4)微服務架構
介紹:微服務架構可以說是更加細膩化的SOA,如果說SOA是粗粒度的划分,那么微服務的划分粒度更小,更加精確,SOA可以說由多個微服務組成。
優點同SOA,另外服務划分更加細致;缺點同上。
35、系統安全架構包括
基礎設施安全、應用系統安全(sql注入、xss攻擊等)、數據保密安全(存儲安全、傳輸安全)
36、系統性能下降的原因及解決方法
硬件升級無法滿足大數據流量情況下,系統性能下降的原因:
服務器超載、帶寬瓶頸、傳輸距離遙遠
解決方法:
分布式消息隊列、服務器集群、redis緩存、cdn節點、數據庫讀寫分離
37、從數據庫設計和軟件性能改善高並發訪問
庫表散列、優化索引、存儲過程、讀寫分離、redis緩存、消息隊列
38、針對高並發訪問設計新的架構
HTML靜態化、cdn節點、圖片服務器分離、服務器集群、數據庫集群、ngnix反向代理做負載均衡