巨爲科技 JAVA 崗面試題

這是本人在公司面試時遇到的面試題,十分具備表明性,但願可以給與各位一些借鑑,在學習的路上少走彎路。。。html

1. java 中 sleep 方法和 wait 方法的區別?前端

首先sleep方法來自Thread類,線程進入sleep方法後不會釋放自身的鎖,sleep能夠在任何地方使用,並且必需要捕獲異常,因爲sleep方法屬於Thread類中方法,表示讓一個線程進入睡眠狀態,等待必定的時間以後,自動醒來進入到可運行狀態,不會立刻進入運行狀態,由於線程調度機制恢復線程的運行也是須要時間的。java

wait是object類中的方法,線程進入wait方法後會釋放自身的鎖,使得其餘線程能夠使用同步控制塊或者方法,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,並且wait,notify和notifyAll不須要捕獲異常 ,wait屬於Object的成員方法,一旦一個對象調用了wait方法,必需要採用notify()和notifyAll()方法喚醒該進程;若是線程擁有某個或某些對象的同步鎖,那麼在調用了wait()後,這個線程就會釋放它持有的全部同步資源,而不限於這個被調用了wait()方法的對象。 mysql

2.Java Object 類中有哪些方法?linux

 1.clone方法web

保護方法,實現對象的淺複製,只有實現了Cloneable接口才能夠調用該方法,不然拋出CloneNotSupportedException異常。面試

2.getClass方法

final方法,得到運行時類型。redis

3.toString方法

該方法用得比較多,通常子類都有覆蓋。算法

4.finalize方法

該方法用於釋放資源。由於沒法肯定該方法何時被調用,不多使用。spring

5.equals方法

該方法是很是重要的一個方法。通常equals和==是不同的,可是在Object中二者是同樣的。子類通常都要重寫這個方法。

6.hashCode方法

該方法用於哈希查找,重寫了equals方法通常都要重寫hashCode方法。這個方法在一些具備哈希功能的Collection中用到。

通常必須知足obj1.equals(obj2)==true。能夠推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不過爲了提升效率,應該儘可能使上面兩個條件接近等價。

7.wait方法

wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具備該對象的鎖。wait()方法一直等待,直到得到鎖或者被中斷。wait(longtimeout)設定一個超時間隔,若是在規定時間內沒有得到鎖就返回。

調用該方法後當前線程進入睡眠狀態,直到如下事件發生。

(1)其餘線程調用了該對象的notify方法。

(2)其餘線程調用了該對象的notifyAll方法。

(3)其餘線程調用了interrupt中斷該線程。

(4)時間間隔到了。

此時該線程就能夠被調度了,若是是被中斷的話就拋出一個InterruptedException異常。

8.notify方法

該方法喚醒在該對象上等待的某個線程。

9.notifyAll方法

該方法喚醒在該對象上等待的全部線程。

3.Java char 類型佔幾個字節?能存儲一個漢字?

,java中的一個char的確是2個字節。java採用unicode,2個字節來表示一個字符

一個數字英文漢字都是一個字符,只不過數字和英文時,存儲的2個字節的第一個字節都爲0,就是浪費了點空間。存漢字就佔滿了2個字節。

4.B 繼承 A,C 繼承 B,咱們能 B 轉換爲 C 麼?如 C=(C)B;

能夠,這屬於強制類型轉換,若是被轉換的B實例不是C類型,會有異常

5. 你經常使用的設計模式都有哪些?

