本申請涉及計算機(jī)
技術(shù)領(lǐng)域:
,尤其涉及一種序列號生成方法及裝置。
背景技術(shù):
:序列號通常用來作為業(yè)務(wù)的唯一標(biāo)識,在業(yè)務(wù)處理過程中得到了廣泛的應(yīng)用。比如,在生成訂單的過程中,通過序列號來唯一標(biāo)識對應(yīng)的訂單;在記錄交易的過程中,通過序列號來唯一標(biāo)識每一筆交易。目前通常使用諸如hilo高低位算法、數(shù)據(jù)庫自增主鍵等方式生成序列號。當(dāng)通過hilo高低位算法生成序列號時,將該hilo高低位算法作為數(shù)據(jù)源,從該數(shù)據(jù)源中獲得數(shù)值(hilo高低位算法得到的值)之后,通過該數(shù)值生成序列號;當(dāng)通過數(shù)據(jù)庫自增主鍵等其它方式生成序列號時,也是將數(shù)據(jù)庫自增序列(該自增序列通??梢宰鳛閿?shù)據(jù)庫的主鍵)等作為數(shù)據(jù)源,并通過從數(shù)據(jù)源中獲取的數(shù)值生成序列號。然而,在實際應(yīng)用中,從數(shù)據(jù)源中獲取數(shù)值時,通常會出現(xiàn)數(shù)值獲取失敗的情況。目前的這種序列號生成方式,當(dāng)從某個數(shù)據(jù)源中獲取數(shù)值失敗時,會導(dǎo)致無法生成序列號。技術(shù)實現(xiàn)要素:本申請實施例提供一種序列號生成方法及裝置,用于解決現(xiàn)有技術(shù)中當(dāng)從某個數(shù)據(jù)源中獲取數(shù)值失敗時,導(dǎo)致無法生成序列號的問題。本申請實施里提供了一種序列號生成方法,該方法包括:序列號生成器當(dāng)從與所述序列號生成器關(guān)聯(lián)的第一數(shù)據(jù)源中獲取數(shù)值失敗時,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源;序列號生成器從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值;序列號生成器根據(jù)所獲取的數(shù)值生成序列號。優(yōu)選地,根據(jù)所獲取的數(shù)值生成序列號,具體包括:獲取序列號定義表的數(shù)據(jù)源標(biāo)識字段的第一屬性值;根據(jù)所獲取的數(shù)值以及所述第一屬性值生成序列號。優(yōu)選地,根據(jù)所獲取的數(shù)值以及所述第一屬性值生成序列號,具體包括:將所述數(shù)值以及所述第一屬性值,根據(jù)所述序列號定義表的序列號格式化字段的第二屬性值的格式進(jìn)行格式化處理;根據(jù)格式化處理的結(jié)果生成序列號。優(yōu)選地,從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值,具體為:根據(jù)序列號定義表的序列號當(dāng)前值字段的第三屬性值從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值,所述第三屬性值與上一次所生成的序列號相對應(yīng)。優(yōu)選地,根據(jù)所獲取的數(shù)值生成序列號,具體包括:將所獲取的所述數(shù)值與獲取所述數(shù)值時的時間點相結(jié)合生成序列號。優(yōu)選地,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,具體包括:根據(jù)預(yù)設(shè)的數(shù)據(jù)源優(yōu)先級順序,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源;或,根據(jù)用戶的輸入信息,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源。優(yōu)選地,從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值,具體包括:獲取所述目標(biāo)數(shù)據(jù)源對應(yīng)的鎖對象或接口函數(shù);根據(jù)所獲取的鎖對象或接口函數(shù)從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值。優(yōu)選地,通過如下方式確定從第一數(shù)據(jù)源中獲取數(shù)值失敗:當(dāng)從所述第一數(shù)據(jù)源中獲取數(shù)據(jù)的時間大于預(yù)設(shè)時間閾值時,確定從所述第一數(shù)據(jù)源中獲取數(shù)值失敗。優(yōu)選地,當(dāng)從與所述序列號生成器關(guān)聯(lián)的第一數(shù)據(jù)源中獲取數(shù)值成功時,根據(jù)所獲取的所述數(shù)值生成序列號。本申請實施例還提供了一種序列號生成裝置,所述裝置用于序列號生成器,所述裝置包括:確定單元、獲取單元以及生成單元,其中:所述確定單元,當(dāng)從與所述序列號生成器關(guān)聯(lián)的第一數(shù)據(jù)源中獲取數(shù)值失敗時,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源;所述獲取單元,從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值;所述生成單元,根據(jù)所獲取的數(shù)值生成序列號。本申請實施例采用的上述至少一個技術(shù)方案能夠達(dá)到以下有益效果:采用很申請實施例所提供的序列號生成方法,由于序列號生成器當(dāng)從所關(guān)聯(lián)第一數(shù)據(jù)源中獲取數(shù)值失敗時,可以從與該序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,從該目標(biāo)數(shù)據(jù)源中獲取數(shù)值,并根據(jù)從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值生成序列號。從而解決了現(xiàn)有技術(shù)中,從數(shù)據(jù)源中獲取數(shù)值失敗時,無法生成序列號的問題。附圖說明此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:圖1為本申請實施例1提供的一種序列號生成方法的具體實現(xiàn)流程示意圖;圖2為本申請實施例1提供的一種序列號生成方法,在實際應(yīng)用中各個數(shù)據(jù)源通過序列號生成器進(jìn)行關(guān)聯(lián)的示意圖;圖3為本申請實施例1提供的一種序列號生成方法,在實際應(yīng)用中生成序列號的流程圖;圖4為本申請實施例2提供的一種序列號生成裝置的具體結(jié)構(gòu)示意圖。具體實施方式為使本申請的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本申請具體實施例及相應(yīng)的附圖對本申請技術(shù)方案進(jìn)行清楚、完整地描述。顯然,所描述的實施例僅是本申請一部分實施例,而不是全部的實施例?;诒旧暾堉械膶嵤├绢I(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護(hù)的范圍。以下結(jié)合附圖,詳細(xì)說明本申請各實施例提供的技術(shù)方案。實施例1實施例1提供了一種序列號生成方法,用于解決現(xiàn)有技術(shù)中的問題。該方法用于序列號生成器,該序列號生成器能夠用于生成序列號。其中,該序列號生成器關(guān)聯(lián)多個數(shù)據(jù)源,各數(shù)據(jù)源中包括第一數(shù)據(jù)源以及第二數(shù)據(jù)源。需要另外說明的是,該第一數(shù)據(jù)源可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中的任意一個數(shù)據(jù)源,也可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中特定的某一個數(shù)據(jù)源;第二數(shù)據(jù)源可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,第一數(shù)據(jù)源之外的任意一個數(shù)據(jù)源,也可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,特定的某個數(shù)據(jù)源,這里并不對第一數(shù)據(jù)源與第二數(shù)據(jù)源之間的關(guān)系進(jìn)行限定。比如說,在實際應(yīng)用中,該第一數(shù)據(jù)源為主數(shù)據(jù)源,第二數(shù)據(jù)源備用數(shù)據(jù)源;或者,第一數(shù)據(jù)源為與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,數(shù)據(jù)源優(yōu)先級順序最高的數(shù)據(jù)源,第一數(shù)據(jù)源之外的數(shù)據(jù)源為第二數(shù)據(jù)源;或者,第一數(shù)據(jù)源為與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,使用頻率最高的數(shù)據(jù)源,第一數(shù)據(jù)源之外的數(shù)據(jù)源為第二數(shù)據(jù)源;或者,第一數(shù)據(jù)源為與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,任意的一個數(shù)據(jù)源,第一數(shù)據(jù)源之外的數(shù)據(jù)源為第二數(shù)據(jù)源。通常與序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源,可以是如下數(shù)據(jù)源中任意的至少兩個數(shù)據(jù)源;數(shù)據(jù)庫Sequence、Redis、數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)、hilo高低位算法、數(shù)據(jù)庫自增序列等。例如,多個數(shù)據(jù)源分別為數(shù)據(jù)庫Sequence、Redis、數(shù)據(jù)庫預(yù)定義元數(shù)據(jù),其中,第一數(shù)據(jù)源為Redis,第二數(shù)據(jù)源為數(shù)據(jù)庫Sequence和數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)。本申請實施例提供的序列號生成方法的具體流程示意圖如圖1所示,包括下述步驟:步驟S11:序列號生成器從第一數(shù)據(jù)源中獲取數(shù)值,當(dāng)從第一數(shù)據(jù)源中獲取數(shù)值失敗時,執(zhí)行步驟S12至步驟S14,當(dāng)從第一數(shù)據(jù)源中獲取數(shù)值成功,時執(zhí)行步驟S15。在實際應(yīng)用中,從第一數(shù)據(jù)源中獲取數(shù)值的方式通常可以有多種,這里可以列舉幾種常用的方式。方式一:可以先獲取第一數(shù)據(jù)源對應(yīng)的鎖對象,再根據(jù)該鎖對象來獲取第一數(shù)據(jù)源中的數(shù)值。這種方式只有在獲取鎖對象之后,才能根據(jù)該鎖對象獲取第一數(shù)據(jù)源中的數(shù)值,如果獲取鎖對象失敗,則不能實現(xiàn)從第一數(shù)據(jù)源中獲取數(shù)值。因此可以通過這種方式來保持?jǐn)?shù)據(jù)源的一致性,增加安全性。方式二:可以先獲取第一數(shù)據(jù)源對應(yīng)的接口函數(shù),然后通過該接口函數(shù)從第一數(shù)據(jù)源中獲取數(shù)值。例如,當(dāng)該第一數(shù)據(jù)源為數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)時,可以通過接口函數(shù)nextKey從該第一數(shù)據(jù)源中獲取數(shù)值。通常導(dǎo)致從第一數(shù)據(jù)源中獲取數(shù)據(jù)失敗的原因有多種,比如說,第一數(shù)據(jù)源對應(yīng)的鎖對象被其它程序長時間占用(死鎖的情況)而導(dǎo)致失敗,或者說,由于請求從第一數(shù)據(jù)源中獲取數(shù)值的業(yè)務(wù)請求的數(shù)量過多(高并發(fā)的情況),導(dǎo)致業(yè)務(wù)請求的隊列過長,使得長時間不能從第一數(shù)據(jù)源中獲取數(shù)值,而導(dǎo)致失敗。因此,確定從第一數(shù)據(jù)源中獲取數(shù)值是否失敗時,通??梢灶A(yù)先設(shè)置一個時間閾值,當(dāng)從第一數(shù)據(jù)源中獲取數(shù)據(jù)的時間大于該預(yù)設(shè)時間閾值時,可以確定從第一數(shù)據(jù)源中獲取數(shù)值失敗。比如,該預(yù)設(shè)時間閾值為2分鐘(也可以根據(jù)需要設(shè)置為其它時間),當(dāng)從第一數(shù)據(jù)源中獲取數(shù)據(jù)的時間大于2分鐘時,可以確定從第一數(shù)據(jù)源中獲取數(shù)值失敗。這樣,當(dāng)出現(xiàn)死鎖或者業(yè)務(wù)請求的隊列過長時,可以通過獲取數(shù)值的時間與預(yù)設(shè)時間閾值之間對比的結(jié)果,方便的確定從第一數(shù)據(jù)源中獲取數(shù)值是否失敗。步驟S12:序列號生成器從第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源。當(dāng)與序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源有多個時,從各個第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源的方式可以有多種,這里可以列舉幾種常用的方式:方式一:根據(jù)預(yù)設(shè)的數(shù)據(jù)源優(yōu)先級順序從各所述第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源。數(shù)據(jù)源優(yōu)先級順序規(guī)定了這些第二數(shù)據(jù)源的各自優(yōu)先級。根據(jù)預(yù)設(shè)的數(shù)據(jù)源優(yōu)先級順序從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,通??梢允菍?shù)據(jù)源優(yōu)先級順序最高的第二數(shù)據(jù)源確定為目標(biāo)數(shù)據(jù)源。例如,第二數(shù)據(jù)源分別為:數(shù)據(jù)庫Sequence、Redis、數(shù)據(jù)庫預(yù)定義元數(shù)據(jù);數(shù)據(jù)源優(yōu)先級順序依次為Redis、數(shù)據(jù)庫Sequence、數(shù)據(jù)庫預(yù)定義元數(shù)據(jù),則可以將Redis確定為目標(biāo)數(shù)據(jù)源。另外,數(shù)據(jù)源優(yōu)先級順序可以預(yù)先進(jìn)行設(shè)定和修改,這種根據(jù)預(yù)設(shè)的數(shù)據(jù)源優(yōu)先級順序從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,在從第一數(shù)據(jù)源中獲取數(shù)值失敗后,能夠自動地從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,因此減少了人工操作。方式二:根據(jù)用戶的輸入信息從各所述第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源。當(dāng)從第一數(shù)據(jù)源中獲取數(shù)值失敗之后,用戶也可以從各個第二數(shù)據(jù)源中,選擇其中某一個作為目標(biāo)數(shù)據(jù)源。因此,可以在接收到用戶的輸入信息之后,根據(jù)該輸入信息從各個第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源。在實際應(yīng)用中,用戶根據(jù)不同的應(yīng)用場景可以選擇不同的第二數(shù)據(jù)源作為目標(biāo)數(shù)據(jù)源。通常不同的數(shù)據(jù)源具有不同的特點,比如,Redis響應(yīng)速度較快,數(shù)據(jù)庫自增序列較為穩(wěn)定等,因此用戶可以根據(jù)具體的應(yīng)用場景(比如說,高并發(fā)的場景需要響應(yīng)速度快的數(shù)據(jù)源,穩(wěn)定性要求較高的場景需要較為穩(wěn)定的數(shù)據(jù)源)來從不同的第二數(shù)據(jù)源中選擇出目標(biāo)數(shù)據(jù)源。當(dāng)然,還可以通過其他方式從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,也可以將方式一與方式二相結(jié)合來確定目標(biāo)數(shù)據(jù)源,當(dāng)接收到用戶的輸入信息時,根據(jù)該輸入信息從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,如果沒有接收到用戶的輸入信息,根據(jù)預(yù)設(shè)的數(shù)據(jù)源優(yōu)先級順序從各第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源等。此外,當(dāng)與序列號生成器相關(guān)聯(lián)的第二數(shù)據(jù)源只有一個時,在從第一數(shù)據(jù)源中獲取數(shù)值失敗之后,可以直接將該第二數(shù)據(jù)源確定為目標(biāo)數(shù)據(jù)源。步驟S13:序列號生成器從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值。在這里,從目標(biāo)數(shù)據(jù)源中獲取數(shù)值的方法,可以與步驟S11中從第一數(shù)據(jù)源中獲取數(shù)值的方法相同。比如,獲取目標(biāo)數(shù)據(jù)源對應(yīng)的鎖對象,然后根據(jù)所獲取的鎖對象從目標(biāo)數(shù)據(jù)源中獲取數(shù)值;或獲取目標(biāo)數(shù)據(jù)源對應(yīng)的接口函數(shù);然后根據(jù)所獲取的接口函數(shù)從目標(biāo)數(shù)據(jù)源中獲取數(shù)值。當(dāng)然,在實際應(yīng)用中從目標(biāo)數(shù)據(jù)源中獲取數(shù)值,也可以采用與步驟S11從第一數(shù)據(jù)源中獲取數(shù)值不同的方法。步驟S14:序列號生成器根據(jù)從目標(biāo)數(shù)據(jù)源中所獲取的數(shù)值生成序列號。在獲取目標(biāo)數(shù)據(jù)源中的數(shù)值之后,可以根據(jù)該數(shù)值生成序列號。在實際應(yīng)用中,通常會出現(xiàn)從不同數(shù)據(jù)源中獲取的數(shù)值相同的情況,為了使得該序列號具有唯一性(每一次生成序列號的均不相同),在根據(jù)該數(shù)值生成序列號時,可以將該數(shù)值與獲取數(shù)值時的時間點相結(jié)合,來生成序列號。比如,獲取該數(shù)值的時間點為2016年9月12號上午10點20分23秒,該數(shù)值為175,則可以將20160912102023175作為所生成的序列號。由于獲取該數(shù)值的時間點具有唯一性,因此能夠使得該序列號具有唯一性。當(dāng)然,將該數(shù)值與獲取數(shù)值時的時間點相結(jié)合時,可以有多種結(jié)合方式,這里就不再一一列舉。此外,將該數(shù)值與獲取數(shù)值時的時間點相結(jié)合生成序列號時,可以先計算該數(shù)值與該時間點結(jié)合后的字符串的信息摘要,然后將該信息摘要作為序列號。在實際應(yīng)用中,通??梢酝ㄟ^諸如MD5(MessageDigestAlgorithm,消息摘要算法第五版)等散列算法來計算該字符串的信息摘要。通過計算該字符串的信息摘要,并將該信息摘要作為序列號,可以實現(xiàn)對該數(shù)值的加密,在一些安全性要求較高的場景下較為適用。當(dāng)然,為了使得所生成的序列號具有唯一性,在根據(jù)從目標(biāo)數(shù)據(jù)源中所獲取的數(shù)值生成序列號時,還可以將該數(shù)值結(jié)合序列號定義表的數(shù)據(jù)源標(biāo)識字段中的第一屬性值,根據(jù)該數(shù)值以及該第一屬性值來生成序列號。該序列號定義表包括數(shù)據(jù)源標(biāo)識字段,該數(shù)據(jù)源標(biāo)識字段中的第一屬性值與所獲取到的該數(shù)值的數(shù)據(jù)源之間具有一一對應(yīng)關(guān)系,也就是說不同的第一屬性值對應(yīng)不同的數(shù)據(jù)源。比如說,第一屬性值為A,對應(yīng)的數(shù)據(jù)源為Redis;第一屬性值為B,對應(yīng)的數(shù)據(jù)源為數(shù)據(jù)庫Sequence;第一屬性值為C,對應(yīng)的數(shù)據(jù)源為數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)等。當(dāng)然,第一屬性值與數(shù)據(jù)源的對應(yīng)關(guān)系通??梢灶A(yù)先進(jìn)行設(shè)定。因此,步驟S14根據(jù)從目標(biāo)數(shù)據(jù)源中所獲取的數(shù)值生成序列號,還可以通過步驟S141~步驟S142的方式來實現(xiàn)。步驟S141:獲取序列號定義表的數(shù)據(jù)源標(biāo)識字段的第一屬性值;步驟S142:根據(jù)所獲取的目標(biāo)數(shù)據(jù)源中的數(shù)值以及該第一屬性值生成序列號。當(dāng)然,根據(jù)所獲取的目標(biāo)數(shù)據(jù)源中的數(shù)值以及第一屬性值生成序列號,通??梢詫⒃摂?shù)值與第一屬性值相結(jié)合,并作為所生成的序列號。比如,目標(biāo)數(shù)據(jù)源為Redis,所對應(yīng)的第一屬性值為A,從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值為105,可以將A105作為序列號(結(jié)合方式可以有多種,比如說,也可以將105A作為序列號)。此時,該序列號中包括第一屬性值為以及從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值,因此可以使得序列號具有唯一性。此外,在步驟S142中,根據(jù)所獲取的目標(biāo)數(shù)據(jù)源中的數(shù)值以及第一屬性值生成序列號時,由于所獲取數(shù)值的位數(shù)等可能不同,通常會導(dǎo)致所生成的序列號不規(guī)整,不便于統(tǒng)一管理。因此在步驟S142中,根據(jù)所獲取的目標(biāo)數(shù)據(jù)源中的數(shù)值以及第一屬性值生成序列號,通??梢允牵瑢⒃摂?shù)值以及該第一屬性值,根據(jù)序列號定義表的序列號格式化字段的第二屬性值的格式進(jìn)行格式化處理,然后根據(jù)格式化處理的結(jié)果生成序列號。此時,該序列號定義表包括數(shù)據(jù)源標(biāo)識字段以及序列號格式化字段。該序列號格式化字段中的第二屬性值的格式,通常能夠反應(yīng)所需要生成的序列號的格式,因此能夠根據(jù)該第二屬性值的格式來對該數(shù)值和第一屬性值進(jìn)行格式化處理,并根據(jù)格式化處理的結(jié)果生成序列號。表1數(shù)據(jù)源標(biāo)識序列號格式化AA00143如表1所示為實際應(yīng)用中的一種序列號定義表,該序列號定義表中的數(shù)據(jù)源標(biāo)識字段的第一屬性值為A,表示獲取數(shù)值的目標(biāo)數(shù)據(jù)源為Redis,序列號格式化字段的第二屬性值為A00143,表示所生成的序列號由數(shù)字和字母共六位組成,第一位為第一屬性值(對應(yīng)于獲取數(shù)值的目標(biāo)數(shù)據(jù)源),143為從目標(biāo)數(shù)據(jù)源獲取的數(shù)值,A和143之外的位數(shù)為0。此時,如果從Redis獲取的數(shù)值為25,則,所生成的序列號為A00025。當(dāng)然,序列號格式化字段中的第二屬性值的格式也可以結(jié)合時間信息,從而對從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值和第一屬性值進(jìn)行格式化處理。表2數(shù)據(jù)源標(biāo)識序列號格式化B20160814B00148如表2所示為實際應(yīng)用中的另一種序列號定義表,該序列號定義表中的數(shù)據(jù)源標(biāo)識字段的第一屬性值為B,表示獲取數(shù)值的目標(biāo)數(shù)據(jù)源為數(shù)據(jù)庫Sequence,序列號格式化字段的第二屬性值為20160814B00148,表示所生成的序列號由數(shù)字和字母十四位組成,20160814為時間信息(日期),A為第一屬性值(對應(yīng)于獲取數(shù)值的目標(biāo)數(shù)據(jù)源),148為從目標(biāo)數(shù)據(jù)源獲取的數(shù)值,20160814、A和143之外的位數(shù)為0。此時,如果2016年9月1號,從數(shù)據(jù)庫Sequence獲取的數(shù)值為96,則,所生成的序列號為20160901B00096。當(dāng)然,第二屬性值還可以是其它的格式,以便對從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值以及第一屬性值進(jìn)行對應(yīng)的格式化處理,生成規(guī)整且具有唯一性的序列號,更加便于統(tǒng)一管理。步驟S15:序列號生成器根據(jù)從第一數(shù)據(jù)源中所獲取的數(shù)值生成序列號。當(dāng)從第一數(shù)據(jù)源中獲取數(shù)值成功,可以直接根據(jù)該數(shù)據(jù)生成序列號。根據(jù)從第一數(shù)據(jù)源中獲取的數(shù)值生成序列號的方式,可以與步驟S14中,根據(jù)從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值生成序列號的方式相同。比如,可以將從第一數(shù)據(jù)源中獲取的數(shù)值結(jié)合獲取該數(shù)值的時間點,生成序列號,也可以將該數(shù)值和該時間點結(jié)合后的字符串的信息摘要作為序列號,也可以獲取序列號定義表的數(shù)據(jù)源標(biāo)識字段的第一屬性值,然后根據(jù)從第一數(shù)據(jù)源中獲取的數(shù)值以及該第一屬性值生成序列號,這里就不再進(jìn)行贅述。當(dāng)然,通過從第一數(shù)據(jù)源中所獲取的數(shù)值生成序列號的方式,也可以與步驟S14中,根據(jù)從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值生成序列號的方式不同。采用實施例1提供的該序列號生成方法,序列號生成器當(dāng)從所關(guān)聯(lián)第一數(shù)據(jù)源中獲取數(shù)值失敗時,可以從與該序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,從該目標(biāo)數(shù)據(jù)源中獲取數(shù)值,并根據(jù)從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值生成序列號。從而解決了現(xiàn)有技術(shù)中,從數(shù)據(jù)源中獲取數(shù)值失敗時,無法生成序列號的問題。比如說,現(xiàn)有技術(shù)中,通??梢詫?shù)據(jù)庫Sequence、Redis或數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)等作為數(shù)據(jù)源,從數(shù)據(jù)源中獲取數(shù)值來生成序列號。但是,這些數(shù)據(jù)源之間相互獨立,當(dāng)從某個數(shù)據(jù)源中獲取數(shù)值失敗時,并不能從其他數(shù)據(jù)源中獲取數(shù)據(jù),從而導(dǎo)致無法生成序列號;而本申請中,數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)、數(shù)據(jù)庫Sequence和Redis分別與序列號生成器關(guān)聯(lián),可以將其中數(shù)據(jù)源優(yōu)先級最高的數(shù)據(jù)源作為第一數(shù)據(jù)源,其它的作為第二數(shù)據(jù)源,當(dāng)從第一數(shù)據(jù)源中獲取數(shù)值失敗時,可以從第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源(根據(jù)數(shù)據(jù)源優(yōu)先級順序等方式),從而能夠從目標(biāo)數(shù)據(jù)源中獲取數(shù)值來生成序列號。在實際應(yīng)用中,還可以通過序列號定義表來對序列號生成規(guī)則做統(tǒng)一管理。這里的序列號定義表可以包括數(shù)據(jù)源標(biāo)識字段、序列號格式化字段以及序列號當(dāng)前值字段;其中,數(shù)據(jù)源標(biāo)識字段和序列號格式化字段與步驟S14中的相同,序列號當(dāng)前值字段所記錄的第三屬性值與上一次所生成的序列號相對應(yīng)。比如,上一次所生成的序列號為C00154,則,該第三屬性值為可以154(也可以為C00154、00154等)。這樣,當(dāng)序列號生成器從所關(guān)聯(lián)的第一數(shù)據(jù)源中獲取數(shù)值失敗時,可以從與該序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源,然后,根據(jù)序列號定義表的序列號當(dāng)前值字段的第三屬性值從目標(biāo)數(shù)據(jù)源中獲取數(shù)值,并根據(jù)獲取到的數(shù)值生成序列號。當(dāng)然,由于序列號當(dāng)前值字段所記錄的第三屬性值與上一次所生成的序列號相對應(yīng),因此根據(jù)該第三屬性值從目標(biāo)數(shù)據(jù)源中獲取數(shù)值的方式,可以使得所獲取的數(shù)值具有唯一性(每次獲取的數(shù)值不同),從而也可以所生成的序列號具有唯一性。表3序列號當(dāng)前值數(shù)據(jù)源標(biāo)識序列號格式化35A(對應(yīng)Redis)A0019在表3中,序列號當(dāng)前值字段的第三屬性值為35,說明上一次生成的序列號為A0035,可以根據(jù)該第三屬性值為35,從Redis獲取數(shù)值,所獲取的數(shù)值可以為第三屬性值35加上步長(通常為1),然后通過該數(shù)值結(jié)合A,根據(jù)序列號格式化字段的第二屬性值(A0019)的格式進(jìn)行格式化處理,從而生成序列號A0036。通過在序列號定義表中增加序列號當(dāng)前值,使得從目標(biāo)數(shù)據(jù)源中所獲取的數(shù)值具有連續(xù)性(相差等于步長),使得所生成的序列號更加規(guī)整,更加便于統(tǒng)一管理。此外,在實際應(yīng)用中,為了提高從目標(biāo)數(shù)據(jù)源中獲取數(shù)值的速度,通常還可以將目標(biāo)數(shù)據(jù)源中的數(shù)值預(yù)先加載到緩存中,然后將該緩存作為資源池,當(dāng)需要從目標(biāo)數(shù)據(jù)源中獲取數(shù)值時,可以通過從該資源池中獲取數(shù)值來獲取目標(biāo)數(shù)據(jù)源中的數(shù)值。當(dāng)然,在實際應(yīng)用中,序列號定義表除了數(shù)據(jù)源標(biāo)識字段、序列號格式化字段以及序列號當(dāng)前值字段之外,還可以有其他的字段,如表4所示為實際應(yīng)用中的另一種序列號定義表。表4表4所示的序列號定義表中包括序列號名稱字段,用于記錄序列號的名稱;序列號別名字段,用于記錄序列號的別名;序列號描述字段,用于對序列號的用途等進(jìn)行描述;資源池大小字段,用于記錄資源池中預(yù)存的數(shù)值的數(shù)量;序列號當(dāng)前值字段;序列號格式化字段;數(shù)據(jù)源標(biāo)識字段等。根據(jù)表4所示,預(yù)先從目標(biāo)數(shù)據(jù)源中加載到資源池(緩存)中的數(shù)值數(shù)量為5個,序列號當(dāng)前值為22,說明上一次所生成的序列號為A0022,本次需要從目標(biāo)數(shù)據(jù)源中獲取的數(shù)值為23(假設(shè)步長為1),若資源池中有數(shù)值23,可以從資源池中直接獲取該數(shù)值23,若資源池中沒有數(shù)值23(比如,資源池中最大的數(shù)值小于23),則可以直接從目標(biāo)數(shù)據(jù)源中獲取該數(shù)值23,當(dāng)然也可以將數(shù)值23等多個數(shù)值先加載到資源池,然后從資源池中獲取該數(shù)值23。上述是對本申請實施例所提供的序列號生成方法的具體說明,為了便于理解,下面可以結(jié)合具體的示例再一次進(jìn)行說明。在該示例中,各數(shù)據(jù)源分別為數(shù)據(jù)庫Sequence、Redis和數(shù)據(jù)庫預(yù)定義元數(shù)據(jù);如圖2所示,數(shù)據(jù)庫Sequence、Redis和數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)分別關(guān)聯(lián)序列號生成器,并且三個數(shù)據(jù)源的優(yōu)先級順序依次為數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)、Redis和數(shù)據(jù)庫Sequence。通??梢詫?yōu)先級順序最高的數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)作為第一數(shù)據(jù)源,將Redis和數(shù)據(jù)庫Sequence作為第二數(shù)據(jù)源;序列號定義表如表5所示,包括序列號當(dāng)前值字段、資源池大小字段、序列號格式化字段以及數(shù)據(jù)源標(biāo)識字段,在數(shù)據(jù)源標(biāo)識字段中,如果屬性值(第一屬性值)為A表示獲取到數(shù)值的數(shù)據(jù)源為數(shù)據(jù)庫預(yù)定義元數(shù)據(jù),如果屬性值為B表示獲取到數(shù)值的數(shù)據(jù)源為Redis,如果屬性值為C表示獲取到數(shù)值的數(shù)據(jù)源為數(shù)據(jù)庫Sequence。表5序列號當(dāng)前值資源池大小序列號格式化數(shù)據(jù)源標(biāo)識583A0541A結(jié)合圖3,該示例的具體步驟如下:步驟S21:序列號生成器將數(shù)據(jù)庫預(yù)定義元數(shù)據(jù)中的數(shù)值59、60和61加載到緩存中;步驟S22:序列號生成器獲取接口函數(shù)nextKey,其中nextKey的當(dāng)前值為序列號定義表中序列號當(dāng)前值字段的屬性值(第三屬性值)58。在實際應(yīng)用中,如果第一次通過該序列號生成器生成序列號,nextKey的當(dāng)前值通常為0,此時需要根據(jù)該序列號當(dāng)前值字段的屬性值58,來對nextKey的當(dāng)前值進(jìn)行更新,使得nextKey的當(dāng)前值更新為序列號當(dāng)前值字段的屬性值58;如果已經(jīng)連續(xù)多次通過該序列號生成器生成序列號,通常該nextKey的當(dāng)前值與序列號當(dāng)前值字段的屬性值相同,此時可以不用通過序列號當(dāng)前值字段的屬性值來更新nextKey的當(dāng)前值。步驟S23:序列號生成器根據(jù)nextKey的當(dāng)前值58,從緩存中獲取數(shù)值59,當(dāng)獲取失敗時,執(zhí)行步驟S24~步驟S28,當(dāng)獲取成功時,執(zhí)行步驟S29;該59為通過58加1確定,其中1為步長。在實際應(yīng)用中,步長也可以為諸如2等其它值。步驟S24:序列號生成器根據(jù)數(shù)據(jù)源優(yōu)先級順序從Redis和數(shù)據(jù)庫Sequence中,將Redis確定為目標(biāo)數(shù)據(jù)源;步驟S25:序列號生成器將Redis中的數(shù)值59、60和61加載到緩存中;步驟S26:序列號生成器獲取鎖對象,然后根據(jù)序列號定義表中的序列號當(dāng)前值字段的屬性值58,從緩存中獲取數(shù)值59;步驟S27:序列號生成器將該數(shù)值59結(jié)合序列號定義表中的數(shù)據(jù)源標(biāo)識字段的屬性值B(與數(shù)據(jù)源相對應(yīng)),并根據(jù)序列號格式化字段的屬性值(第二屬性值)的格式進(jìn)行格式化處理;步驟S28:序列號生成器根據(jù)格式化處理的結(jié)果生成的序列號為B0059。步驟S29:序列號生成器根據(jù)所獲取的數(shù)值59結(jié)合序列號定義表中的數(shù)據(jù)源標(biāo)識字段的屬性值A(chǔ)(與數(shù)據(jù)源相對應(yīng)),并根據(jù)序列號格式化字段的屬性值(第二屬性值)的格式進(jìn)行格式化處理,從而生成的序列號A0059。當(dāng)然,對于該示例中所得到的序列號(包括B0059或者A0059),可以與獲取對應(yīng)的數(shù)值的時間相結(jié)合,或者是計算信息摘要,從而得到新的序列號。實施例2基于與實施例1相同的發(fā)明構(gòu)思,本申請實施例2提供了一種序列號生成裝置,該裝置用于序列號生成器,能夠解決現(xiàn)有技術(shù)中的問題。其中,該序列號生成器關(guān)聯(lián)多個數(shù)據(jù)源,各數(shù)據(jù)源中包括第一數(shù)據(jù)源以及第二數(shù)據(jù)源。該第一數(shù)據(jù)源可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中的任意一個數(shù)據(jù)源,也可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中特定的某一個數(shù)據(jù)源;第二數(shù)據(jù)源可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,第一數(shù)據(jù)源之外的任意一個數(shù)據(jù)源,也可以是與該序列號生成器關(guān)聯(lián)的多個數(shù)據(jù)源中,特定的某個數(shù)據(jù)源,這里并不對第一數(shù)據(jù)源與第二數(shù)據(jù)源之間的關(guān)系進(jìn)行限定。需要特別說明的是,對于本申請實施例2中的所提到的各個詞語或術(shù)語的說明,若有不清楚之處,可以參考實施例1。如圖4所示,該裝置40包括:確定單元401、獲取單元402以及生成單元403,其中:所述確定單元,當(dāng)從與序列號生成器關(guān)聯(lián)的第一數(shù)據(jù)源中獲取數(shù)值失敗時,從與所述序列號生成器關(guān)聯(lián)的第二數(shù)據(jù)源中確定出目標(biāo)數(shù)據(jù)源;所述獲取單元,從所述目標(biāo)數(shù)據(jù)源中獲取數(shù)值;所述生成單元,根據(jù)所獲取的數(shù)值生成序列號。采用實施例2提供的該裝置40,由于該裝置40采用與實施例1相同的發(fā)明構(gòu)思,因此能夠解決現(xiàn)有技術(shù)中的問題。此外,在實際應(yīng)用中,該裝置40還可以通過與具體的軟件或硬件相結(jié)合而取得其它的技術(shù)效果,比如說,在序列號生成器中使用該裝置40時,該序列號生成器當(dāng)從某一個數(shù)據(jù)源獲取數(shù)值失敗時,能夠從關(guān)聯(lián)的其它數(shù)據(jù)源中獲取數(shù)值,從而生成序列號,這樣該序列號生成器能夠適應(yīng)于序列號需求量加大的場景(在實際應(yīng)用中,在序列號需求量較大時,通常會由于死鎖等原因?qū)е聰?shù)值獲取失敗),能夠提高該序列號生成器的商業(yè)價值。本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)、或計算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實施的計算機(jī)程序產(chǎn)品的形式。本申請是參照根據(jù)本申請實施例的方法、設(shè)備(系統(tǒng))、和計算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機(jī)程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機(jī)程序指令到通用計算機(jī)、專用計算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機(jī)器,使得通過計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。這些計算機(jī)程序指令也可存儲在能引導(dǎo)計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機(jī)可讀存儲器中,使得存儲在該計算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。這些計算機(jī)程序指令也可裝載到計算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機(jī)實現(xiàn)的處理,從而在計算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。在一個典型的配置中,計算設(shè)備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flashRAM)。內(nèi)存是計算機(jī)可讀介質(zhì)的示例。計算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、動態(tài)隨機(jī)存取存儲器(DRAM)、其他類型的隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。本領(lǐng)域技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)或計算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實施的計算機(jī)程序產(chǎn)品的形式。以上僅為本申請的實施例而已,并不用于限制本申請。對于本領(lǐng)域技術(shù)人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請的權(quán)利要求范圍之內(nèi)。當(dāng)前第1頁1 2 3