大數(shù)據(jù)面試題(七)
421.列出除Singleton外的常用的3種設(shè)計模式,并簡單描述
答:工廠模式:工廠模式是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。
適配器模式:適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它結(jié)合了兩個獨立接口的功能。這種模式涉及到一個單一的類,該類負(fù)責(zé)加入獨立的或不兼容的接口功能。
模板模式:在模板模式中,一個抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實現(xiàn),但調(diào)用將以抽象類中定義的方式進行。
422.Action是單實例還是多實例,為什么?
答:struts2中action是多例的,即一個session產(chǎn)生一個action
背景:
1) Struts2會對每一個請求,產(chǎn)生一個Action的實例來處理.
2) Spring的Ioc容器管理的bean默認(rèn)是單實例的.
首先從數(shù)據(jù)安全性的問題上考慮,我們的Action應(yīng)該保證是多例的,這樣才不會出現(xiàn)數(shù)據(jù)問題。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一個來提高性能,這樣的話,就可以使用單例模式。
不過幸好,Spring的bean可以針對每一個設(shè)置它的scope,所以,上面的問題就不是問題了。如果用單例,就在spring的action bean配置的時候設(shè)置scope=”prototype”
如果是單例的話,若出現(xiàn)兩個用戶都修改一個對象的屬性值,則會因為用戶修改時間不同,兩個用戶訪問得到的屬性不一樣,操作得出的結(jié)果不一樣.
舉個例子:有一塊布長度300cm,能做一件上衣(用掉100cm)和一件褲子(用掉200cm);甲和乙同時訪問得到的長度都是300cm,
甲想做上衣和褲子,他先截取100cm去做上衣,等上衣做完再去做褲子,而乙這時正好也拿100cm去做上衣,那好,等甲做完上衣再做褲子的時候發(fā)現(xiàn)剩下的布(100cm)已經(jīng)不夠做褲子了…..這就是影響系統(tǒng)的性能,解決的辦法就是給甲和乙一人一塊300cm的布,就不會出現(xiàn)布被別人偷用的事情,也是就單實例和多實例的區(qū)別
如果設(shè)置成單例,那么多個線程會共享一個ActionContext和ValueStack,這樣并發(fā)訪問的時候就會出現(xiàn)問題了
struts 2的Action是多實例的并非單例,也就是每次請求產(chǎn)生一個Action的對象。原因是:struts 2的Action中包含數(shù)據(jù),例如你在頁面填寫的數(shù)據(jù)就會包含在Action的成員變量里面。如果Action是單實例的話,這些數(shù)據(jù)在多線程的環(huán)境下就會相互影響,例如造成別人填寫的數(shù)據(jù)被你看到了。所以Struts2的Action是多例模式的。
問題出現(xiàn)了,可以讓Struts2的action變成單例模式么?
Struts2中,可以使用注解開發(fā),在Action上@Scope(“prototype”) 指定為多例 , 默認(rèn)為singleton()單例)
基本上action的scope需要是prototype,就是每次請求都建立新的線程
不寫的話,默認(rèn)是singleton了
423.寫一個單例類
答:單例模式主要作用是保證在Java應(yīng)用程序中,一個類只有一個實例存在。下面給出兩種不同形式的單例:
第一種形式:餓漢式單例?

第二種形式:懶漢式單例