1、Singleton,單例模式:保證一個類只有一個實例,並提供一個訪問它的全局訪問點
2、Abstract Factory,抽象工廠:提供一個建立一系列相關或相互依賴對象的接口,而無須指定它們的具體類。
3、Factory Method,工廠方法:定義一個用於建立對象的接口,讓子類決定實例化哪個類,Factory Method使一個類的實例化延遲到了子類。
4、Builder,建造模式:將一個複雜對象的構建與他的表示相分離,使得一樣的構建過程能夠建立不一樣的表示。
5、Prototype,原型模式:用原型實例指定建立對象的種類,而且經過拷貝這些原型來建立新的對象。
行爲型有:
6、Iterator,迭代器模式:提供一個方法順序訪問一個聚合對象的各個元素,而又不須要暴露該對象的內部表示。
7、Observer,觀察者模式:定義對象間一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知自動更新。
8、Template Method,模板方法:定義一個操做中的算法骨架,而將一些步驟延遲到子類中,TemplateMethod使得子類能夠不改變一個算法的結構便可以重定義該算法得某些特定步驟。
9、Command,命令模式:將一個請求封裝爲一個對象,從而使你能夠用不一樣的請求對客戶進行參數化,對請求排隊和記錄請求日誌,以及支持可撤銷的操做。
10、State,狀態模式:容許對象在其內部狀態改變時改變他的行爲。對象看起來彷佛改變了他的類。
11、Strategy,策略模式:定義一系列的算法,把他們一個個封裝起來,並使他們能夠互相替換,本模式使得算法能夠獨立於使用它們的客戶。
12、China of Responsibility,職責鏈模式:使多個對象都有機會處理請求,從而避免請求的送發者和接收者之間的耦合關係
十3、Mediator,中介者模式:用一箇中介對象封裝一些列的對象交互。
十4、Visitor,訪問者模式:表示一個做用於某對象結構中的各元素的操做,它使你能夠在不改變各元素類的前提下定義做用於這個元素的新操做。
十5、Interpreter,解釋器模式:給定一個語言,定義他的文法的一個表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
十6、Memento,備忘錄模式:在不破壞對象的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。
結構型有:
十7、Composite,組合模式:將對象組合成樹形結構以表示部分總體的關係,Composite使得用戶對單個對象和組合對象的使用具備一致性
十8、Facade,外觀模式:爲子系統中的一組接口提供一致的界面,fa?ade提供了一高層接口,這個接口使得子系統更容易使用。
十9、Proxy,代理模式:爲其餘對象提供一種代理以控制對這個對象的訪問
二10、Adapter,適配器模式:將一類的接口轉換成客戶但願的另一個接口,Adapter模式使得本來因爲接口不兼容而不能一塊兒工做那些類能夠一塊兒工做。
二11、Decrator,裝飾模式:動態地給一個對象增長一些額外的職責,就增長的功能來講,Decorator模式相比生成子類更加靈活。
二12、Bridge,橋模式:將抽象部分與它的實現部分相分離,使他們能夠獨立的變化。
二十3、Flyweight,享元模式

6. 你對分佈式的理解?

分佈式架構下系統間交互的5種通訊模式

request/response模式(同步模式):客戶端發起請求一直阻塞到服務端返回請求爲止。

Callback(異步模式):客戶端發送一個RPC請求給服務器,服務端處理後再發送一個消息給消息發送端提供的callback端點,此類狀況很是合適如下場景:A組件發送RPC請求給B,B處理完成後,須要通知A組件作後續處理。

Future模式:客戶端發送完請求後,繼續作本身的事情,返回一個包含消息結果的Future對象。客戶端須要使用返回結果時,使用Future對象的.get(),若是此時沒有結果返回的話,會一直阻塞到有結果返回爲止。

Oneway模式:客戶端調用完繼續執行,無論接收端是否成功。

Reliable模式:爲保證通訊可靠,將藉助於消息中心來實現消息的可靠送達,請求將作持久化存儲,在接收方在線時作送達,並由消息中心保證異常重試。

分佈式系統(distributed system)是創建在網絡之上的軟件系統。正是由於軟件特性,因此分佈式系統具備高度的內聚性和透明性。所以,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操做系統),而不是硬件。內聚性是指每個數據庫分佈節點高度自治,有本地的數據庫管理系統。透明性是指每個數據庫分佈節點對用戶的應用來講都是透明的,看不出是本地仍是遠程。在分佈式數據庫系統中,用戶感受不到數據是分佈的,即用戶不須知道關係是否分割、有無複本、數據存於哪一個站點以及事務在哪一個站點上執行等。

故名思義,分佈式系統就是將系統的應用層數據層或其它部分構架成分佈(物理和邏輯上的均可以)狀(一般是網狀)。分佈式系統一般是爲了加強系統的可擴展性穩定性和執行效率。好比在線遊戲一般就是分佈系統,裏面所謂的「區」就是分佈系統裏子例程。而分佈式數據庫其實也能夠稱做分佈式系統,數據持久化層是分佈的(數據存在不一樣的數據庫中,可交互,有一套綜管系統來維護數據的完整性和準確性)。
因此說分佈式系統更準確地說是一種系統構架概念,不是一種技術。

7.Servlet 都有哪些方法

HttpServlet 類包含 init() 、 destroy() 、 service() 等方法。其中 init() 和 destroy() 方法是繼承的。

