數(shù)據(jù)插入方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,具體涉及一種數(shù)據(jù)插入方法和裝置。
【背景技術(shù)】
[0002]在開發(fā)線上服務(wù)時,高并發(fā)一直是衡量系統(tǒng)質(zhì)量一個最重要的指標(biāo)之一,也是開發(fā)過程中的技術(shù)難點。在服務(wù)端程序開發(fā)過程中,有四個方面對系統(tǒng)的性能影響最大,它們分別是:數(shù)據(jù)拷貝(Data Copies)、上下文切換(Context Switches)、內(nèi)存分配(Memoryallocat1n)以及鎖競爭(Lock content1n)。
[0003]數(shù)據(jù)拷貝,冗余的數(shù)據(jù)拷貝(復(fù)制)會降低數(shù)據(jù)傳輸?shù)男阅?,進而影響系統(tǒng)性能,一般可以通過一些編程技術(shù)來減少或避免數(shù)據(jù)拷貝,如,多使用指針和引用計數(shù)等。
[0004]上下文切換,在系統(tǒng)運行過程中頻繁進行進程或線程切換,將會導(dǎo)致系統(tǒng)性能急劇下降。一般來說,線程的切換代價要小于進程,這主要是因為進程可以擁有資源,是系統(tǒng)中擁有資源的一個基本單位,而線程自己不擁有系統(tǒng)資源(也有一點必不可少的資源),但它可以訪問其隸屬的進程的資源,即一個進程的代碼段、數(shù)據(jù)段及所擁有的系統(tǒng)資源,如,已打開的文件、I/o設(shè)備等,可以提供該進程中的所有線程鎖共享。
[0005]內(nèi)存分配,在高并發(fā)系統(tǒng)中,如果存在大量的內(nèi)存申請和釋放操作,會導(dǎo)致性能的損失,并且會使系統(tǒng)中出現(xiàn)大量的內(nèi)存碎片,降低內(nèi)存的利用率?,F(xiàn)有技術(shù)中的一種解決方案是采用內(nèi)存池技術(shù),預(yù)分配內(nèi)存,釋放的內(nèi)存由內(nèi)存池統(tǒng)一回收和利用,而并不直接交給操作系統(tǒng)。
[0006]鎖競爭,高效率的鎖非常難規(guī)劃,一方面,鎖的簡單化(粗粒度鎖)會導(dǎo)致并行處理的串行化,降低并發(fā)的效率和系統(tǒng)可伸縮性;另一方面,鎖的復(fù)雜化(細(xì)粒度鎖)在空間占用上和操作時的時間消耗上都可能產(chǎn)生對系統(tǒng)性能的侵蝕。
[0007]綜上所述,需要針對上述存在的問題進行改進,提出一種實現(xiàn)高并發(fā)讀寫的數(shù)據(jù)插入或更新方案。
【發(fā)明內(nèi)容】
[0008]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的數(shù)據(jù)插入方法和相應(yīng)的裝置。
[0009]根據(jù)本發(fā)明的一個方面,提供了一種數(shù)據(jù)插入方法,包括:分配內(nèi)存空間,以創(chuàng)建存儲待插入數(shù)據(jù)的節(jié)點;將待插入數(shù)據(jù)寫入創(chuàng)建的節(jié)點;修改鏈表中相應(yīng)的指針,以使所述創(chuàng)建的節(jié)點插入到所述鏈表中。
[0010]其中,修改鏈表中相應(yīng)的指針,包括:確定所述創(chuàng)建的節(jié)點的插入位置;將所述創(chuàng)建的節(jié)點的指針設(shè)置為指向所述插入位置處兩個節(jié)點中的在后節(jié)點;將所述插入位置處兩個節(jié)點中的在前節(jié)點的指針修改為指向所述創(chuàng)建的節(jié)點。
[0011]其中,還包括:根據(jù)待插入數(shù)據(jù)的鍵的哈希值確定所述待插入數(shù)據(jù)對應(yīng)的鏈表;遍歷所述對應(yīng)的鏈表,判斷所述鏈表中是否存在與所述待插入數(shù)據(jù)鍵相等的節(jié)點;如果所述鏈表中存在與所述待插入數(shù)據(jù)鍵相等的節(jié)點,則終止當(dāng)前操作并返回。
[0012]根據(jù)本發(fā)明的另一個方面,提供了一種數(shù)據(jù)更新方法,包括:分配內(nèi)存空間,以創(chuàng)建存儲更新數(shù)據(jù)的節(jié)點;將更新數(shù)據(jù)寫入創(chuàng)建的節(jié)點;修改鏈表中相應(yīng)的指針,以使所述創(chuàng)建的節(jié)點插入到所述鏈表中。
[0013]其中,修改鏈表中相應(yīng)的指針,包括:將指向原始數(shù)據(jù)所在節(jié)點指針修改為指向所述創(chuàng)建的節(jié)點;將所述創(chuàng)建的節(jié)點的指針設(shè)置為指向所述原始數(shù)據(jù)所在節(jié)點的指針原來所指向的節(jié)點;刪除原始數(shù)據(jù)所在節(jié)點的指針。
[0014]其中,還包括:確定所述原始數(shù)據(jù)所在的節(jié)點。
[0015]其中,確定所述原始數(shù)據(jù)所在的節(jié)點,包括:根據(jù)原始數(shù)據(jù)的鍵的哈希值確定所述原始數(shù)據(jù)所在的鏈表;在所述原始數(shù)據(jù)所在的鏈表中,根據(jù)所述原始數(shù)據(jù)的鍵確定所述原始數(shù)據(jù)所在的節(jié)點。
[0016]其中,還包括:回收原始數(shù)據(jù)所在節(jié)點,并將所述節(jié)點插入空閑鏈表中,以便重新進行分配。
[0017]根據(jù)本發(fā)明的一個方面,提供了一種數(shù)據(jù)插入裝置,包括:分配模塊,用于分配內(nèi)存空間,以創(chuàng)建存儲待插入數(shù)據(jù)的節(jié)點;寫入模塊,用于將待插入數(shù)據(jù)寫入創(chuàng)建的節(jié)點;修改模塊,用于修改鏈表中相應(yīng)的指針,以使所述創(chuàng)建的節(jié)點插入到所述鏈表中。
[0018]其中,所述修改模塊,包括:確定子模塊,用于確定所述創(chuàng)建的節(jié)點的插入位置;設(shè)置子模塊,用于將所述創(chuàng)建的節(jié)點的指針設(shè)置為指向所述插入位置處兩個節(jié)點中的在后節(jié)點;修改子模塊,用于將所述插入位置處兩個節(jié)點中的在前節(jié)點的指針修改為指向所述創(chuàng)建的節(jié)點。
[0019]其中,還包括:確定模塊,用于根據(jù)待插入數(shù)據(jù)的鍵的哈希值確定所述待插入數(shù)據(jù)對應(yīng)的鏈表;判斷模塊,用于遍歷所述對應(yīng)的鏈表,判斷所述鏈表中是否存在與所述待插入數(shù)據(jù)鍵相等的節(jié)點;返回模塊,用于如果所述鏈表中存在與所述待插入數(shù)據(jù)鍵相等的節(jié)點,則終止當(dāng)前操作并返回。
[0020]根據(jù)本發(fā)明的另一個方面,提供了一種數(shù)據(jù)更新裝置,包括:分配模塊,用于分配內(nèi)存空間,以創(chuàng)建存儲更新數(shù)據(jù)的節(jié)點;寫入模塊,用于將更新數(shù)據(jù)寫入創(chuàng)建的節(jié)點;修改模塊,用于修改鏈表中相應(yīng)的指針,以使所述創(chuàng)建的節(jié)點插入到所述鏈表中。
[0021]其中,所述修改模塊,包括:修改子模塊,用于將指向所述原始數(shù)據(jù)所在節(jié)點指針修改為指向所述創(chuàng)建的節(jié)點;設(shè)置子模塊,用于將所述創(chuàng)建的節(jié)點的指針設(shè)置為指向所述原始數(shù)據(jù)所在節(jié)點的指針原來所指向的節(jié)點;刪除子模塊,用于刪除原始數(shù)據(jù)所在節(jié)點的指針。
[0022]其中,所述修改模塊,還包括:確定子模塊,用于確定所述原始數(shù)據(jù)所在的節(jié)點。
[0023]其中,所述確定子模塊,包括:第一確定子模塊,用于根據(jù)原始數(shù)據(jù)的鍵的哈希值確定所述原始數(shù)據(jù)所在的鏈表;第二確定子模塊,用于在所述原始數(shù)據(jù)所在的鏈表中,根據(jù)所述原始數(shù)據(jù)的鍵確定所述原始數(shù)據(jù)所在的節(jié)點。
[0024]其中,還包括:回收模塊,用于回收原始數(shù)據(jù)所在節(jié)點,并將所述節(jié)點插入空閑鏈表中,以便重新進行分配。
[0025]根據(jù)本發(fā)明的技術(shù)方案,在寫入新數(shù)據(jù)時,分配新的內(nèi)存空間進行寫更新,當(dāng)數(shù)據(jù)的寫入完成時再修改指針,可以支持在多線程并發(fā)的情況下,一個線程進行寫操作,多個線程進行讀操作,且在線程讀、寫的過程中,都不需要對數(shù)據(jù)加鎖。并且,對鏈表中刪除的節(jié)點空間進行回收加入空閑鏈表,當(dāng)需要分配新的內(nèi)存空間時,可以直接利用回收的空閑內(nèi)存。
[0026]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的【具體實施方式】。
【附圖說明】
[0027]通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0028]圖1示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)插入方法的流程圖;
[0029]圖2示出了根據(jù)本發(fā)明一個實施例的循環(huán)雙向鏈表的結(jié)構(gòu)示意圖;
[0030]圖3示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)插入方法中修改鏈表中相應(yīng)的指針的步驟的流程圖;
[0031]圖4示出了根據(jù)本發(fā)明的另一個實施例的數(shù)據(jù)插入方法的流程圖;
[0032]圖5a示出了根據(jù)本發(fā)明一個實施例的Hashmap的存儲結(jié)構(gòu)示意圖;
[0033]圖5b示出了根據(jù)本發(fā)明一個實施例的Hashmap存儲結(jié)構(gòu)中每個節(jié)點的結(jié)構(gòu)示意圖;
[0034]圖6示出了根據(jù)本發(fā)明另一個實施例的數(shù)據(jù)插入方法中修改鏈表中相應(yīng)的指針的流程圖;
[0035]圖7示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)更新方法的流程圖;
[0036]圖8示出了根據(jù)本發(fā)明一個實施例的數(shù)據(jù)更新方法中修改鏈表中相應(yīng)的指針的步驟的流程圖;
[0037]圖9示出了根據(jù)本發(fā)明的另一個實施例的數(shù)據(jù)更新方法的流程圖;
[0038]圖10示出了根據(jù)本發(fā)明另一個實施例的數(shù)據(jù)更新方法中修改鏈表中相應(yīng)的指針的流程圖;
[0039]圖11示出了根據(jù)本發(fā)明的一個實施例的確定所述原始數(shù)據(jù)所在的節(jié)點的流程圖;
[0040]圖12示出了根據(jù)本發(fā)明一實施例的數(shù)據(jù)插入裝置的結(jié)構(gòu)框圖;以及
[0041]圖13示出了根據(jù)本發(fā)明一實施例的數(shù)據(jù)更新裝置的結(jié)構(gòu)框圖。
【具體實施方式】
[0042]下面將參照附圖更詳細(xì)地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。
[0043]Java提供的Concurrent編程框架是目前使用最廣泛的并發(fā)框架,該框架包含了一組并發(fā)處理的數(shù)據(jù)結(jié)構(gòu),提供了幾個設(shè)計用于多線程上下文中的Collect1n (如,線性表、鏈表、哈希表)實現(xiàn),如,ConcurrentHashMap (并發(fā)散列映射)、CopyOnffriteArrayList (寫時復(fù)制數(shù)組列表)等。
[0044]ConcurrentHashMap可以做到讀取數(shù)據(jù)不加鎖,并且其內(nèi)部的結(jié)構(gòu)可以讓其在進行寫操作的時候能夠?qū)㈡i的粒度保持得盡量地小,不用對整個ConcurrentHashMap加鎖。ConcurrentHashMap通過對map表(映射表)進行分段,每個段分別加鎖,不同段之間可以并發(fā)進行讀寫。相對于傳統(tǒng)的在多線程環(huán)境中使用hashmap (哈希映射)對整個map表加鎖而言,這種設(shè)計方案能夠大大降低鎖的粒度,因此在高并發(fā)環(huán)境中性能有很大提升。
[0045]CopyOnffriteArrayList在進行數(shù)據(jù)修改時,不會對數(shù)據(jù)進行鎖定,每次修改時,先拷貝整個數(shù)組,然后修改其中的一些元素,完成上述操作后,替換整個數(shù)組的指針。對CopyOnffriteArrayList進行讀取時,也不