單例的特點:外界無法通過構(gòu)造器來創(chuàng)建對象,該類必須提供一個靜態(tài)方法向外界提供該類的唯一實例。
【補充】用Java進行服務(wù)器端編程時,使用單例模式的機會還是很多的,服務(wù)器上的資源都是很寶貴的,對于那些無狀態(tài)的對象其實都可以單例化或者靜態(tài)化(在內(nèi)存中僅有唯一拷貝),如果使用了spring這樣的框架來進行對象托管,Spring的IoC容器在默認(rèn)情況下對所有托管對象都是進行了單例化處理的。?
424.說說你所熟悉或聽說過的設(shè)計模式以及你對設(shè)計模式的看法
答:在GoF的《Design Patterns: Elements of Reusable Object-Oriented Software》中給出了三類(創(chuàng)建型[對類的實例化過程的抽象化]、結(jié)構(gòu)型[描述如何將類或?qū)ο蠼Y(jié)合在一起形成更大的結(jié)構(gòu)]、行為型[對在不同的對象之間劃分責(zé)任和算法的抽象化])共23種設(shè)計模式,包括:Abstract Factory(抽象工廠模式),Builder(建造者模式),F(xiàn)actory Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式);Facade(門面模式),Adapter(適配器模式),Bridge(橋梁模式),Composite(合成模式),Decorator(裝飾模式),F(xiàn)lyweight(享元模式),Proxy(代理模式);Command(命令模式),Interpreter(解釋器模式),Visitor(訪問者模式),Iterator(迭代子模式),Mediator(調(diào)停者模式),Memento(備忘錄模式),Observer(觀察者模式),State(狀態(tài)模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibility(責(zé)任鏈模式)。
所謂設(shè)計模式,就是一套被反復(fù)使用的代碼設(shè)計經(jīng)驗的總結(jié)(情境中一個問題經(jīng)過證實的一個解決方案)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計模式使人們可以更加簡單方便的復(fù)用成功的設(shè)計和體系結(jié)構(gòu)。將已證實的技術(shù)表述成設(shè)計模式也會使新系統(tǒng)開發(fā)者更加容易理解其設(shè)計思路。
【補充】設(shè)計模式并不是像某些地方吹噓的那樣是遙不可及的編程理念,說白了設(shè)計模式就是對面向?qū)ο蟮木幊淘瓌t的實踐,面向?qū)ο蟮木幊淘瓌t包括:
單一職責(zé)原則:一個類只做它該做的事情。(單一職責(zé)原則想表達的就是“高內(nèi)聚”,寫代碼最終極的原則只有六個字“高內(nèi)聚、低耦合”,就如同葵花寶典或辟邪劍譜的中心思想就八個字“欲練此功必先自宮”,所謂的高內(nèi)聚就是一個代碼模塊只完成一項功能,在面向?qū)ο笾?,如果只讓一個類完成它該做的事,而不涉及與它無關(guān)的領(lǐng)域就是踐行了高內(nèi)聚的原則,這個類就只有單一職責(zé)。我們都知道一句話叫“因為專注,所以專業(yè)”,一個對象如果承擔(dān)太多的職責(zé),那么注定它什么都做不好。這個世界上任何好的東西都有兩個特征,一個是功能單一,好的相機絕對不是電視購物里面賣的那種一個機器有一百多種功能的,它基本上只能照相;另一個是模塊化,好的自行車是組裝車,從減震叉、剎車到變速器,所有的部件都是可以拆卸和重新組裝的,好的乒乓球拍也不是成品拍,一定是底板和膠皮可以拆分和自行組裝的,一個好的軟件系統(tǒng),它里面的每個功能模塊也應(yīng)該是可以輕易的拿到其他系統(tǒng)中使用的,這樣才能實現(xiàn)軟件復(fù)用的目標(biāo)。)
開閉原則:軟件實體應(yīng)當(dāng)對擴展開放,對修改關(guān)閉。(在理想的狀態(tài)下,當(dāng)我們需要為一個軟件系統(tǒng)增加新功能時,只需要從原來的系統(tǒng)派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:①抽象是關(guān)鍵,一個系統(tǒng)中如果沒有抽象類或接口系統(tǒng)就沒有擴展點;②封裝可變性,將系統(tǒng)中的各種可變因素封裝到一個繼承結(jié)構(gòu)中,如果多個可變因素混雜在一起,系統(tǒng)將變得復(fù)雜而換亂,如果不清楚如何封裝可變性,可以參考《設(shè)計模式精解》一書中對橋梁模式的講解的章節(jié)。)
依賴倒轉(zhuǎn)原則:面向接口編程。(該原則說得直白和具體一些就是聲明方法的參數(shù)類型、方法的返回類型、變量的引用類型時,盡可能使用抽象類型而不用具體類型,因為抽象類型可以被它的任何一個子類型所替代,請參考下面的里氏替換原則。)
里氏替換原則:任何時候都可以用子類型替換掉父類型。(關(guān)于里氏替換原則的描述,Barbara Liskov女士的描述比這個要復(fù)雜得多,但簡單的說就是能用父類型的地方就一定能使用子類型。里氏替換原則可以檢查繼承關(guān)系是否合理,如果一個繼承關(guān)系違背了里氏替換原則,那么這個繼承關(guān)系一定是錯誤的,需要對代碼進行重構(gòu)。例如讓貓繼承狗,或者狗繼承貓,又或者讓正方形繼承長方形都是錯誤的繼承關(guān)系,因為你很容易找到違反里氏替換原則的場景。需要注意的是:子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當(dāng)成能力少的對象來用當(dāng)然沒有任何問題。)
接口隔離原則:接口要小而專,絕不能大而全。(臃腫的接口是對接口的污染,既然接口表示能力,那么一個接口只應(yīng)該描述一種能力,接口也應(yīng)該是高度內(nèi)聚的。例如,琴棋書畫就應(yīng)該分別設(shè)計為四個接口,而不應(yīng)設(shè)計成一個接口中的四個方法,因為如果設(shè)計成一個接口中的四個方法,那么這個接口很難用,畢竟琴棋書畫四樣都精通的人還是少數(shù),而如果設(shè)計成四個接口,會幾項就實現(xiàn)幾個接口,這樣的話每個接口被復(fù)用的可能性是很高的。Java中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標(biāo)識。)
合成聚合復(fù)用原則:優(yōu)先使用聚合或合成關(guān)系復(fù)用代碼。(通過繼承來復(fù)用代碼是面向?qū)ο蟪绦蛟O(shè)計中被濫用得最多的東西,因為所有的教科書都無一例外的對繼承進行了鼓吹從而誤導(dǎo)了初學(xué)者,類與類之間簡單的說有三種關(guān)系,IS-A關(guān)系、HAS-A關(guān)系、USE-A關(guān)系,分別代表繼承、關(guān)聯(lián)和依賴。其中,關(guān)聯(lián)關(guān)系根據(jù)其關(guān)聯(lián)的強度又可以進一步劃分為關(guān)聯(lián)、聚合和合成,但說白了都是HAS-A關(guān)系,合成聚合復(fù)用原則想表達的是優(yōu)先考慮HAS-A關(guān)系而不是IS-A關(guān)系復(fù)用代碼,原因嘛可以自己從百度上找到一萬個理由,需要說明的是,即使在Java的API中也有不少濫用繼承的例子,例如Properties類繼承了Hashtable類,Stack類繼承了Vector類,這些繼承明顯就是錯誤的,更好的做法是在Properties類中放置一個Hashtable類型的成員并且將其鍵和值都設(shè)置為字符串來存儲數(shù)據(jù),而Stack類的設(shè)計也應(yīng)該是在Stack類中放一個Vector對象來存儲數(shù)據(jù)。記?。喝魏螘r候都不要繼承工具類,工具是可以擁有并可以使用的(HAS/USE),而不是拿來繼承的。)
迪米特法則:迪米特法則又叫最少知識原則,一個對象應(yīng)當(dāng)對其他對象有盡可能少的了解。(迪米特法則簡單的說就是如何做到“低耦合”,門面模式和調(diào)停者模式就是對迪米特法則的踐行。對于門面模式可以舉一個簡單的例子,你去一家公司洽談業(yè)務(wù),你不需要了解這個公司內(nèi)部是如何運作的,你甚至可以對這個公司一無所知,去的時候只需要找到公司入口處的前臺美女,告訴她們你要做什么,她們會找到合適的人跟你接洽,前臺的美女就是公司這個系統(tǒng)的門面。再復(fù)雜的系統(tǒng)都可以為用戶提供一個簡單的門面,Java Web開發(fā)中作為前端控制器的Servlet或Filter不就是一個門面嗎,瀏覽器對服務(wù)器的運作方式一無所知,但是通過前端控制器就能夠根據(jù)你的請求得到相應(yīng)的服務(wù)。調(diào)停者模式也可以舉一個簡單的例子來說明,例如一臺計算機,CPU、內(nèi)存、硬盤、顯卡、聲卡各種設(shè)備需要相互配合才能很好的工作,但是如果這些東西都直接連接到一起,計算機的布線將異常復(fù)雜,在這種情況下,主板作為一個調(diào)停者的身份出現(xiàn),它將各個設(shè)備連接在一起而不需要每個設(shè)備之間直接交換數(shù)據(jù),這樣就減小了系統(tǒng)的耦合度和復(fù)雜度。迪米特法則用通俗的話來將就是不要和陌生人打交道,如果真的需要,找一個自己的朋友,讓他替你和陌生人打交道。)