8. 描述 List,Set,Map 和 Queue 的線程安全性
Set集合:
1) HashSet的性能老是比TreeSet好(特別是最經常使用的添加、查詢元素等操做),由於TreeSet須要額外的紅黑樹算法來維護集合元素的次序。只有當須要一個保持排序的Set時,才應該使用TreeSet,不然都應該使用HashSet
2) 對於普通的插入、刪除操做,LinkedHashSet比HashSet要略慢一點,這是由維護鏈表所帶來的開銷形成的。不過,由於有了鏈表的存在,遍歷LinkedHashSet會更快
3) EnumSet是全部Set實現類中性能最好的,但它只能保存同一個枚舉類的枚舉值做爲集合元素
4) HashSet、TreeSet、EnumSet都是"線程不安全"的,一般能夠經過Collections工具類的synchronizedSortedSet方法來"包裝"該Set集合。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
List集合:
1. java提供的List就是一個"線性表接口",ArrayList(基於數組的線性表)、LinkedList(基於鏈的線性表)是線性表的兩種典型實現
2. Queue表明了隊列,Deque表明了雙端隊列(既能夠做爲隊列使用、也能夠做爲棧使用)
3. 由於數組以一塊連續內存來保存全部的數組元素,因此數組在隨機訪問時性能最好。因此的內部以數組做爲底層實現的集合在隨機訪問時性能最好。
4. 內部以鏈表做爲底層實現的集合在執行插入、刪除操做時有很好的性能
5. 進行迭代操做時,以鏈表做爲底層實現的集合比以數組做爲底層實現的集合性能好
Map集合:
1) HashMap和Hashtable的效率大體相同,由於它們的實現機制幾乎徹底同樣。但HashMap一般比Hashtable要快一點,由於Hashtable須要額外的線程同步控制
2) TreeMap一般比HashMap、Hashtable要慢(尤爲是在插入、刪除key-value對時更慢),由於TreeMap底層採用紅黑樹來管理key-value對
3) 使用TreeMap的一個好處就是: TreeMap中的key-value對老是處於有序狀態,無須專門進行排序操做

3) Queue

Queue用於模擬"隊列"這種數據結構(先進先出 FIFO)。隊列的頭部保存着隊列中存放時間最長的元素,隊列的尾部保存着隊列中存放時間最短的元素。新元素插入(offer)到隊列的尾部,訪問元素(poll)操做會返回隊列頭部的元素,隊列不容許隨機訪問隊列中的元素。結合生活中常見的排隊就會很好理解這個概念

9.SpringMVC 的工做原理

SpringMVC流程

一、  用戶發送請求至前端控制器DispatcherServlet。

二、  DispatcherServlet收到請求調用HandlerMapping處理器映射器。

