友快網

導航選單

spring ioc原始碼深度解析:如何在階段性提高高併發的資料庫內的載入速度

懟專案

spring ioc原始碼

這裡推薦一份資料《Spring原始碼深度解析》,需要的朋友可以去看看

這篇文章

,有免費獲取方式!

高併發場景下讀取資料,redis預熱

快取預熱就是在系統啟動前,提前將相關的快取資料直接載入到快取系統。避免在使用者請求的時候,先查詢資料庫,然後再將資料快取的問題直接查詢事先被預熱的快取資料!

如果不進行預熱, 那麼 Redis 初始狀態資料為空,系統上線初期,對於高併發的流量,都會訪問到資料庫中, 對資料庫造成流量的壓力。

當資料量不大的時候,工程啟動的時候進行載入快取動作;

當資料量大的時候,設定一個定時任務指令碼,進行快取的重新整理;

當資料量太大的時候,優先保證熱點資料進行提前載入到快取。

mysql索引建立原則

1.選擇唯一性索引

唯一性索引的值是唯一的,可以更快速地透過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的欄位。為該欄位建立唯一性索引可以很快地確定某個學生的資訊。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。

2.為經常需要排序、分組和聯合操作的欄位建立索引

經常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的欄位,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。

3.為常作為查詢條件的欄位建立索引

如果某個欄位經常用來做查詢條件,那麼該欄位的查詢速度會影響整個表的查詢速度。因此,為這樣的欄位建立索引,可以提高整個表的查詢速度。

4.限制索引的數目

索引的數目不是越多越好。每個索引都需要佔用磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。

5.儘量使用資料量少的索引

如果索引的值很長,那麼查詢的速度會受到影響。例如,對一個CHAR(100)型別的欄位進行全文檢索需要的時間肯定要比對CHAR(10)型別的欄位需要的時間要多。

6.儘量使用字首來索引

如果索引欄位的值很長,最好使用值得字首來索引。例如,TEXT和BLOG型別的欄位,進行全文檢索會很浪費時間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度。

7.刪除不再使用或者很少使用的索引

表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

8 。 最左字首匹配原則,非常重要的原則。

mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

9 。=和in可以亂序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢最佳化器會幫你最佳化成索引可以識別的形式

10 。 儘量選擇區分度高的列作為索引。

區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大資料面前區分度就 是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的欄位我們都要求是0。1以上,即平均1條掃描10條 記錄

11 。索引列不能參與計算,保持列“乾淨”。

比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的欄位值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本 太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

12 。儘量的擴充套件索引,不要新建索引。

比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

13 。當單個索引欄位查詢資料很多,區分度都不是很大時,則需要考慮建立聯合索引來提高查詢效率

標準sql執行順序

⑤mysql分庫分表分割槽

分割槽

就是把一張表的資料分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的

分表

就是把一張資料量很大的表按一定的規則分解成N個具有獨立儲存空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。表名可以按照某種業務hash進行對映。

分庫

一旦分表,一個庫中的表會越來越多

⑥mysql叢集,redis叢集

Mysql叢集

MySQL叢集是一個無共享的(shared-nothing)、分散式節點架構的儲存方案,其目的是提供容錯性和高效能。

資料更新使用讀已提交隔離級別(read-committedisolation)來保證所有節點資料的一致性,使用兩階段提交機制(two-phasedcommit)保證所有節點都有相同的資料(如果任何一個寫操作失敗,則更新失敗)。

無共享的對等節點使得某臺伺服器上的更新操作在其他伺服器上立即可見。傳播更新使用一種複雜的通訊機制,這一機制專用來提供跨網路的高吞吐量。

透過多個MySQL伺服器分配負載,從而最大程式地達到高效能,透過在不同位置儲存資料保證高可用性和冗餘。

主從複製(Master-Slave Replication)

實現主從複製(Master-Slave Replication)的工作原理:Slave從節點服務啟動並連線到Master之後,它將主動傳送一個SYNC命令。Master服務主節點收到同步命令後將啟動後臺存檔程序,同時收集所有接收到的用於修改資料集的命令,在後臺程序執行完畢後,Master將傳送整個資料庫檔案到Slave,以完成一次完全同步。而Slave從節點服務在接收到資料庫檔案資料之後將其存檔並載入到記憶體中。此後,Master主節點繼續將所有已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些資料修改命令,從而達到最終的資料同步。

如果Master和Slave之間的連結出現斷連現象,Slave可以自動重連Master,但是在連線成功之後,一次完全同步將被自動執行。

哨兵模式

該模式是從Redis的2。6版本開始提供的,但是當時這個版本的模式是不穩定的,直到Redis的2。8版本以後,這個哨兵模式才穩定下來,無論是主從模式,還是哨兵模式,這兩個模式都有一個問題,不能水平擴容,並且這兩個模式的高可用特性都會受到Master主節點記憶體的限制。

Sentinel(哨兵)程序是用於監控redis叢集中Master主伺服器工作的狀態,在Master主伺服器發生故障的時候,可以實現Master和Slave伺服器的切換,保證系統的高可用。

Redis官方 Cluster叢集模式

Redis Cluster是一種伺服器Sharding技術,3。0版本開始正式提供。

在這個圖中,每一個藍色的圈都代表著一個redis的伺服器節點。它們任何兩個節點之間都是相互連通的。客戶端可以與任何一個節點相連線,然後就可以訪問叢集中的任何一個節點。對其進行存取和其他操作。

Jedis sharding叢集

Redis Sharding可以說是在Redis cluster出來之前業界普遍的採用方式,其主要思想是採用 hash演算法將儲存資料的key進行hash雜湊,這樣特定的key會被定為到特定的節點上。

利用中介軟體代理

中介軟體的作用是將我們需要存入redis中的資料的key透過一套演算法計算得出一個值。然後根據這個值找到對應的redis節點,將這些資料存在這個redis的節點中。

常用的中介軟體有這幾種

Twemproxy

Codis

nginx

上一篇:【燒友評測】耳機測評:百元耳機,百元耳機,百元耳機,百元耳機!
下一篇:【燒友評測】降噪耳機的最高境界,諾基亞p3802a耳機體驗評測報告