1. 程式人生 > 實用技巧 >【redis】哨兵模式

【redis】哨兵模式

(一)面向物件的特徵

面向物件的三個基本特徵是:封裝、繼承、多型。

封裝

封裝最好理解了。封裝是面向物件的特徵之一,是物件和類概念的主要特性。 封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。

繼承

面向物件程式設計 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。

多型

多型性(polymorphisn)是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。 實現多型,有二種方式,覆蓋,過載。

(二)final, finally, finalize 的區別

final

用於宣告屬性,方法和類, 分別表示屬性不可變, 方法不可覆蓋, 類不可繼承.

finally

是異常處理語句結構的一部分,表示總是執行.

finalize

是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等. JVM不保證此方法總被呼叫.

(三)int 和 Integer 有什麼區別

int 是 Java 提供的 8 種原始資料型別之一。Java 為每個原始型別提供了封裝類,Integer 是 Java 為 int 提供的封裝類。 int 的預設值為0

,而 Integer 的預設值為null,是引用型別,即 Integer 可以區分出未賦值和值為 0 的區別,int 則無法表達出未賦值的情況, Java 中 int 和 Integer 關係是比較微妙的。關係如下:

1、int 是基本的資料型別;

2、Integer 是 int 的封裝類;

3、int 和 Integer 都可以表示某一個數值;

4、int 和 Integer 不能夠互用,因為他們兩種不同的資料型別;

(四)過載和重寫的區別

過載 Overload

表示同一個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。

重寫 Override

  表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向物件程式設計的多型性的一種表現。子類覆蓋父類的方法時,只能比父類丟擲更少的異常,或者是丟擲父類丟擲的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大,不能更小。如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

(五)抽象類和介面有什麼區別

引數抽象類介面
預設的方法實現 它可以有預設的方法實現 介面完全是抽象的。它根本不存在方法的實現
實現 子類使用 extends 關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有宣告的方法的實現。 子類使用關鍵字 implements 來實現介面。它需要提供介面中所有宣告的方法的實現
構造器 抽象類可以有構造器 介面不能有構造器
與正常 Java 類的區別 除了你不能例項化抽象類之外,它和普通Java類沒有任何區別 介面是完全不同的型別
訪問修飾符 抽象方法可以有 public、protected 和 default 這些修飾符 介面方法預設修飾符是 public。你不可以使用其它修飾符。
main 方法 抽象方法可以有 main 方法並且我們可以執行它 介面沒有 main 方法,因此我們不能執行它。
多繼承 抽象方法可以繼承一個類和實現多個介面 介面只可以繼承一個或多個其它介面
速度 它比介面速度要快 介面是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。
新增新方法 如果你往抽象類中新增新的方法,你可以給它提供預設的實現。因此你不需要改變你現在的程式碼。 如果你往介面中新增方法,那麼你必須改變實現該介面的類。

(六)反射的用途及實現

反射的用途

Java 反射機制是一個非常強大的功能,在很多的專案比如 Spring,MyBatis 都都可以看到反射的身影。通過反射機制,我們可以在執行期間獲取物件的型別資訊。利用這一點我們可以實現工廠模式和代理模式等設計模式,同時也可以解決 Java 泛型擦除等令人苦惱的問題。

反射的實現

獲取一個物件對應的反射類,在 Java 中有下列方法可以獲取一個物件的反射類

1、通過getClass()方法

2、通過Class.forName()方法

3、使用類.class

4、通過類載入器實現,getClassLoader()

(七)自定義註解的場景及實現

登陸、許可權攔截、日誌處理,以及各種 Java 框架,如 Spring,Hibernate,JUnit 提到註解就不能不說反射,Java 自定義註解是通過執行時靠反射獲取註解。實際開發中,例如我們要獲取某個方法的呼叫日誌,可以通過 AOP(動態代理機制)給方法新增切面,通過反射來獲取方法包含的註解,如果包含日誌註解,就進行日誌記錄。反射的實現在 Java 應用層面上講,是通過對 Class 物件的操作實現的,Class 物件為我們提供了一系列方法對類進行操作。在 JVM 這個角度來說,Class 檔案是一組以 8 位位元組為基礎單位的二進位制流,各個資料專案按嚴格的順序緊湊的排列在 Class 檔案中,裡面包含了類、方法、欄位等等相關資料。通過對 Class 資料流的處理我們即可得到欄位、方法等資料。

(八)HTTP 請求的 GET 與 POST 方式的區別

1、根據 HTTP 規範,GET 用於資訊獲取,而且應該是安全的和冪等的。

2、根據 HTTP 規範,POST 表示可能修改變伺服器上的資源的請求。