?

425.Java企業(yè)級開發(fā)中常用的設(shè)計模式有哪些?
答: 按照分層開發(fā)的觀點,可以將應(yīng)用劃分為:表示層、業(yè)務(wù)邏輯層和持久層,每一層都有屬于自己類別的設(shè)計模式。
表示層設(shè)計模式:
1) Interceptor Filter:攔截過濾器,提供請求預(yù)處理和后處理的方案,可以對請求和響應(yīng)進行過濾。/p>
2) Front Controller:通過中央控制器提供請求管理和處理,管理內(nèi)容讀取、安全性、視圖管理和導(dǎo)航等功能。Struts 2中的StrutsPrepareAndExecuteFilter、Spring MVC中的DispatcherServlet都是前端控制器,后者如下圖所示:

3) View Helper:視圖幫助器,負(fù)責(zé)將顯示邏輯和業(yè)務(wù)邏輯分開。顯示的部分放在視圖組件中,業(yè)務(wù)邏輯代碼放在幫助器中,典型的功能是內(nèi)容讀取、驗證與適配。
4) Composite View:復(fù)合視圖。
業(yè)務(wù)邏輯層設(shè)計模式:
1) Business Delegate:業(yè)務(wù)委托,減少表示層和業(yè)務(wù)邏輯層之間的耦合。
2) Value Object:值對象,解決層之間交換數(shù)據(jù)的開銷問題。
3) Session Fa?ade:會話門面,隱藏業(yè)務(wù)邏輯組件的細(xì)節(jié),集中工作流程。
4) Value Object Assembler:靈活的組裝不同的值對象
5) Value List Handler:提供執(zhí)行查詢和處理結(jié)果的解決方案,還可以緩存查詢結(jié)果,從而達到提升性能的目的。
6) Service Locator:服務(wù)定位器,可以查找、創(chuàng)建和定位服務(wù)工廠,封裝其實現(xiàn)細(xì)節(jié),減少復(fù)雜性,提供單個控制點,通過緩存提高性能。
持久層設(shè)計模式:
Data Access Object:數(shù)據(jù)訪問對象,以面向?qū)ο蟮姆绞酵瓿蓪?shù)據(jù)的增刪改查。
【補充】如果想深入的了解Java企業(yè)級應(yīng)用的設(shè)計模式和架構(gòu)模式,可以參考這些書籍:?《Pro Java EE Spring Patterns》、《POJO in Action》、《Patterns of Enterprise Application Architecture》。
426.你在開發(fā)中都用到了那些設(shè)計模式?用在什么場合?
答:面試被問到關(guān)于設(shè)計模式的知識時,可以揀最常用的作答,例如:
1) 工廠模式:工廠類可以根據(jù)條件生成不同的子類實例,這些子類有一個公共的抽象父類并且實現(xiàn)了相同的方法,但是這些方法針對不同的數(shù)據(jù)進行了不同的操作(多態(tài)方法)。當(dāng)?shù)玫阶宇惖膶嵗螅_發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個子類的實例。
2) 代理模式:給一個對象提供一個代理對象,并由代理對象控制原對象的引用。實際開發(fā)中,按照使用目的的不同,代理可以分為:遠(yuǎn)程代理、虛擬代理、保護代理、Cache代理、防火墻代理、同步化代理、智能引用代理。
3) 適配器模式:把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起使用的類能夠一起工作。
4) 模板方法模式:提供一個抽象類,將部分邏輯以具體方法或構(gòu)造器的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實現(xiàn)這些抽象方法(多態(tài)實現(xiàn)),從而實現(xiàn)不同的業(yè)務(wù)邏輯。
除此之外,還可以講講上面提到的門面模式、橋梁模式、單例模式、裝潢模式(Collections工具類里面的synchronizedXXX方法把一個線程不安全的容器變成線程安全容器就是對裝潢模式的應(yīng)用,而Java IO里面的過濾流(有的翻譯成處理流)也是應(yīng)用裝潢模式的經(jīng)典例子)等,反正原則就是揀自己最熟悉的用得最多的作答,以免言多必失。?
427.什么是設(shè)計模式,設(shè)計模式的作用。
設(shè)計模式是一套被反復(fù)使用的、多數(shù)人知曉、經(jīng)過分類編目的優(yōu)秀代碼設(shè)計經(jīng)驗的總結(jié)。特定環(huán)境下特定問題的處理方法。
1)重用設(shè)計和代碼 重用設(shè)計比重用代碼更有意義,自動帶來代碼重用
2)提高擴展性 大量使用面向接口編程,預(yù)留擴展插槽,新的功能或特性很容易加入到系統(tǒng)中來
3)提高靈活性 通過組合提高靈活性,可允許代碼修改平穩(wěn)發(fā)生,對一處修改不會波及到其他模塊
4) 提高開發(fā)效率 正確使用設(shè)計模式,可以節(jié)省大量的時間
428.23種經(jīng)典設(shè)計模式都有哪些,如何分類。

?

429.寫出簡單工廠模式的示例代碼