三、  處理器映射器找到具體的處理器(能夠根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。

四、  DispatcherServlet調用HandlerAdapter處理器適配器。

五、  HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。

六、  Controller執行完成返回ModelAndView。

七、  HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。

八、  DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。

九、  ViewReslover解析後返回具體View。

十、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

十一、 DispatcherServlet響應用戶。

10. Spring 事物傳播行爲都有哪些?並說下每一個傳播行爲的區別。

spring事物的傳播行爲

 

1.spring事物的傳播行爲,主要是用來解決業務層擁有事物的方法,相互調用的問題。

2.聲明事物,

在代碼執行前,開啓事務。代碼執行完,提交事務

3.spring並無提供事務具體的處理,而只是調用orm框架的事務,connection的事務。

spring只是對底層事務作了一層封裝。

4.spring對事務管理主要用了三個APi。PlatformTransactionManager ,TransactionDefinition,和TransactionStatus。

spring對TransactionManager不一樣的orm框架進行了不一樣的實現,如hibernate TransactionManager,DatasourceTransactionManager。

 不一樣的transactionManager實現。

5.TransactionDefiniton定義了事務具體的定義,如傳播狀態,隔離級別,和是否只讀。

11. Redis 支持的數據類型

一、string(字符串)

二、hash(哈希)

  Redis hash 是一個鍵值(key=>value)對集合。
  Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。

三、list(列表)

  Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

四、set(集合)

  Redis的Set是string類型的無序集合。

五、zset(sorted set:有序集合)

  Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
  不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
  zset的成員是惟一的,但分數(score)卻能夠重複。

12. Redis 經常使用命令

清空Redis全部key:
flush db # 清除當前數據庫的全部keys
flush all # 清除全部數據庫的全部keys
查詢匹配key:
keys * # 查看全部keys
keys prefix_* # 查看前綴爲"prefix_"的全部keys
key基本操做:
exists key # 確認一個key是否存在
set key value # 設置key和value
get key # 獲取key的value
del key # 刪除一個key
type key # 返回值的類型
keys pattern # 返回知足給定pattern的全部key
random key # 隨機返回key空間的一個
key rename oldname newname # 重命名key
db size # 返回當前數據庫中key的數目
select index # 選擇第0~15中

 
 

什麼是應用服務雪崩?

雪崩問題

分佈式系統都存在這樣一個問題,因爲網絡的不穩定性,決定了任何一個服務的可用性都不是 100% 的。當網絡不穩定的時候,做爲服務的提供者,自身可能會被拖死,致使服務調用者阻塞,最終可能引起雪崩連鎖效應。

緩存雪崩

當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(好比DB)帶來很大壓力,形成數據庫後端故障,從而引發應用服務器雪崩。

雪崩效應產生的幾種場景

 

流量激增:好比異常流量、用戶重試致使系統負載升高;

緩存刷新:假設A爲client端,B爲Server端,假設A系統請求都流向B系統,請求超出了B系統的承載能力,就會形成B系統崩潰;

程序有Bug:代碼循環調用的邏輯問題,資源未釋放引發的內存泄漏等問題;

硬件故障:好比宕機,機房斷電,光纖被挖斷等。

數據庫嚴重瓶頸,好比:長事務、sql超時等。

線程同步等待:系統間常常採用同步服務調用模式,核心服務和非核心服務共用一個線程池和消息隊列。若是一個核心業務線程調用非核心線程,這個非核心線程交由第三方系統完成,當第三方系統自己出現問題,致使核心線程阻塞,一直處於等待狀態,而進程間的調用是有超時限制的,最終這條線程將斷掉,也可能引起雪崩;

緩存雪崩的解決方案

緩存失效的幾種狀況:

一、緩存服務器掛了

二、高峯期緩存局部失效

三、熱點緩存失效

解決方案:

 

一、避免緩存集中失效,不一樣的key設置不一樣的超時時間

二、增長互斥鎖,控制數據庫請求,重建緩存。

三、提升緩存的HA,如:redis集羣。

雪崩的總體解決方案

通常狀況對於服務依賴的保護主要有3種解決方案:

 

(1)熔斷模式

這種模式主要是參考電路熔斷,若是一條線路電壓太高,保險絲會熔斷,防止火災。放到咱們的系統中,若是某個目標服務調用慢或者有大量超時,此時,熔斷該服務的調用,對於後續調用請求,不在繼續調用目標服務,直接返回,快速釋放資源。若是目標服務狀況好轉則恢復調用。

重點監控的機器性能指標

cpu(Load) cpu使用率/負載

memory 內存

mysql監控長事務(這裏與sql查詢超時是緊密結合的,須要重點監控)

sql超時

線程數等

總之,除了cpu、內存、線程數外,重點監控數據庫端的長事務、sql超時等,絕大多數應用服務器發生的雪崩場景,都是來源於數據庫端的性能瓶頸,從而先引發數據庫端大量瓶頸,最終拖累應用服務器也發生雪崩,最後就是大面積的雪崩。

(2)隔離模式

這種模式就像對系統請求按類型劃分紅一個個小島的同樣,當某個小島被火少光了,不會影響到其餘的小島。

例如能夠對不一樣類型的請求使用線程池來資源隔離,每種類型的請求互不影響,若是一種類型的請求線程資源耗盡,則對後續的該類型請求直接返回,再也不調用後續資源。這種模式使用場景很是多,例如將一個服務拆開,對於重要的服務使用單獨服務器來部署,再或者公司最近推廣的多中心。

(3)限流模式

上述的熔斷模式和隔離模式都屬於出錯後的容錯處理機制,而限流模式則能夠稱爲預防模式。限流模式主要是提早對各個類型的請求設置最高的QPS閾值,若高於設置的閾值則對該請求直接返回,再也不調用後續資源。這種模式不能解決服務依賴的問題,只能解決系統總體資源分配問題,由於沒有被限流的請求依然有可能形成雪崩效應。

熔斷設計

在熔斷的設計主要參考了hystrix的作法。其中最重要的是三個模塊:熔斷請求判斷算法、熔斷恢復機制、熔斷報警

(1)熔斷請求判斷機制算法:使用無鎖循環隊列計數,每一個熔斷器默認維護10個bucket,每1秒一個bucket,每一個blucket記錄請求的成功、失敗、超時、拒絕的狀態,默認錯誤超過50%且10秒內超過20個請求進行中斷攔截。

(2)熔斷恢復:對於被熔斷的請求,每隔5s容許部分請求經過,若請求都是健康的(RT<250ms)則對請求健康恢復。

(3)熔斷報警:對於熔斷的請求打日誌,異常請求超過某些設定則報警。

隔離設計

隔離的方式通常使用兩種

(1)線程池隔離模式:使用一個線程池來存儲當前的請求,線程池對請求做處理,設置任務返回處理超時時間,堆積的請求堆積入線程池隊列。這種方式須要爲每一個依賴的服務申請線程池,有必定的資源消耗,好處是能夠應對突發流量(流量洪峯來臨時,處理不完可將數據存儲到線程池隊裏慢慢處理)

(2)信號量隔離模式:使用一個原子計數器(或信號量)來記錄當前有多少個線程在運行,請求來先判斷計數器的數值,若超過設置的最大線程個數則丟棄改類型的新請求,若不超過則執行計數操做請求來計數器+1,請求返回計數器-1。這種方式是嚴格的控制線程且當即返回模式,沒法應對突發流量(流量洪峯來臨時,處理的線程超過數量,其餘的請求會直接返回,不繼續去請求依賴的服務)

超時機制設計

(1)超時分兩種,一種是請求的等待超時,一種是請求運行超時。

(2)等待超時:在任務入隊列時設置任務入隊列時間,並判斷隊頭的任務入隊列時間是否大於超時時間,超過則丟棄任務。

(3)運行超時:直接可以使用線程池提供的get方法。

如何提早發現雪崩

就是首先讓系統不雪崩,而後經過監控發現請求正在接近或者超過閥值,而後再根據具體狀況處理,這個接近或者超過閥值的過程,能夠稱爲 「提早發現雪崩」。

以上就是應用服務雪崩的場景以及技術方案總結。

 
 
 
15. 經常使用的 MYSQL 優化有哪些?
、配置優化
配置的優化其實包含兩個方面的:操做系統內核的優化和mysql配置文件的優化
1)系統內核的優化對專用的mysql服務器來講,無非是內存實用、鏈接數、超時處理、TCP處理等方面的優化,根據本身的硬件配置來進行優化,這裏很少講;
2)mysql配置的優化,通常來講包含:IO處理的經常使用參數、最大鏈接數設置、緩存使用參數的設置、慢日誌的參數的設置、innodb相關參數的設置等,若是有主從關係在設置主從同步的相關參數便可,網上的相關配置文件不少,大同小異,經常使用的設置大多修改這些差很少就夠用了。
二、 sql語句的優化
一、 儘可能稍做計算
Mysql的做用是用來存取數據的,不是作計算的,作計算的話能夠用其餘方法去實現,mysql作計算是很耗資源的。

