疏漏總結(八)

1、密集索引和稀疏索引的區別

  1. 密集索引文件中的搜索碼都對應一個索引值
  2. 稀疏索引文件中只會爲某些索引碼的某些值建立索引項

2、意向鎖

產生的原因:解決表鎖與之前可能存在的行鎖衝突,避免爲了判斷表是否存在行鎖而去掃描全表的系統消耗。

作用:一種快速判斷表鎖與之前可能存在的行鎖衝突的機制。(數據庫會幫我們自動加)。行鎖在加鎖前要先加意向鎖。意向鎖是一種表鎖。

3、Redis集羣

Redis有三種集羣,分別是主從複製,哨兵模式,集羣模式

詳情見此篇文章,Pipeline及主從同步模式和哨兵模式

4、DNS解析的流程

  1. 在瀏覽器中輸入www.qq.com域名,操作系統會先檢查自己本地的hosts文件是否有這個網址映射關係,如果有,就先調用這個IP地址映射,完成域名解析。
  2. 如果hosts裏沒有這個域名的映射,則查找本地DNS解析器緩存,是否有這個網址映射關係,如果有,直接返回,完成域名解析。
  3. 如果hosts與本地DNS解析器緩存都沒有相應的網址映射關係,首先會找TCP/ip參數中設置的首選DNS服務器,在此我們叫它本地DNS服務器,此服務器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
  4. 如果要查詢的域名,不由本地DNS服務器區域解析,但該服務器已緩存了此網址映射關係,則調用這個IP地址映射,完成域名解析,此解析不具有權威性。
  5. 如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置(是否設置轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS服務器收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名服務器的一個IP。本地DNS服務器收到IP信息後,將會聯繫負責.com域的這臺服務器。這臺負責.com域的服務器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS服務器地址(qq.com)給本地DNS服務器。當本地DNS服務器收到這個地址後,就會找qq.com域服務器,重複上面的動作,進行查詢,直至找到www.qq.com主機。
  6. 如果用的是轉發模式,此DNS服務器就會把請求轉發至上一級DNS服務器,由上一級服務器進行解析,上一級服務器如果不能解析,或找根DNS或把轉請求轉至上上級,以此循環。不管是本地DNS服務器用是是轉發,還是根提示,最後都是把結果返回給本地DNS服務器,由此DNS服務器再返回給客戶機。

5、Spring Bean生命週期

容器創建之後會解析,並且創建出來bean,Spring Bean的生命週期主要有創建和銷燬:

創建Bean:

  1. 實例化Bean對象,以及設置Bean屬性;
  2. 通過使用各種Aware接口,注入Bean對容器基礎設施的依賴,讓容器感知到Bean的存在;
  3. 緊接着調用BeanPostProcessor的前置初始化方法postProcessBeforeInitialization,主要是在Spring Bean完成初始化實例之後,添加一些自定義的處理邏輯;
  4. 如果實現InitializingBean.afterPropertiesSet,會針對自定義初始化的Bean去做一些自定義的事情;
  5. 之後定義Bean init,初始化Bean;
  6. 調用BeanPostProcessor的後置初始化方法postProcessAfterInitialization,做一些Bean初始化實例之後的自定義工作,最後就成功創建了Bean。

銷燬Bean:

  1. 如果Bean實現了DisposableBean接口,就會調用destroy方法;
  2. 如果配置了destroy-method屬性,則會調用其配置的銷燬方法。

6、Spring編程式事務和聲明式事務

spring支持編程式事務管理和聲明式事務管理兩種方式:

  • 編程式事務使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對於編程式事務管理,spring推薦使用TransactionTemplate
  • 聲明式事務是建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中

7、堆外內存

堆外內存就是把內存對象分配在Java虛擬機的堆以外的內存,這些內存直接受操作系統管理(而不是虛擬機),這樣做的結果就是能夠在一定程度上減少垃圾回收對應用程序造成的影響。

在JAVA中,JVM內存指的是堆內存。
機器內存中,不屬於堆內存的部分即爲堆外內存。
堆外內存也被稱爲直接內存
在這裏插入圖片描述
Netty使用的也是堆外內存。

使用堆外內存的優點:

  • 減少垃圾回收:因爲垃圾回收會暫停其他的工作。
  • 加快複製速度:堆內在flush到遠程時,會先複製到直接內存(非堆內存),然後在發送;而堆外內存相當於省略掉了這個工作。

8、Https

一個HTTPS請求實際上包含了兩次HTTP傳輸,可以細分爲8步:

  • 客戶端向服務器發起HTTPS請求,連接到服務器的443端口
  • 服務器端有一個密鑰對,即公鑰和私鑰,是用來進行非對稱加密使用的,服務器端保存着私鑰,不能將其泄露,公鑰可以發送給任何人。
  • .服務器將自己的公鑰發送給客戶端。
  • 客戶端收到服務器端的證書之後,會對證書進行檢查,驗證其合法性,如果發現發現證書有問題,那麼HTTPS傳輸就無法繼續。嚴格的說,這裏應該是驗證服務器發送的數字證書的合法性,關於客戶端如何驗證數字證書的合法性,下文會進行說明。如果公鑰合格,那麼客戶端會生成一個隨機值,這個隨機值就是用於進行對稱加密的密鑰,我們將該密鑰稱之爲client key,即客戶端密鑰,這樣在概念上和服務器端的密鑰容易進行區分。然後用服務器的公鑰對客戶端密鑰進行非對稱加密,這樣客戶端密鑰就變成密文了,至此,HTTPS中的第一次HTTP請求結束。
  • 客戶端會發起HTTPS中的第二個HTTP請求,將加密之後的客戶端密鑰發送給服務器。
  • 服務器接收到客戶端發來的密文之後,會用自己的私鑰對其進行非對稱解密,解密之後的明文就是客戶端密鑰,然後用客戶端密鑰對數據進行對稱加密,這樣數據就變成了密文。
  • 服務器將加密後的密文發送給客戶端
  • 客戶端收到服務器發送來的密文,用客戶端密鑰對其進行對稱解密,得到服務器發送的數據。這樣HTTPS中的第二個HTTP請求結束,整個HTTPS傳輸完成。

9、接口限流方法

常見的限流算法有:令牌桶、漏桶、Redis計數器。

令牌桶算法(Token Bucket)
令牌桶大小固定,系統會以一個恆定的速度往桶裏放入令牌,而如果請求需要被處理,則需要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。如果令牌不被消耗,或者被消耗的速度小於產生的速度,令牌就會不斷地增多,直到把桶填滿。後面再產生的令牌就會從桶中溢出。最後桶中可以保存的最大令牌數永遠不會超過桶的大小。

令牌桶的另外一個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種算法則實時的計算應該增加的令牌的數量.

** 漏桶算法(Leaky Bucket)**
水(請求)先進入到漏桶裏,漏桶以一定的速度出水(接口有響應速率),當水流入速度過大會直接溢出(訪問頻率超過接口響應速率),然後就拒絕請求,可以看出漏桶算法能強行限制數據的傳輸速率。

可見這裏有兩個變量,一個是桶的大小,支持流量突發增多時可以存多少的水(burst),另一個是水桶漏洞的大小(rate)。

因爲漏桶的漏出速率是固定的參數,所以,即使網絡中不存在資源衝突(沒有發生擁塞),漏桶算法也不能使流突發(burst)到端口速率.因此,漏桶算法對於存在突發特性的流量來說缺乏效率.

基於Redis計數功能的實現

一秒內訪問某一個接口的次數不能超過60次(即QPS),每秒在Redis中創建一個鍵,並且設置鍵的過期時間爲2秒(邊界問題),每一個用戶對此服務接口的訪問就把鍵值加1,在1秒內當鍵值增加到60的時候,就禁止訪問服務接口。在某種場景中添加訪問時間間隔還是很有必要的,也可用於每分鐘、每小時訪問次數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章