基本原理:由一個工廠類根據(jù)傳入的參數(shù)(一般是字符串參數(shù)),動態(tài)決定應(yīng)該創(chuàng)建哪一個產(chǎn)品子類(這些產(chǎn)品子類繼承自同一個父類或接口)的實例,并以父類形式返回
優(yōu)點:客戶端不負(fù)責(zé)對象的創(chuàng)建,而是由專門的工廠類完成;客戶端只負(fù)責(zé)對象的調(diào)用,實現(xiàn)了創(chuàng)建和調(diào)用的分離,降低了客戶端代碼的難度;
缺點:如果增加和減少產(chǎn)品子類,需要修改簡單工廠類,違背了開閉原則;如果產(chǎn)品子類過多,會導(dǎo)致工廠類非常的龐大,違反了高內(nèi)聚原則,不利于后期維護
430.請對你所熟悉的一個設(shè)計模式進行介紹
分析:建議挑選有一定技術(shù)難度,并且在實際開發(fā)中應(yīng)用較多的設(shè)計模式??梢蕴暨x裝飾模式和動態(tài)代理模式。此處挑選動態(tài)代理設(shè)計模式。
講解思路:生活案例引入、技術(shù)講解、優(yōu)缺點分析、典型應(yīng)用。
1、生活案例引入:送生日蛋糕:
MM們要過生日了,怎么也得表示下吧。最起碼先送個蛋糕。蛋糕多種多樣了。巧克力,冰淇淋,奶油等等。這都是基本的了,再加點額外的裝飾,如蛋糕里放點花、放賀卡、放點干果吃著更香等等。
分析:
方案1:如果采用繼承會造成大量的蛋糕子類
方案2:蛋糕作為主體,花,賀卡,果仁等是裝飾者,需要時加到蛋糕上。要啥我就加啥。
技術(shù)講解
裝飾模式(別名Wrapper)是在不必改變原類文件和使用繼承的情況下,動態(tài)的擴展一個對象的功能。它通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實對象,提供了比繼承更具彈性的代替方案。
裝飾模式一般涉及到的角色
抽象構(gòu)建角色(Component):給出一個抽象的接口,以規(guī)范準(zhǔn)備接受附加責(zé)任的對象。
具體的構(gòu)建角色(ConcreteComponent):定義一個將要接受附加責(zé)任的類。
抽象的裝飾角色 (Decorator):持有一個抽象構(gòu)建(Component)角色的引用,并定義一個與抽象構(gòu)件一致的接口。
具體的裝飾角色(ConcreteDecorator):負(fù)責(zé)給構(gòu)建對象“貼上”附加的責(zé)任。

3、優(yōu)缺點分析
優(yōu)點
1)Decorator模式與繼承關(guān)系的目的都是要擴展對象的功能,但是Decorato更多的靈活性。
2)把類中的裝飾功能從類中搬移出去,這樣可以簡化原有的類。有效地把類的核心功能和裝飾功能區(qū)分開了。
3)通過使用不同的具體裝飾類以及這些裝飾類的排列組合,可創(chuàng)造出很多不同行為的組合。
缺點
這種比繼承更加靈活機動的特性,也同時意味著更加多的復(fù)雜性。
裝飾模式會導(dǎo)致設(shè)計中出現(xiàn)許多小類,如果過度使用,會使程序變得很復(fù)雜。
符合的設(shè)計原則:
多用組合,少用繼承。利用繼承設(shè)計子類的行為是在編譯時靜態(tài)決定的,且所有的子類都會繼承到相同的行為。如能夠利用組合擴展對象的行為,就可在運行時動態(tài)進行擴展。
類應(yīng)設(shè)計的對擴展開放,對修改關(guān)閉。
4、典型應(yīng)用
java IO中需要完成對不同輸入輸出源的操作,如果單純的使用繼承這一方式,無疑需要很多的類。比如說,我們操作文件需要一個類,實現(xiàn)文件的字節(jié)讀取需要一個類,實現(xiàn)文件的字符讀取又需要一個類....一次類推每個特定的操作都需要一個特定的類。這無疑會導(dǎo)致大量的IO繼承類的出現(xiàn)。顯然對于編程是很不利的。而是用裝飾模式則可以很好的解決這一問題,在裝飾模式中:節(jié)點流(如FileInputStream)直接與輸入源交互,之后通過過濾流(FilterInputStream)進行裝飾,這樣獲得的io對象便具有某幾個的功能,很好的拓展了IO的功能。