2.儘可能少 join

MySQL 的優點在於簡單,但這在某些方面其實也是其劣勢。MySQL 優化器效率高,可是因爲其 統計信息的量有限,優化器工做過程出現誤差的可能性也就更多。對於複雜的多表 Join,一方面因爲其優化器受限,再者在 Join 這方面所下的功夫還不夠,因此性能表現離 Oracle 等關係型數據庫前輩仍是有必定距離。但若是是簡單的單表查詢,這一差距就會極小甚至在有些場景下要優於這些數據庫前輩。

3.儘可能少排序

  排序操做會消耗較多的 CPU 資源,因此減小排序能夠在緩存命中率高等 IO 能力足夠的場景下會較大影響 SQL的 響應時間
  對於MySQL來講,減小排序有多種辦法,好比:
  經過利用索引來排序的方式進行優化
  減小參與排序的記錄條數
  非必要不對數據進行排序

4.儘可能避免 select *

  在數據量少而且 訪問量不大的狀況下,select * 沒有什麼影響,可是量級達到必定級別的時候,在執行效率和IO資源的使用上,仍是有很大關係的,用什麼字段取什麼字段,減小沒必要要的資源浪費。
以前遇到過由於一個字段存儲的數據比較大,併發高的狀況下把網絡帶寬跑滿的狀況,形成網站打不開或是打開速度極慢的狀況。

