本發(fā)明涉及預(yù)測目的的數(shù)據(jù)處理程序控制裝置及控制方法,尤其涉及一種降低因高并發(fā)數(shù)據(jù)處理導(dǎo)致的系統(tǒng)資源占用的方法和系統(tǒng)。
背景技術(shù):
秒殺業(yè)務(wù)作為高并發(fā)數(shù)據(jù)處理業(yè)務(wù)之一,具有商品種類少,短時(shí)間訪問量巨大的特點(diǎn),可能會出現(xiàn)響應(yīng)時(shí)間慢,甚至系統(tǒng)短時(shí)間癱瘓的問題。
業(yè)界在解決高并發(fā)數(shù)據(jù)處理的問題時(shí),主要有以下幾種解決方案:把事件統(tǒng)一發(fā)送到一個消息中間件集群中,以此為中介再發(fā)送到訂閱消息的客戶端;利用分布式計(jì)算框架把事件分發(fā)到不同的機(jī)器上處理;把事件送入數(shù)據(jù)流并根據(jù)預(yù)先配置好的模式或規(guī)則進(jìn)行不停的匹配,均不能有效解決上述問題。
顧客通過客戶端發(fā)送秒殺某個商品的數(shù)據(jù)請求,過多的客戶發(fā)送秒殺請求會形成高并發(fā)數(shù)據(jù)請求等待系統(tǒng)處理,系統(tǒng)對數(shù)據(jù)庫的操作為單線程操作,因此會在系統(tǒng)中對數(shù)據(jù)庫的個別商品記錄上產(chǎn)生大量操作鎖,從而在數(shù)據(jù)庫讀寫操作時(shí)產(chǎn)生嚴(yán)重的瓶頸,大大增加了數(shù)據(jù)庫的讀寫時(shí)間,降低了數(shù)據(jù)庫讀寫請求處理的信息的速度,表現(xiàn)為響應(yīng)時(shí)間慢,系統(tǒng)短時(shí)間癱瘓等現(xiàn)象。因此,在高并發(fā)數(shù)據(jù)處理的過程中,如何減少系統(tǒng)資源的占用成為需要解決的技術(shù)問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于提供一種減少高并發(fā)請求下數(shù)據(jù)庫的操作鎖,提高了數(shù)據(jù)庫的并發(fā)請求信息的處理速度的處理高并發(fā)數(shù)據(jù)請求的方法。
本發(fā)明提供了一種處理高并發(fā)數(shù)據(jù)請求的方法,其特征在于,包括:
將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;
將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;
采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理;
將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫。
本發(fā)明提供的優(yōu)選的處理高并發(fā)數(shù)據(jù)請求的方法還包括限制分布式內(nèi)存緩存單元數(shù)據(jù)容量的步驟,在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元的過程中,如數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋。通過此步驟,可以將大量未寫入分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力。
還可包括確定所述分布式內(nèi)存緩存的數(shù)量的步驟,通過上述數(shù)據(jù)庫的容量和內(nèi)存緩存單元數(shù)量確定內(nèi)存緩存單元數(shù)據(jù)容量的步驟。對于單個內(nèi)存緩存的數(shù)據(jù)處理能力可以通過將寫入到數(shù)據(jù)庫的容量向分布式內(nèi)存緩存分配的方式進(jìn)行,通過此步驟可以根據(jù)分布式內(nèi)存緩存的數(shù)量進(jìn)一步優(yōu)化單個內(nèi)存緩存的數(shù)據(jù)接受能力,降低單個內(nèi)存緩存的數(shù)據(jù)處理壓力。
還可包括擴(kuò)展所述分布式內(nèi)存緩存的步驟,分布式內(nèi)存緩存采用REDIS緩存構(gòu)架或MEMCACHED緩存構(gòu)架,能有效將并發(fā)消息處理進(jìn)行隊(duì)列排布,可以根據(jù)需求靈活配置相關(guān)內(nèi)存緩存的數(shù)量以匹配需求。
作為本發(fā)明提供的處理高并發(fā)數(shù)據(jù)請求的方法的一種數(shù)據(jù)請求,該數(shù)據(jù)請求為秒殺搶購商品數(shù)據(jù)請求。
本發(fā)明還提供了一種處理高并發(fā)數(shù)據(jù)請求的系統(tǒng),包括:負(fù)載均衡模塊,服務(wù)器單元,內(nèi)存緩存單元,異步處理模塊,數(shù)據(jù)庫;負(fù)載均衡模塊將多個客戶端發(fā)送的數(shù)據(jù)請求分?jǐn)偟蕉鄠€服務(wù)器單元;多個服務(wù)器單元將本服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;異步處理模塊將分布式緩存單元中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫。
在本發(fā)明提供的處理高并發(fā)數(shù)據(jù)請求的系統(tǒng)分布式內(nèi)存緩存包括容量限制模塊,用于在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元的過程中,如數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋。通過此模塊,可以將大量未寫入分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力。
再在處理高并發(fā)數(shù)據(jù)請求的系統(tǒng)上設(shè)置分布式內(nèi)存緩存包括容量計(jì)算模塊,通過上述數(shù)據(jù)庫的容量和內(nèi)存緩存單元數(shù)量確定內(nèi)存緩存單元數(shù)據(jù)容量。
分布式內(nèi)存緩存可擴(kuò)展,采用REDIS緩存構(gòu)架或MEMCACHED緩存構(gòu)架,能有效將并發(fā)消息處理進(jìn)行隊(duì)列排布。
作為本發(fā)明提供的處理高并發(fā)數(shù)據(jù)請求的系統(tǒng)所處理的一種數(shù)據(jù)請求,該數(shù)據(jù)請求為秒殺搶購商品數(shù)據(jù)請求。
本發(fā)明的有益效果是:本發(fā)明通過將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理;將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫的方法和系統(tǒng)的提供,實(shí)現(xiàn)了減少高并發(fā)請求下數(shù)據(jù)庫的操作鎖,提高了數(shù)據(jù)庫的并發(fā)請求信息的處理速度。
附圖說明
圖1為本發(fā)明所提供的實(shí)施例1的數(shù)據(jù)處理方法示意圖。
圖2為本發(fā)明所提供的實(shí)施例2的數(shù)據(jù)處理方法示意圖。
圖3為本發(fā)明所提供的實(shí)施例3的數(shù)據(jù)處理方法示意圖。
圖4為本發(fā)明所提供的實(shí)施例4的數(shù)據(jù)處理系統(tǒng)示意圖。
圖5為本發(fā)明所提供的實(shí)施例5的數(shù)據(jù)處理系統(tǒng)中分布式內(nèi)存緩存單元及容量限制模塊示意圖。
圖6為本發(fā)明所提供的實(shí)施例6的數(shù)據(jù)處理系統(tǒng)中分布式內(nèi)存緩存單元、容量限制模塊及容量計(jì)算模塊示意圖。
具體實(shí)施方式
首先,說明本發(fā)明的基礎(chǔ):
1、負(fù)載均衡:英文名稱為Load Balance,其意思就是分?jǐn)偟蕉鄠€操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,它提供了一種擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性的方法。
2、并發(fā):在關(guān)系數(shù)據(jù)庫中,允許多個用戶同時(shí)訪問和更改共享數(shù)據(jù)的進(jìn)程。SQL Server 使用鎖定以允許多個用戶同時(shí)訪問和更改共享數(shù)據(jù)而彼此之間不發(fā)生沖突。
3、高并發(fā)數(shù)據(jù)請求:高并發(fā)數(shù)據(jù)請求則是指由于客戶端的短時(shí)間大量數(shù)據(jù)請求,使得在關(guān)系數(shù)據(jù)庫中同時(shí)訪問和更改共享數(shù)據(jù)的用戶非常多,產(chǎn)生大量的SQL Server 鎖操作。
4、分布式內(nèi)存緩存:分布式存儲系統(tǒng),是將數(shù)據(jù)分散存儲在多臺獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲系統(tǒng)采用集中的存儲服務(wù)器存放所有數(shù)據(jù),存儲服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲應(yīng)用的需要。分布式網(wǎng)絡(luò)存儲系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺存儲服務(wù)器分擔(dān)存儲負(fù)荷,利用位置服務(wù)器定位存儲信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。常見的包括REDIS緩存、MEMCACHED緩存等。
5、異步處理:異步處理就是按照不同步的程序處理問題。異步處理與同步處理是對立的,而產(chǎn)生他們的是多線程或者多進(jìn)程。異步處理的好處就是提高設(shè)備使用率,從而在宏觀上提升程序運(yùn)行效率。
6、鎖操作:MySQL 支持對MyISAM和MEMORY表進(jìn)行表級鎖定,對BDB表進(jìn)行頁級鎖定,對InnoDB表進(jìn)行行級鎖定。對WRITE,MySQL使用的表鎖定方法原理如下:如果在表上沒有鎖,在它上面放一個寫鎖。否則,把鎖定請求放在寫鎖定隊(duì)列中。對READ,MySQL使用的鎖定方法原理如下:如果在表上沒有寫鎖定,把一個讀鎖定放在它上面;否則,把鎖請求放在讀鎖定隊(duì)列中。InnoDB使用行鎖定,BDB使用頁鎖定。對于這兩種存儲引擎,都可能存在死鎖。這是因?yàn)椋赟QL語句處理期間,InnoDB自動獲得行鎖定和BDB獲得頁鎖定,而不是在事務(wù)啟動時(shí)獲得。
7、客戶端:客戶端(Client)或稱為用戶端,是指與服務(wù)器相對應(yīng),為客戶提供本地服務(wù)的程序。除了一些只在本地運(yùn)行的應(yīng)用程序之外,一般安裝在普通的客戶機(jī)上,需要與服務(wù)端互相配合運(yùn)行。因特網(wǎng)發(fā)展以后,較常用的用戶端包括了如萬維網(wǎng)使用的網(wǎng)頁瀏覽器,收寄電子郵件時(shí)的電子郵件客戶端,以及即時(shí)通訊的客戶端軟件等。對于這一類應(yīng)用程序,需要網(wǎng)絡(luò)中有相應(yīng)的服務(wù)器和服務(wù)程序來提供相應(yīng)的服務(wù),如數(shù)據(jù)庫服務(wù),電子郵件服務(wù)等等,這樣在客戶機(jī)和服務(wù)器端,需要建立特定的通信連接,來保證應(yīng)用程序的正常運(yùn)行。
下面結(jié)合附圖對本發(fā)明做更詳細(xì)的說明。
實(shí)施例1:
如圖1所示,本實(shí)施例提供的數(shù)據(jù)處理方法包括:S101將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;S102將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;S103采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理;S104將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫。
將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元,在本實(shí)施例中通過NGINX反向代理PHP能達(dá)到負(fù)載均衡;將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元,本實(shí)施例采用REDIS緩存,加入了REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理,本實(shí)施例采用后臺WORKER異步處理數(shù)據(jù),數(shù)據(jù)請求寫入MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作。
在秒殺搶購商品的過程中,客戶在秒殺開始的瞬間發(fā)送大量數(shù)據(jù)請求,所有數(shù)據(jù)請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);由于客戶端發(fā)送的數(shù)據(jù)請求來自各個網(wǎng)絡(luò)節(jié)點(diǎn),可能導(dǎo)致某些服務(wù)器的數(shù)據(jù)請求多,某些服務(wù)器的數(shù)據(jù)請求少,數(shù)據(jù)請求多的服務(wù)器處理速度慢,數(shù)據(jù)請求少的服務(wù)器處于空閑狀態(tài);通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的數(shù)據(jù)請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向REDIS內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺數(shù)據(jù)請求,加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓秒殺數(shù)據(jù)請求有序的存入到內(nèi)存中;不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)進(jìn)行處理寫入到MYSQL集群中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
實(shí)施例2:
如圖2所示,本實(shí)施例提供的數(shù)據(jù)處理方法包括:S201將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;S202將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;S203限制分布式內(nèi)存緩存單元數(shù)據(jù)容量,在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元的過程中,當(dāng)數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋;S204采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理;S205將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫。
將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;數(shù)據(jù)請求通過反向代理負(fù)載均衡,在本實(shí)施例中通過NGINX反向代理PHP能達(dá)到負(fù)載均衡;將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元,本實(shí)施例采用MEMCACHED緩存,加入了MEMCACHED集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;限制分布式內(nèi)存緩存單元數(shù)據(jù)容量,在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元的過程中,如數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋;采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理,將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫,本實(shí)施例采用后臺WORKER異步處理數(shù)據(jù),數(shù)據(jù)請求寫入到MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作。
在秒殺搶購商品的過程中,客戶在秒殺開始的瞬間發(fā)送大量數(shù)據(jù)請求,所有數(shù)據(jù)請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的數(shù)據(jù)請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向MEMCACHED內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺數(shù)據(jù)請求,加入MEMCACHED 集群隊(duì)列,隊(duì)列的作用是讓秒殺數(shù)據(jù)請求有序的存入到內(nèi)存中。MEMCACHED內(nèi)存緩存單元具有容量限制,在將秒殺的數(shù)據(jù)請求載入MEMCACHED分布式內(nèi)存緩存單元的過程中,如數(shù)據(jù)請求數(shù)量超過MEMCACHED內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋。不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)進(jìn)行處理寫入到MYSQL集群中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
實(shí)施例3:
如圖3所示,本實(shí)施例提供的數(shù)據(jù)處理方法包括:S301將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;S302將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元;S303確定所述分布式內(nèi)存緩存的數(shù)量,通過上述數(shù)據(jù)庫的容量和內(nèi)存緩存單元數(shù)量確定內(nèi)存緩存單元數(shù)據(jù)容量;S304限制分布式內(nèi)存緩存單元數(shù)據(jù)容量,在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元的過程中,當(dāng)數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋;S305采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理;S306將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫。
將多個客戶端發(fā)送的數(shù)據(jù)請求通過負(fù)載均衡分?jǐn)偟蕉鄠€服務(wù)器單元;數(shù)據(jù)請求通過反向代理負(fù)載均衡,在本實(shí)施例中通過NGINX反向代理PHP能達(dá)到負(fù)載均衡;確定所述分布式內(nèi)存緩存的數(shù)量,通過上述數(shù)據(jù)庫的容量和內(nèi)存緩存單元數(shù)量確定內(nèi)存緩存單元數(shù)據(jù)容量,將MYSQL數(shù)據(jù)庫的容量向分布式內(nèi)存緩存分配,可以采用均衡或不均衡的分配方式;將多個服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元,將數(shù)據(jù)請求載入分布式內(nèi)存緩存,本實(shí)施例采用REDIS緩存,加入了REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;當(dāng)數(shù)據(jù)請求數(shù)量超過限制時(shí),將數(shù)據(jù)請求拒絕寫入的消息反饋至客戶端,以滿足所述數(shù)據(jù)請求寫入分布式內(nèi)存緩存數(shù)量限制要求;采用異步處理逐個對分布式緩存單元中的數(shù)據(jù)請求進(jìn)行處理,將異步處理后的數(shù)據(jù)請求寫入到數(shù)據(jù)庫,本實(shí)施例采用后臺WORKER異步處理數(shù)據(jù),數(shù)據(jù)請求寫入到MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作。
在秒殺搶購商品的過程中,客戶在秒殺開始的瞬間發(fā)送大量數(shù)據(jù)請求,所有數(shù)據(jù)請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);發(fā)布秒殺商品時(shí),把秒殺商品的數(shù)量分布到個REDIS集群隊(duì)列中,隊(duì)列的數(shù)量根據(jù)實(shí)際參與秒殺用戶的規(guī)模和商品數(shù)量來增加,如:總庫存10000,配置10個隊(duì)列,則每個隊(duì)列的庫存為1000/10=1000,這樣處理的目的是為了解決當(dāng)搶購商品的數(shù)量大,參與搶購的用戶多,并發(fā)量大增,避免單臺REDIS 無法承受請求壓力。通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的數(shù)據(jù)請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向REDIS內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺數(shù)據(jù)請求,加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓秒殺數(shù)據(jù)請求有序的存入到內(nèi)存中;當(dāng)PHP服務(wù)器收到秒殺數(shù)據(jù)請求時(shí),根據(jù)用戶賬號ID一致性哈希算法或通過用戶賬號ID取模后請求到REDIS集群隊(duì)列中,入隊(duì)之前通過“DECR MQ_KEY_NUM”REDIS命令判斷是否大于1,如果是,則存入內(nèi)存隊(duì)列后直接返回秒殺成功,否則提醒秒殺失敗,不再對MYSQL進(jìn)行操作,這樣解決了大訪問量并發(fā)時(shí)響應(yīng)慢的問題。不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)永久寫入到MYSQL數(shù)據(jù)庫中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
實(shí)施例4:
如圖4所示,本實(shí)施例提供一種數(shù)據(jù)處理系統(tǒng),包括:402負(fù)載均衡模塊,403服務(wù)器單元,404內(nèi)存緩存單元,405異步處理模塊,406數(shù)據(jù)庫;負(fù)載均衡模塊402將多個客戶端401發(fā)送的數(shù)據(jù)請求分?jǐn)偟蕉鄠€服務(wù)器單元403;多個服務(wù)器單元403將本服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元404;異步處理模塊405將分布式緩存單元404中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫406。
負(fù)載均衡模塊采用NGINX反向代理PHP服務(wù)器接收客戶端在短時(shí)間內(nèi)發(fā)送的大量數(shù)據(jù)請求,并對客戶端發(fā)送來的數(shù)據(jù)請求進(jìn)行負(fù)載均衡;PHP服務(wù)器向分布式REDIS內(nèi)存緩存提交經(jīng)負(fù)載均衡后的數(shù)據(jù)請求,REDIS內(nèi)存緩存將數(shù)據(jù)加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;異步處理模塊把分布式REDIS內(nèi)存緩存中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫中,本實(shí)施例采用后臺WORKER異步處理數(shù)據(jù),數(shù)據(jù)請求寫入到MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作;MYSQL數(shù)據(jù)庫,用于進(jìn)行原始數(shù)據(jù)請求和處理后的數(shù)據(jù)請求的存儲。
在秒殺搶購商品的過程中,客戶通過客戶端在秒殺開始的瞬間發(fā)送大量數(shù)據(jù)請求,所有數(shù)據(jù)請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);負(fù)載均衡服模塊通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向REDIS內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺請求,加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓秒殺請求數(shù)據(jù)有序的存入到內(nèi)存中;不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理模塊處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)進(jìn)行處理寫入到MYSQL數(shù)據(jù)庫中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
實(shí)施例5:
如圖4和圖5所示,本實(shí)施例提供一種數(shù)據(jù)處理系統(tǒng),包括:402負(fù)載均衡模塊,403服務(wù)器單元,404內(nèi)存緩存單元,405異步處理模塊,406數(shù)據(jù)庫;負(fù)載均衡模塊402將多個客戶端401發(fā)送的數(shù)據(jù)請求分?jǐn)偟蕉鄠€服務(wù)器單元403;多個服務(wù)器單元403將本服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元404;異步處理模塊405將分布式緩存單元404中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫406。分布式內(nèi)存緩存406包括容量限制模塊501,用于在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元404的過程中,當(dāng)數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元404數(shù)據(jù)容量,拒絕載入并反饋至客戶端401。
客戶端在短時(shí)間內(nèi)發(fā)送大量的數(shù)據(jù)請求;負(fù)載均衡服模塊采用NGINX反向代理PHP服務(wù)器,用于對客戶端發(fā)送來的數(shù)據(jù)請求進(jìn)行負(fù)載均衡;通過PHP服務(wù)器向分布式REDIS內(nèi)存緩存提交經(jīng)負(fù)載均衡后的客戶端發(fā)送來的數(shù)據(jù)請求,加入了REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;設(shè)置分布式內(nèi)存緩存容量限制模塊,用于當(dāng)數(shù)據(jù)請求數(shù)量超過限制時(shí),將數(shù)據(jù)請求拒絕寫入的消息反饋至客戶端,將大量未寫入REDIS分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低REDIS分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力;異步處理模塊把分布式內(nèi)存緩存中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫中,本實(shí)施例采用后臺WORKER異步處理模塊處理數(shù)據(jù),數(shù)據(jù)請求寫入到MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作;MYSQL數(shù)據(jù)庫,用于進(jìn)行原始數(shù)據(jù)請求和處理后的數(shù)據(jù)請求的存儲。
在秒殺搶購商品的過程中,客戶通過客戶端在秒殺開始的瞬間發(fā)送大量請求,所有請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);負(fù)載均衡服模塊通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向REDIS內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺請求,加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓秒殺請求有序的存入到內(nèi)存中;設(shè)置分布式內(nèi)存緩存容量限制模塊,用于當(dāng)數(shù)據(jù)請求數(shù)量超過限制時(shí),將數(shù)據(jù)請求拒絕寫入的消息反饋至客戶端,將大量未寫入REDIS分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低REDIS分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力;當(dāng)PHP服務(wù)器收到秒殺請求時(shí),根據(jù)用戶賬號ID一致性哈希算法或通過用戶賬號ID取模后請求到REDIS集群隊(duì)列中,入隊(duì)之前通過“DECR MQ_KEY_NUM”REDIS命令判斷是否大于1,如果是,則存入內(nèi)存隊(duì)列后直接返回秒殺成功,否則提醒秒殺失敗,不再對MYSQL進(jìn)行操作,這樣解決了大訪問量并發(fā)時(shí)響應(yīng)慢的問題。不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)進(jìn)行處理寫入到MYSQL數(shù)據(jù)庫中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
實(shí)施例6:
如圖4和圖6所示,本實(shí)施例提供一種數(shù)據(jù)處理系統(tǒng),包括:402負(fù)載均衡模塊,403服務(wù)器單元,404內(nèi)存緩存單元,405異步處理模塊,406數(shù)據(jù)庫;負(fù)載均衡模塊402將多個客戶端401發(fā)送的數(shù)據(jù)請求分?jǐn)偟蕉鄠€服務(wù)器單元403;多個服務(wù)器單元403將本服務(wù)器單元中的數(shù)據(jù)請求分別載入與之對應(yīng)的分布式內(nèi)存緩存單元404;異步處理模塊405將分布式緩存單元404中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫406;分布式內(nèi)存緩存404包括容量限制模塊501,用于在將數(shù)據(jù)請求載入分布式內(nèi)存緩存單元404的過程中,當(dāng)數(shù)據(jù)請求數(shù)量超過內(nèi)存緩存單元數(shù)據(jù)容量,拒絕載入并反饋至客戶端401;分布式內(nèi)存緩存404包括容量計(jì)算模塊601,通過上述數(shù)據(jù)庫的容量和內(nèi)存緩存單元數(shù)量確定內(nèi)存緩存單元404數(shù)據(jù)容量。
客戶端在短時(shí)間內(nèi)發(fā)送大量的數(shù)據(jù)請求;負(fù)載均衡服模塊采用NGINX反向代理PHP服務(wù)器,用于對客戶端發(fā)送來的數(shù)據(jù)請求進(jìn)行負(fù)載均衡;通過PHP服務(wù)器向分布式REDIS內(nèi)存緩存提交經(jīng)負(fù)載均衡后的客戶端發(fā)送來的數(shù)據(jù)請求,加入了REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓大量的數(shù)據(jù)請求有序的存入到內(nèi)存中;設(shè)置分布式內(nèi)存緩存容量限制模塊,用于當(dāng)數(shù)據(jù)請求數(shù)量超過限制時(shí),將數(shù)據(jù)請求拒絕寫入的消息反饋至客戶端,將大量未寫入REDIS分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低REDIS分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力;設(shè)置分布式內(nèi)存緩存容量計(jì)算模塊,用于將寫入到數(shù)據(jù)庫的容量向分布式內(nèi)存緩存分配,通過此模塊可以根據(jù)分布式內(nèi)存緩存的數(shù)量進(jìn)一步優(yōu)化單個內(nèi)存緩存的數(shù)據(jù)接受能力,進(jìn)一步降低單個內(nèi)存緩存的數(shù)據(jù)處理壓力;異步處理模塊把分布式內(nèi)存緩存中的數(shù)據(jù)請求寫入到數(shù)據(jù)庫中,本實(shí)施例采用后臺WORKER異步處理數(shù)據(jù),數(shù)據(jù)請求寫入到MYSQL數(shù)據(jù)庫中,后臺WORKER異步處理數(shù)據(jù)會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止,不再使用MYSQL鎖的控制順序操作;MYSQL數(shù)據(jù)庫,用于進(jìn)行原始數(shù)據(jù)請求和處理后的數(shù)據(jù)請求的存儲。
在秒殺搶購商品的過程中,客戶通過客戶端在秒殺開始的瞬間發(fā)送大量請求,所有請求處于并發(fā)狀態(tài),等待系統(tǒng)響應(yīng);負(fù)載均衡服模塊通過NGINX反向代理PHP能達(dá)到負(fù)載均衡,將需要處理的大量秒殺的請求均衡負(fù)載到PHP服務(wù)器;PHP服務(wù)器向REDIS內(nèi)存隊(duì)列發(fā)送經(jīng)過平衡后的秒殺請求,加入REDIS CLUSTER 集群隊(duì)列,隊(duì)列的作用是讓秒殺請求有序的存入到內(nèi)存中;設(shè)置分布式內(nèi)存緩存容量限制模塊,用于當(dāng)數(shù)據(jù)請求數(shù)量超過限制時(shí),將數(shù)據(jù)請求拒絕寫入的消息反饋至客戶端,將大量未寫入REDIS分布式內(nèi)存緩存的數(shù)據(jù)請求進(jìn)行拒絕處理,有效降低REDIS分布式內(nèi)存緩存的數(shù)據(jù)處理數(shù)量,避免了單個內(nèi)存緩存的數(shù)據(jù)處理壓力;當(dāng)PHP服務(wù)器收到秒殺請求時(shí),根據(jù)用戶賬號ID一致性哈希算法或通過用戶賬號ID取模后請求到REDIS集群隊(duì)列中,入隊(duì)之前通過“DECR MQ_KEY_NUM”REDIS命令判斷是否大于1,如果是,則存入內(nèi)存隊(duì)列后直接返回秒殺成功,否則提醒秒殺失敗,不再對MYSQL進(jìn)行操作,這樣解決了大訪問量并發(fā)時(shí)響應(yīng)慢的問題。設(shè)置分布式內(nèi)存緩存容量計(jì)算模塊,用于將寫入到數(shù)據(jù)庫的容量向分布式內(nèi)存緩存分配,發(fā)布秒殺商品時(shí),把秒殺商品的數(shù)量分布到個REDIS集群隊(duì)列中,隊(duì)列的數(shù)量根據(jù)實(shí)際參與秒殺用戶的規(guī)模和商品數(shù)量來增加,如:總庫存10000,配置10個隊(duì)列,則每個隊(duì)列的庫存為1000/10=1000,這樣處理的目的是為了解決當(dāng)搶購商品的數(shù)量大,參與搶購的用戶多,并發(fā)量大增,避免單臺REDIS 無法承受請求壓力。通過此模塊可以根據(jù)分布式內(nèi)存緩存的數(shù)量進(jìn)一步優(yōu)化單個內(nèi)存緩存的數(shù)據(jù)接受能力,降低單個內(nèi)存緩存的數(shù)據(jù)處理壓力;不再使用MYSQL鎖的控制順序操作,改用了后臺WORKER異步處理數(shù)據(jù),把秒殺到的用戶數(shù)據(jù)進(jìn)行處理寫入到MYSQL數(shù)據(jù)庫中,WORK程序會一直在循環(huán)處理隊(duì)列信息,處理到REDIS隊(duì)列中的數(shù)據(jù)完成為止。
本實(shí)施例中,REDIS、PHP、WORKER數(shù)量可以根據(jù)實(shí)際需要靈活配置,以滿足并發(fā)處理正常工作要求。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。