高級框架
431.什么是Maven?
Maven使用項目對象模型(POM)的概念,可以通過一小段描述信息來管理項目的構(gòu)建,報告和文檔的軟件項目管理工具。
Maven 除了以程序構(gòu)建能力為特色之外,還提供高級項目管理工具。由于 Maven 的缺省構(gòu)建規(guī)則有較高的可重用性,所以常常用兩三行 Maven 構(gòu)建腳本就可以構(gòu)建簡單的項目。由于 Maven 的面向項目的方法,許多 Apache Jakarta 項目發(fā)布時使用 Maven,而且公司項目采用 Maven 的比例在持續(xù)增長。
Maven的出現(xiàn),解決了開發(fā)過程中的jar包升級及依賴的難題。它可以對項目依賴的jar包進行管理,可以讓你的項目保持基本的依賴,排除冗余jar包,并且可以讓你非常輕松的對依賴的jar包進行版本升級。而這些僅僅是Maven最基本的功能,它可以在這基礎(chǔ)上對項目進行清理、編譯、測試、打包、發(fā)布等等構(gòu)建項目的工作。?
可以說,Maven是現(xiàn)在Java社區(qū)中最強大的項目管理和項目構(gòu)建工具,而更加值得慶幸的是,這樣一個強大的工具,它的使用也是非常簡單的。
現(xiàn)在,JavaEE項目使用的開源軟件都可以通過Maven來獲取,并且,越來越多的公司也開始使用Maven來管理構(gòu)建項目了。
432.Maven和ANT的區(qū)別
1.maven&ant同屬apach是流行的構(gòu)建工具。
都是為了簡化軟件開發(fā)而存在的。但是maven因為自身管理一個項目對象模型(project object model),這個模型其實就是抽象了一個項目的開發(fā)流程,它包含了一個項目的生命周期的各個階段,并將這個周期固定下來,這也就是約定大于配置。約定大于配置的意思就是,我maven將項目開發(fā)的各個階段固定起來了,每個文件的存放位置,每個階段要生成什么文件、保存為什么格式并且要把它放在什么位置,我都固定好了。我知道一個軟件是怎么開發(fā)出來,如果一個項目要使用maven,可以,但你要遵循我的規(guī)則,文件目錄不要亂建亂放,只有這樣maven才會將源碼用起來。這就是約定大于配置,因為maven已經(jīng)將流程固定下來了,只要遵守約定,就不需要自己手動去配置了,這將大大地提高開發(fā)效率。就像是開車一樣,只要知道點火、油門、方向、剎車,就可以將車子開東起來(當(dāng)然出于安全和法律考慮,還是要考駕照的。),關(guān)于車子內(nèi)部的傳動原理,電氣原理,工程原理,普通人并不需要了解多少,日常夠用就好了。這也是約定大于配置的一個例子。配置就是自己造一輛車去開,有必要,有能力,有時間嗎?
2.maven的中央倉庫和pom.xml文件。中央倉庫統(tǒng)一存放了開發(fā)用到的各種jar包,要用時只需要添加依賴到pom文件中,maven就會自動下載,當(dāng)然為了方便一般會在本地建一個倉庫,減少下載時間。pom文件是maven的配置文件,maven就是通過管理pom文件和一些核心插件來管理項目。當(dāng)然我前面將maven擬人化了,其實maven是沒有智力的,一切都是封裝好的流程,只是maven將很多操作隱藏起來了。
3.ant的build.xml文件。build文件是ant的配置文件,ant依靠它來執(zhí)行操作,與maven不同的是ant沒有固定一條程序鏈。你想要執(zhí)行什么操作以及操作之間的順序和依賴關(guān)系,都需要手動添加到build文件中,一點一滴都要寫清楚,否則ant就不會執(zhí)行。
4.maven和ant區(qū)別
Maven 擁有約定,只要遵守約定,它就知道你的源代碼在哪里。Maven 是聲明式的。你需要做的只是創(chuàng)建一個 pom.xml 文件然后將源代碼放到默認(rèn)的目錄。Maven 會幫你處理其它的事情。Maven 有一個生命周期,當(dāng)你運行 mvn install 的時候被調(diào)用。這條命令告訴 Maven 執(zhí)行一系列的有序的步驟,直到到達你指定的生命周期。缺點是運行許多默認(rèn)目標(biāo)。
而ant沒有約定,項目生命周期,它是命令式的。所有操作都要手動去創(chuàng)建、布置。甚至連build.xml文件都需要手動創(chuàng)建。
433.Maven倉庫是什么
Maven倉庫是基于簡單文件系統(tǒng)存儲的,集中化管理Java API資源(構(gòu)件)的一個服務(wù)。倉庫中的任何一個構(gòu)件都有其唯一的坐標(biāo),根據(jù)這個坐標(biāo)可以定義其在倉庫中的唯一存儲路徑。得益于 Maven 的坐標(biāo)機制,任何 Maven項目使用任何一個構(gòu)件的方式都是完全相同的,Maven 可以在某個位置統(tǒng)一存儲所有的 Maven 項目共享的構(gòu)件,這個統(tǒng)一的位置就是倉庫,項目構(gòu)建完畢后生成的構(gòu)件也可以安裝或者部署到倉庫中,供其它項目使用。
對于Maven來說,倉庫分為兩類:本地倉庫和遠(yuǎn)程倉庫。
434.Maven的工程類型有哪些?
POM工程
POM工程是邏輯工程。用在父級工程或聚合工程中。用來做jar包的版本控制。
JAR工程
將會打包成jar用作jar包使用。即常見的本地工程 - Java Project。
WAR工程
將會打包成war,發(fā)布在服務(wù)器上的工程。如網(wǎng)站或服務(wù)。即常見的網(wǎng)絡(luò)工程 - Dynamic Web Project。war工程默認(rèn)沒有WEB-INF目錄及web.xml配置文件,IDE通常會顯示工程錯誤,提供完整工程結(jié)構(gòu)可以解決。
435.Maven常用命令有哪些?
install
本地安裝, 包含編譯,打包,安裝到本地倉庫
編譯 - javac
打包 - jar, 將java代碼打包為jar文件
安裝到本地倉庫 - 將打包的jar文件,保存到本地倉庫目錄中。
clean
清除已編譯信息。
刪除工程中的target目錄。
compile
只編譯。 javac命令
deploy
部署。 常見于結(jié)合私服使用的命令。
相當(dāng)于是install+上傳jar到私服。
包含編譯,打包,安裝到本地倉庫,上傳到私服倉庫。
package
打包。 包含編譯,打包兩個功能。
436.ZooKeeper的作用是什么?
配置管理
在我們的應(yīng)用中除了代碼外,還有一些就是各種配置。比如數(shù)據(jù)庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。當(dāng)我們只有一種配置,只有一臺服務(wù)器,并且不經(jīng)常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多服務(wù)器都需要這個配置,這時使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。Zookeeper就是這種服務(wù),它使用Zab這種一致性協(xié)議來提供一致性。現(xiàn)在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然后才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現(xiàn)服務(wù)治理。
名字服務(wù)
名字服務(wù)這個就很好理解了。比如為了通過網(wǎng)絡(luò)訪問一個系統(tǒng),我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是域名的。怎么辦呢?如果我們每臺機器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應(yīng)的IP發(fā)生變化了又該怎么辦呢?于是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應(yīng)的IP是什么。在我們的應(yīng)用中也會存在很多這類問題,特別是在我們的服務(wù)特別多的時候,如果我們在本地保存服務(wù)的地址的時候?qū)⒎浅2环奖?,但是如果我們只需要訪問一個大家都熟知的訪問點,這里提供統(tǒng)一的入口,那么維護起來將方便得多了。
分布式鎖
其實在第一篇文章中已經(jīng)介紹了Zookeeper是一個分布式協(xié)調(diào)服務(wù)。這樣我們就可以利用Zookeeper來協(xié)調(diào)多個分布式進程之間的活動。比如在一個分布式環(huán)境中,為了提高可靠性,我們的集群的每臺服務(wù)器上都部署著同樣的服務(wù)。但是,一件事情如果集群中的每個服務(wù)器都進行的話,那相互之間就要協(xié)調(diào),編程起來將非常復(fù)雜。而如果我們只讓一個服務(wù)進行操作,那又存在單點。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務(wù)去干活,當(dāng)這臺服務(wù)出問題的時候鎖釋放,立即fail over到另外的服務(wù)。這在很多分布式系統(tǒng)中都是這么做,這種設(shè)計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是采用這種機制。但要注意的是分布式鎖跟同一個進程的鎖還是有區(qū)別的,所以使用的時候要比同一個進程里的鎖更謹(jǐn)慎的使用。
集群管理
在分布式的集群中,經(jīng)常會由于各種原因,比如硬件故障,軟件故障,網(wǎng)絡(luò)問題,有些節(jié)點會進進出出。有新的節(jié)點加入進來,也有老的節(jié)點退出集群。這個時候,集群中其他機器需要感知到這種變化,然后根據(jù)這種變化做出對應(yīng)的決策。比如我們是一個分布式存儲系統(tǒng),有一個中央控制節(jié)點負(fù)責(zé)存儲的分配,當(dāng)有新的存儲進來的時候我們要根據(jù)現(xiàn)在集群目前的狀態(tài)來分配存儲節(jié)點。這個時候我們就需要動態(tài)感知到集群目前的狀態(tài)。還有,比如一個分布式的SOA架構(gòu)中,服務(wù)是一個集群提供的,當(dāng)消費者訪問某個服務(wù)時,就需要采用某種機制發(fā)現(xiàn)現(xiàn)在有哪些節(jié)點可以提供該服務(wù)(這也稱之為服務(wù)發(fā)現(xiàn),比如Alibaba開源的SOA框架Dubbo就采用了Zookeeper作為服務(wù)發(fā)現(xiàn)的底層機制)。還有開源的Kafka隊列就采用了Zookeeper作為Cosnumer的上下線管理。
437.什么是Znode?
在Zookeeper中,znode是一個跟Unix文件系統(tǒng)路徑相似的節(jié)點,可以往這個節(jié)點存儲或獲取數(shù)據(jù)。
Zookeeper底層是一套數(shù)據(jù)結(jié)構(gòu)。這個存儲結(jié)構(gòu)是一個樹形結(jié)構(gòu),其上的每一個節(jié)點,我們稱之為“znode”
zookeeper中的數(shù)據(jù)是按照“樹”結(jié)構(gòu)進行存儲的。而且znode節(jié)點還分為4中不同的類型。
每一個znode默認(rèn)能夠存儲1MB的數(shù)據(jù)(對于記錄狀態(tài)性質(zhì)的數(shù)據(jù)來說,夠了)
可以使用zkCli命令,登錄到zookeeper上,并通過ls、create、delete、get、set等命令操作這些znode節(jié)點
438.Znode節(jié)點類型有哪些?
答:(1)PERSISTENT 持久化節(jié)點: 所謂持久節(jié)點,是指在節(jié)點創(chuàng)建后,就一直存在,直到有刪除操作來主動清除這個節(jié)點。否則不會因為創(chuàng)建該節(jié)點的客戶端會話失效而消失。
(2)PERSISTENT_SEQUENTIAL 持久順序節(jié)點:這類節(jié)點的基本特性和上面的節(jié)點類型是一致的。額外的特性是,在ZK中,每個父節(jié)點會為他的第一級子節(jié)點維護一份時序,會記錄每個子節(jié)點創(chuàng)建的先后順序?;谶@個特性,在創(chuàng)建子節(jié)點的時候,可以設(shè)置這個屬性,那么在創(chuàng)建節(jié)點過程中,ZK會自動為給定節(jié)點名加上一個數(shù)字后綴,作為新的節(jié)點名。這個數(shù)字后綴的范圍是整型的最大值。?在創(chuàng)建節(jié)點的時候只需要傳入節(jié)點 “/test_”,這樣之后,zookeeper自動會給”test_”后面補充數(shù)字。
(3)EPHEMERAL 臨時節(jié)點:和持久節(jié)點不同的是,臨時節(jié)點的生命周期和客戶端會 話綁定。也就是說,如果客戶端會話失效,那么這個節(jié)點就會自動被清除掉。注意,這里提到的是會話失效,而非連接斷開。另外,在臨時節(jié)點下面不能創(chuàng)建子節(jié)點。?
這里還要注意一件事,就是當(dāng)你客戶端會話失效后,所產(chǎn)生的節(jié)點也不是一下子就消失了,也要過一段時間,大概是10秒以內(nèi),可以試一下,本機操作生成節(jié)點,在服務(wù)器端用命令來查看當(dāng)前的節(jié)點數(shù)目,你會發(fā)現(xiàn)客戶端已經(jīng)stop,但是產(chǎn)生的節(jié)點還在。
EPHEMERAL_SEQUENTIAL 臨時自動編號節(jié)點:此節(jié)點是屬于臨時節(jié)點,不過帶有順序,客戶端會話結(jié)束節(jié)點就消失。
439.什么是Dubbo?
Dubbo是阿里巴巴公司開源的一個高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的 RPC 實現(xiàn)服務(wù)的輸出和輸入功能,可以和Spring框架無縫集成。Dubbo框架,是基于容器運行的.。容器是Spring。
其核心部分包含:
1. 遠(yuǎn)程通訊: 提供對多種基于長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應(yīng)”模式的信息交換方式。
2. 集群容錯: 提供基于接口方法的透明遠(yuǎn)程過程調(diào)用,包括多協(xié)議支持,以及軟負(fù)載均衡,失敗容錯,地址路由,動態(tài)配置等集群支持。
3. 自動發(fā)現(xiàn): 基于注冊中心目錄服務(wù),使服務(wù)消費方能動態(tài)的查找服務(wù)提供方,使地址透明,使服務(wù)提供方可以平滑增加或減少機器。
Dubbo能做什么?
1.透明化的遠(yuǎn)程方法調(diào)用,就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法,只需簡單配置,沒有任何API侵入。 ? ? ?
2.軟負(fù)載均衡及容錯機制,可在內(nèi)網(wǎng)替代F5等硬件負(fù)載均衡器,降低成本,減少單點。
3. 服務(wù)自動注冊與發(fā)現(xiàn),不再需要寫死服務(wù)提供方地址,注冊中心基于接口名查詢服務(wù)提供者的IP地址,并且能夠平滑添加或刪除服務(wù)提供者。
Dubbo的存在簡單來說就是要減小service層的壓力。
440.什么是RPC遠(yuǎn)程過程調(diào)用?
遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
441.Dubbo中有哪些角色?
registry
注冊中心. 是用于發(fā)布和訂閱服務(wù)的一個平臺.用于替代SOA結(jié)構(gòu)體系框架中的ESB服務(wù)總線的。
發(fā)布
開發(fā)服務(wù)端代碼完畢后, 將服務(wù)信息發(fā)布出去. 實現(xiàn)一個服務(wù)的公開.
訂閱
客戶端程序,從注冊中心下載服務(wù)內(nèi)容 這個過程是訂閱.
訂閱服務(wù)的時候, 會將發(fā)布的服務(wù)所有信息,一次性下載到客戶端.
客戶端也可以自定義, 修改部分服務(wù)配置信息. 如: 超時的時長, 調(diào)用的重試次數(shù)等.
Consumer
服務(wù)的消費者, 就是服務(wù)的客戶端.
消費者必須使用Dubbo技術(shù)開發(fā)部分代碼. 基本上都是配置文件定義.
provider
服務(wù)的提供者, 就是服務(wù)端.
服務(wù)端必須使用Dubbo技術(shù)開發(fā)部分代碼. 以配置文件為主.
container
容器. Dubbo技術(shù)的服務(wù)端(Provider), 在啟動執(zhí)行的時候, 必須依賴容器才能正常啟動.
默認(rèn)依賴的就是spring容器. 且Dubbo技術(shù)不能脫離spring框架.
在2.5.3版本的dubbo中, 默認(rèn)依賴的是spring2.5版本技術(shù). 可以選用spring4.5以下版本.
在2.5.7版本的dubbo中, 默認(rèn)依賴的是spring4.3.10版本技術(shù). 可以選擇任意的spring版本.
monitor
監(jiān)控中心. 是Dubbo提供的一個jar工程.
主要功能是監(jiān)控服務(wù)端(Provider)和消費端(Consumer)的使用數(shù)據(jù)的. 如: 服務(wù)端是什么,有多少接口,多少方法, 調(diào)用次數(shù), 壓力信息等. 客戶端有多少, 調(diào)用過哪些服務(wù)端, 調(diào)用了多少次等.
442.Dubbo執(zhí)行流程什么是?