5.儘可能用 join 代替子查詢

  雖然 Join 性能並不佳,可是和 MySQL 的子查詢比起來仍是有很是大的性能優點。MySQL 的子查詢執行計劃一直存在較大的問題,雖然這個問題已經存在多年,可是到目前已經發布的全部穩定版本中都廣泛存在,一直沒有太大改善。雖然官方也在很早就認可這一問題,而且承諾儘快解決,可是至少到目前爲止咱們尚未看到哪個版本較好的解決了這一問題。

6.儘可能少 or

  當 where 子句中存在多個條件以「或」並存的時候,MySQL 的優化器並無很好的解決其執行計劃優化問題,再加上 MySQL 特有的 SQL 與 Storage 分層架構方式,形成了其性能比較低下,不少時候使用 union all 或者是union(必要的時候)的方式來代替「or」會獲得更好的效果。

7.儘可能用 union all 代替 union

union 和 union all 的差別主要是前者須要將兩個(或者多個)結果集合並後再進行惟一性過濾操做,這就會涉及到排序,增長大量的 CPU 運算,加大資源消耗及延遲。因此當咱們能夠確認不可能出現重複結果集或者不在意重複結果集的時候,儘可能使用 union all 而不是 union。

8.儘可能早過濾

  這一優化策略其實最多見於索引的優化設計中(將過濾性更好的字段放得更靠前)。

  在 SQL 編寫中一樣能夠使用這一原則來優化一些 Join 的 SQL。好比咱們在多個表進行分頁數據查詢的時候,咱們最好是可以在一個表上先過濾好數據分好頁,而後再用分好頁的結果集與另外的表 Join,這樣能夠儘量多的減小沒必要要的 IO 操做,大大節省 IO 操做所消耗的時間。

9.避免類型轉換

  這裏所說的「類型轉換」是指 where 子句中出現 column 字段的類型和傳入的參數類型不一致的時候發生的類型轉換:
A:人爲在column_name 上經過轉換函數進行轉換
  直接致使 MySQL(實際上其餘數據庫也會有一樣的問題)沒法使用索引,若是非要轉換,應該在傳入的參數上進行轉換
B:由數據庫本身進行轉換
  若是咱們傳入的數據類型和字段類型不一致,同時咱們又沒有作任何類型轉換處理,MySQL 可能會本身對咱們的數據進行類型轉換操做,也可能不進行處理而交由 存儲引擎去處理,這樣一來,就會出現索引沒法使用的狀況而形成執行計劃問題。
以上兩種狀況在開發者由於某種緣由常常會有,原本能夠用到索引的結果類型不對沒有用到索引,或是由於類型不對又有越界的狀況發生形成沒法使用索引的狀況,結果形成很嚴重的事故。

10.優先優化高併發的 SQL,而不是執行頻率低某些「大」SQL

  對於破壞性來講,高併發的 SQL 老是會比低頻率的來得大,由於高併發的 SQL 一旦出現問題,甚至不會給咱們任何喘息的機會就會將系統壓跨。而對於一些雖然須要消耗大量 IO 並且響應很慢的 SQL,因爲頻率低,即便遇到,最多就是讓整個系統響應慢一點,但至少可能撐一下子,讓咱們有緩衝的機會。

11.從全局出發優化,而不是片面調整

SQL 優化不能是單獨針對某一個進行,而應充分考慮系統中全部的 SQL,尤爲是在經過調整索引優化 SQL 的執行計劃的時候,千萬不能顧此失彼,因小失大。

12.儘量對每一條運行在數據庫中的SQL進行 explain

優化 SQL,須要作到心中有數,知道SQL 的執行計劃才能判斷是否有優化餘地,才能判斷是否存在執行計劃問題。在對數據庫中運行的 SQL 進行了一段時間的優化以後,很明顯的問題 SQL 可能已經不多了,大多都須要去發掘,這時候就須要進行大量的 explain 操做收集執行計劃,並判斷是否須要進行優化。
 

問題一:

什麼是Spring Cloud?

Spring cloud流應用程序啓動器是基於Spring Boot的Spring集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。

 

問題二:

使用Spring Cloud有什麼優點?