3、首先是 "GET 方式提交的資料最多隻能是 1024 位元組",因為 GET 是通過 URL 提交資料,那麼 GET 可提交的資料量就跟 URL 的長度有直接關係了。而實際上,URL 不存在引數上限的問題,HTTP 協議規範沒有對 URL 長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE 對 URL 長度的限制是 2083 位元組(2K+35)。對於其他瀏覽器,如 Netscape、FireFox 等,理論上沒有長度限制,其限制取決於作業系統的支援。注意這是限制是整個 URL 長度,而不僅僅是你的引數值資料長度。

4、POST 是沒有大小限制的,HTTP 協議規範也沒有進行大小限制

(九)session 與 cookie 區別

1、cookie 資料存放在客戶的瀏覽器上,session 資料放在伺服器上。

2、cookie 不是很安全,別人可以分析存放在本地的 cookie 並進行 cookie 欺騙,考慮到安全應當使用 session

3、session 會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用 cookie。

4、單個 cookie 儲存的資料不能超過 4K,很多瀏覽器都限制一個站點最多儲存 20 個 cookie。

(十)session 分散式處理

Session 複製

在支援 Session 複製的 Web 伺服器上,通過修改 Web 伺服器的配置,可以實現將 Session 同步到其它 Web 伺服器上,達到每個 Web 伺服器上都儲存一致的 Session。

  • 優點:程式碼上不需要做支援和修改。
  • 缺點:需要依賴支援的 Web 伺服器,一旦更換成不支援的 Web 伺服器就不能使用了,在資料量很大的情況下不僅佔用網路資源,而且會導致延遲。
  • 適用場景:只適用於Web伺服器比較少且 Session 資料量少的情況。
  • 可用方案:開源方案 tomcat-redis-session-manager,暫不支援 Tomcat8。

Session 粘滯

將使用者的每次請求都通過某種方法強制分發到某一個 Web 伺服器上,只要這個 Web 伺服器上儲存了對應 Session 資料,就可以實現會話跟蹤。

  • 優點:使用簡單,沒有額外開銷。
  • 缺點:一旦某個 Web 伺服器重啟或宕機,相對應的 Session 資料將會丟失,而且需要依賴負載均衡機制。
  • 適用場景:對穩定性要求不是很高的業務情景。

Session 集中管理

在單獨的伺服器或伺服器叢集上使用快取技術,如 Redis 儲存 Session 資料,集中管理所有的 Session,所有的Web伺服器都從這個儲存介質中存取對應的 Session,實現 Session 共享。

  • 優點:可靠性高,減少 Web 伺服器的資源開銷。
  • 缺點:實現上有些複雜,配置較多。
  • 適用場景:Web伺服器較多、要求高可用性的情況。
  • 可用方案:開源方案 Spring Session,也可以自己實現,主要是重寫 HttpServletRequestWrapper 中的 getSession 方法。

這種方式每次發起請求的時候都需要將 Session 資料放到 Cookie 中傳遞給服務端。

  • 優點:不需要依賴額外外部儲存,不需要額外配置。
  • 缺點:不安全,易被盜取或篡改;Cookie 數量和長度有限制,需要消耗更多網路頻寬。
  • 適用場景:資料不重要、不敏感且資料量小的情況。

總結

這四種方式,相對來說,Session 集中管理更加可靠,使用也是最多的。

(十一)JDBC 流程

1、向 DriverManager 類註冊驅動資料庫驅動程式

2、呼叫 DriverManager.getConnection 方法, 通過 JDBC URL,使用者名稱,密碼取得資料庫連線的 Connection 物件。

3、獲取 Connection 後, 便可以通過 createStatement 建立 Statement 用以執行 SQL 語句。

4、有時候會得到查詢結果,比如 select,得到查詢結果,查詢(SELECT)的結果存放於結果集(ResultSet)中。

5、關閉資料庫語句,關閉資料庫連線。

(十二)MVC 設計思想

MVC 是三個單詞的首字母縮寫,它們是 Model(模型)、View(檢視)和 Controller(控制)。 這個模式認為,程式不論簡單或複雜,從結構上看,都可以分成三層:

1、最上面的一層,是直接面向終端使用者的"檢視層"(View)。它是提供給使用者的操作介面,是程式的外殼。

2、最底下的一層,是核心的"資料層"(Model),也就是程式需要操作的資料或資訊。

3、中間的一層,就是"控制層"(Controller),它負責根據使用者從"檢視層"輸入的指令,選取"資料層"中的資料,然後對其進行相應的操作,產生最終結果。

(十三)equals 與 == 的區別

1、==equals的主要區別是:==常用於比較原生型別,而equals()方法用於檢查物件的相等性。

2、另一個不同的點是:如果==equals()用於比較物件,當兩個引用地址相同,==返回 true。而equals()可以返回 true 或者 false 主要取決於重寫實現。最常見的一個例子,字串的比較,不同情況==equals()返回不同的結果。