0 start: 啟動Spring容器時,自動啟動Dubbo的Provider
1、register: Dubbo的Provider在啟動后自動會去注冊中心注冊內(nèi)容.注冊的內(nèi)容包括:
1.1 Provider的 IP
1.2 Provider 的端口.
1.3 Provider 對外提供的接口列表.哪些方法.哪些接口類
1.4 Dubbo 的版本.
1.5 訪問Provider的協(xié)議.
2、subscribe: 訂閱.當(dāng)Consumer啟動時,自動去Registry獲取到所已注冊的服務(wù)的信息.
3、notify: 通知.當(dāng)Provider的信息發(fā)生變化時, 自動由Registry向Consumer推送通知.
4、invoke: 調(diào)用. Consumer 調(diào)用Provider中方法
4.1 同步請求.消耗一定性能.但是必須是同步請求,因為需要接收調(diào)用方法后的結(jié)果.
5、count:次數(shù). 每隔2分鐘,provoider和consumer自動向Monitor發(fā)送訪問次數(shù).Monitor進行統(tǒng)計.
443.說說Dubbo支持的協(xié)議有哪些?
1、Dubbo協(xié)議(官方推薦協(xié)議)
優(yōu)點:
采用NIO復(fù)用單一長連接,并使用線程池并發(fā)處理請求,減少握手和加大并發(fā)效率,性能較好(推薦使用)
缺點:
大文件上傳時,可能出現(xiàn)問題(不使用Dubbo文件上傳)
2、RMI(Remote Method Invocation)協(xié)議
優(yōu)點:
JDK自帶的能力??膳c原生RMI互操作,基于TCP協(xié)議
缺點:
偶爾連接失敗.
3、Hessian協(xié)議
優(yōu)點:
可與原生Hessian互操作,基于HTTP協(xié)議
缺點:
需hessian.jar支持,http短連接的開銷大
444.Dubbo支持的注冊中心有哪些?
1、Zookeeper(官方推薦)
優(yōu)點:支持分布式.很多周邊產(chǎn)品.
缺點: 受限于Zookeeper軟件的穩(wěn)定性.Zookeeper專門分布式輔助軟件,穩(wěn)定較優(yōu)
2、Multicast
優(yōu)點:去中心化,不需要單獨安裝軟件.
缺點:Provider和Consumer和Registry不能跨機房(路由)
3、Redis
優(yōu)點:支持集群,性能高
缺點:要求服務(wù)器時間同步.否則可能出現(xiàn)集群失敗問題.
4、Simple
優(yōu)點: 標(biāo)準(zhǔn)RPC服務(wù).沒有兼容問題
缺點: 不支持集群.
445.SessionFactory是線程安全的嗎?Session是線程安全的嗎,兩個線程能夠共享同一個Session嗎?
答:SessionFactory對應(yīng)Hibernate的一個數(shù)據(jù)存儲的概念,它是線程安全的,可以被多個線程并發(fā)訪問。SessionFactory一般只會在啟動的時候構(gòu)建。對于應(yīng)用程序,最好將SessionFactory通過單例的模式進行封裝以便于訪問。Session是一個輕量級非線程安全的對象(線程間不能共享session),它表示與數(shù)據(jù)庫進行交互的一個工作單元。Session是由SessionFactory創(chuàng)建的,在任務(wù)完成之后它會被關(guān)閉。Session是持久層服務(wù)對外提供的主要接口。Session會延遲獲取數(shù)據(jù)庫連接(也就是在需要的時候才會獲?。?。為了避免創(chuàng)建太多的session,可以使用ThreadLocal來取得當(dāng)前的session,無論你調(diào)用多少次getCurrentSession()方法,返回的都是同一個session。
446.Session的load和get方法的區(qū)別是什么?
答:主要有以下三項區(qū)別:
1)如果沒有找到符合條件的記錄, get方法返回null,load方法拋出異常
2)get方法直接返回實體類對象, load方法返回實體類對象的代理
3)在Hibernate 3之前,get方法只在一級緩存(內(nèi)部緩存)中進行數(shù)據(jù)查找, 如果沒有找到對應(yīng)的數(shù)據(jù)則越過二級緩存, 直接發(fā)出SQL語句完成數(shù)據(jù)讀取; load方法則可以充分利用二級緩存中的現(xiàn)有數(shù)據(jù);當(dāng)然從Hibernate 3開始,get方法不再是對二級緩存只寫不讀,它也是可以訪問二級緩存的
簡單的說,對于load()方法Hibernate認(rèn)為該數(shù)據(jù)在數(shù)據(jù)庫中一定存在可以放心的使用代理來實現(xiàn)延遲加載,如果沒有數(shù)據(jù)就拋出異常,而通過get()方法去取的數(shù)據(jù)可以不存在。
447.Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法有什么區(qū)別?
答:Hibernate的對象有三種狀態(tài):瞬態(tài)、持久態(tài)和游離態(tài)。游離狀態(tài)的實例可以通過調(diào)用save()、persist()或者saveOrUpdate()方法進行持久化;脫管狀態(tài)的實例可以通過調(diào)用 update()、0saveOrUpdate()、lock()或者replicate()進行持久化。save()和persist()將會引發(fā)SQL的INSERT語句,而update()或merge()會引發(fā)UPDATE語句。save()和update()的區(qū)別在于一個是將瞬態(tài)對象變成持久態(tài),一個是將游離態(tài)對象變?yōu)槌志脩B(tài)。merge方法可以完成save()和update()方法的功能,它的意圖是將新的狀態(tài)合并到已有的持久化對象上或創(chuàng)建新的持久化對象。按照官方文檔的說明:(1)persist()方法把一個瞬態(tài)的實例持久化,但是并"不保證"標(biāo)識符被立刻填入到持久化實例中,標(biāo)識符的填入可能被推遲到flush的時間;(2) persist"保證",當(dāng)它在一個事務(wù)外部被調(diào)用的時候并不觸發(fā)一個Insert語句,當(dāng)需要封裝一個長會話流程的時候,一個persist這樣的函數(shù)是需要的。(3)save"不保證"第2條,它要返回標(biāo)識符,所以它會立即執(zhí)行Insert語句,不管是不是在事務(wù)內(nèi)部還是外部。update()方法是把一個已經(jīng)更改過的脫管狀態(tài)的對象變成持久狀態(tài);lock()方法是把一個沒有更改過的脫管狀態(tài)的對象變成持久狀態(tài)。
448.什么是VSFTPD?
vsftpd 是“very secure FTP daemon”的縮寫,安全性是它的一個最大的特點。vsftpd 是一個 UNIX 類操作系統(tǒng)上運行的服務(wù)器的名字,它可以運行在諸如 Linux、BSD、Solaris、 HP-UNIX等系統(tǒng)上面,是一個完全免費的、開放源代碼的ftp服務(wù)器軟件,支持很多其他的 FTP 服務(wù)器所不支持的特征。
449.什么是Nginx?
Nginx?(engine x) 是一個高性能的HTTP和反向代理服務(wù)。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發(fā)的,第一個公開版本0.1.0發(fā)布于2004年10月4日。
Nginx 是一個很強大的高性能Web和反向代理服務(wù),它具有很多非常優(yōu)越的特性:在連接高并發(fā)的情況下,Nginx是Apache服務(wù)不錯的替代品:Nginx在美國是做虛擬主機生意的老板們經(jīng)常選擇的軟件平臺之一。
450.Nginx有哪些作用?
答:http協(xié)議代理
搭建虛擬主機
服務(wù)的反向代理
在反向代理中配置集群的負(fù)載均衡
451.什么是正向代理?
正向代理,意思是一個位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個請求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端??蛻舳瞬拍苁褂谜虼?。
452.什么是反向代理?
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。
453.什么是Redis?
答:Remote Dictionary Server(Redis)是一個開源的使用ANSI?C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
它通常被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因為值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
454.Redis的特點什么是?
1. 支持多種數(shù)據(jù)結(jié)構(gòu),如 string(字符串)、 list(雙向鏈表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數(shù)估算)
2. 支持持久化操作,可以進行aof及rdb數(shù)據(jù)持久化到磁盤,從而進行數(shù)據(jù)備份或數(shù)據(jù)恢復(fù)等操作,較好的防止數(shù)據(jù)丟失的手段。
3. 支持通過Replication進行數(shù)據(jù)復(fù)制,通過master-slave機制,可以實時進行數(shù)據(jù)的同步復(fù)制,支持多級復(fù)制和增量復(fù)制,master-slave機制是Redis進行HA的重要手段。
單進程請求,所有命令串行執(zhí)行,并發(fā)情況下不需要考慮數(shù)據(jù)一致性問題。
455.Redis數(shù)據(jù)類型有哪些?
答:String(字符串)
Hash(hash表)
List(鏈表)
Set(集合)
SortedSet(有序集合zset)
由于字?jǐn)?shù)限制,后續(xù)內(nèi)容更加精彩,歡迎關(guān)注,整理不易,可否動動你的小手給小編來點更新的動力,希望對你們會有幫助!~