使用Spring Boot開發分佈式微服務時,咱們面臨如下問題

  • 與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。

  • 服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該目錄中註冊服務,而後可以查找並鏈接到該目錄中的服務。

  • 冗餘-分佈式系統中的冗餘問題。

  • 負載平衡 --負載平衡改善跨多個計算資源的工做負荷,諸如計算機,計算機集羣,網絡鏈路,中央處理單元,或磁盤驅動器的分佈。

  • 性能-問題 因爲各類運營開銷致使的性能問題。

  • 部署複雜性-Devops技能的要求。

問題三:

服務註冊和發現是什麼意思?Spring Cloud如何實現?

當咱們開始一個項目時,咱們一般在屬性文件中進行全部的配置。隨着愈來愈多的服務開發和部署,添加和修改這些屬性變得更加複雜。有些服務可能會降低,而某些位置可能會發生變化。手動更改屬性可能會產生問題。 Eureka服務註冊和發現能夠在這種狀況下提供幫助。因爲全部服務都在Eureka服務器上註冊並經過調用Eureka服務器完成查找,所以無需處理服務地點的任何更改和處理。

 

問題四:

負載平衡的意義什麼?

在計算中,負載平衡能夠改善跨計算機,計算機集羣,網絡連接,中央處理單元或磁盤驅動器等多種計算資源的工做負載分佈。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間並避免任何單一資源的過載。使用多個組件進行負載平衡而不是單個組件可能會經過冗餘來提升可靠性和可用性。負載平衡一般涉及專用軟件或硬件,例如多層交換機或域名系統服務器進程。

 

問題五:

什麼是Hystrix?它如何實現容錯? 

 Hystrix是一個延遲和容錯庫,旨在隔離遠程系統,服務和第三方庫的訪問點,當出現故障是不可避免的故障時,中止級聯故障並在複雜的分佈式系統中實現彈性。

一般對於使用微服務架構開發的系統,涉及到許多微服務。這些微服務彼此協做。 

思考如下微服務

 

假設若是上圖中的微服務9失敗了,那麼使用傳統方法咱們將傳播一個異常。但這仍然會致使整個系統崩潰。 

隨着微服務數量的增長,這個問題變得更加複雜。微服務的數量能夠高達1000.這是hystrix出現的地方 咱們將使用Hystrix在這種狀況下的Fallback方法功能。咱們有兩個服務employee-consumer使用由employee-consumer公開的服務。 

簡化圖以下所示 

 

如今假設因爲某種緣由,employee-producer公開的服務會拋出異常。咱們在這種狀況下使用Hystrix定義了一個回退方法。這種後備方法應該具備與公開服務相同的返回類型。若是暴露服務中出現異常,則回退方法將返回一些值。

 

問題六:

什麼是Hystrix斷路器?咱們須要它嗎? 

因爲某些緣由,employee-consumer公開服務會引起異常。在這種狀況下使用Hystrix咱們定義了一個回退方法。若是在公開服務中發生異常,則回退方法返回一些默認值。


17. 經常使用的 Liunx 命令






















  1. 1.uptime命令

    在Linux中,uptime命令顯示了你的系統運行了多久以及目前登陸的用戶有多少,另外還顯示了間隔1分鐘、5分鐘和15分鐘的負載平均值。

    # uptime 08:16:26 up 22 min,  1 user,  load average: 0.00, 0.03, 0.22

    檢查uptime版本

    除了uptime(正常運行時間)和version(版本)外,uptime命令沒有其餘選項。若是時間不到1天,它只給出hours:mins這種形式的信息。

    [tecmint@linuxprobe ~]$ uptime -V procps version 3.2.8

  2.  

    2.w命令

    該命令會顯示目前登陸的用戶及其進程,另外還會顯示負載平均值。此外,它還顯示了登陸名稱、tty名稱、遠程主機、登陸時間、閒置時間、JCPU、PCPU、命令和進程。

    # w 08:27:44 up 34 min,  1 user,  load average: 0.00, 0.00, 0.08 USER    TTY    FROM     LOGIN@   IDLE   JCPU   PCPU WHAT tecmint  pts/0    192.168.50.1     07:59    0.00s  0.29s  0.09s w 可用的選項 -h:不顯示標題。 -s:不顯示JCPU和PCPU。 -f:不顯示字段信息。 -V:(大寫V)-顯示版本。

  3.  

    3.users命令

    users命令顯示了目前已登陸的用戶,除了help(幫助)和version(版本)外,該命令沒有其餘參數。

    # users Tecmint

  4.  

    4.who命令

    who命令僅僅返回用戶名稱、日期、時間和主機信息;who命令相似w命令,不像w命令,who並不輸出用戶執行的操做這一信息,不妨具體看看who和w這兩個命令之間的區別。

    # who tecmint  pts/0        2010-09-18 07:59 (192.168.50.1)# w 08:43:58 up 50 min,  1 user,  load average: 0.64, 0.18, 0.06 USER    TTY    FROM    LOGIN@   IDLE   JCPU   PCPU WHAT tecmint  pts/0    192.168.50.1     07:59    0.00s  0.43s  0.10s w who命令的選項 -b:顯示上一次系統重啓日期和時間。 -r:顯示當前的運行級別。 -a,–all:顯示累積的全部信息。

  5.  

    5.whoami命令

    whoami命令輸出當前用戶的姓名;你還能夠使用「who am i」命令顯示當前用戶,若是你以根用戶身份使用sudo命令登陸,「whoami」命令返回根用戶是當前用戶,若是你想知道登陸的用戶具體是哪一個,使用「who am i」命令。

    # whoami tecmint

  6.  

    6.ls命令

    ls命令顯示了人類可讀格式的文件列表。

    # ls -l total 114 dr-xr-xr-x.   2 root root  4096 Sep 18 08:46 bin dr-xr-xr-x.   5 root root  1024 Sep  8 15:49 boot

    按照上一次修改時間排序文件。

    # ls -ltr total 40 -rw-r--r--. 1 root root  6546 Sep 17 18:42 install.log.syslog -rw-r--r--. 1 root root 22435 Sep 17 18:45 install.log -rw-------. 1 root root  1003 Sep 17 18:45 anaconda-ks.cfg

    7.crontab命令

    可以使用crontab命令和-l選項,列出當前用戶的計劃任務。

    # crontab -l 00 10 * * * /bin/ls >/ls.txt

    能夠使用-e選項編輯crontab,在下面例子中,將用VI編輯工具打開計劃任務,進行必要的更改,按:wq鍵退出,這會自動保存設置。

    # crontab -e

    8.less命令

    less命令容許快速查看文件;你能夠向上和向下翻頁,按「q」便可退出less窗口。

    # less install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch nstalling tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch

    9.more命令

    more命令容許快速查看文件,並以百分比的形式顯示詳細信息,你能夠向上和向下翻頁,按「q」便可退出more窗口。

    # more install.log Installing setup-2.8.14-10.el6.noarch warning: setup-2.8.14-10.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Installing filesystem-2.4.30-2.1.el6.i686 Installing ca-certificates-2010.63-3.el6.noarch Installing xml-common-0.6.3-32.el6.noarch Installing tzdata-2010l-1.el6.noarch Installing iso-codes-3.16-2.el6.noarch --More--(10%)

    10.cp命令

    將文件歷來源拷貝到目的地,保留同一種模式。

    # cp -p fileA fileB

    覆蓋文件以前系統會提示你。

    # cp -i fileA fileB

    11.mv命令

    將fileA改名爲fileB; -i選項會在覆蓋前提示;若是文件已經存在,會要求予以確認。

    # mv -i fileA fileB

    12.cat命令

    cat命令用來同時查看多個文件。

    # cat fileA fileB

    要是某個文件在一個屏幕/頁面顯示不了,你能夠使用cat命令來合併more和less命令,查看文件內容。

    # cat install.log | less      or # cat install.log | more

    13.cd命令(切換目錄)

    藉助cd命令(切換目錄),它會進入到fileA目錄。

    # cd /fileA

    14.pwd命令(輸出工做目錄)

    pwd命令會返回當前的工做目錄。

    # pwd /root

    15.sort命令

    以升序排序一行行文本文件,若是使用-r選項,就會以降序排序。

    #sort fileA.txt #sort -r fileA.txt

    16.vi命令

    對大多數相似UNIX的操做系統而言,vi是最流行的文本編輯器,下面例子使用-R選項,打開只讀方式的文件,按「:q」便可退出vi窗口。

    # vi -R /etc/shadows

    17.ssh命令(安全外殼)

    ssh命令用來登陸入到遠程主機;好比說,下面這個ssh例子會使用用戶做爲narad,鏈接到主機(192.168.50.2)。

    # ssh narad@192.168.50.2

    想檢查ssh的版本,使用選項-V(大寫),便可顯示ssh的版本。

    # ssh -V OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 201

相關文章
相關標籤/搜索