專利名稱:一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及Web應用技術(shù)領(lǐng)域,尤其涉及一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議。
背景技術(shù):
非結(jié)構(gòu)化數(shù)據(jù)緩存是動態(tài)分布式Web應用的重要實現(xiàn)技術(shù),它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提供動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度,最終減輕數(shù)據(jù)庫負載?;诜植际絻?nèi)存對象的非結(jié)構(gòu)化數(shù)據(jù)存儲協(xié)議是分布式復雜數(shù)據(jù)對象緩存的具體實現(xiàn)形式和功能展現(xiàn)。當前非結(jié)構(gòu)化數(shù)據(jù)對象緩存協(xié)議memcached是基于存儲鍵/值對的hashmap實現(xiàn),其存儲協(xié)議中提供了支持分布式操作的數(shù)據(jù)存取(set, cas)功能和數(shù)據(jù)獲取(get, gets)功能?;诨旌闲头顷P(guān)系數(shù)據(jù)庫Cassandra采用DHT (分布式哈希表)的完全P2P架構(gòu)實現(xiàn),其數(shù)據(jù)存儲協(xié)議提供了比分布式存儲鍵/值對方式更豐富的功能,主要 增加了基于自定義鍵值范圍設定的數(shù)據(jù)查詢功能等。Hadoop Common產(chǎn)品中的基于GoogleBigTable的分布式數(shù)據(jù)庫HBase,適合存儲非結(jié)構(gòu)化或半結(jié)構(gòu)化的稀疏數(shù)據(jù),但其存儲協(xié)議中缺少數(shù)據(jù)表同表之間關(guān)聯(lián)查詢的需求。數(shù)據(jù)庫網(wǎng)絡接口 Tokyo Tyrant擁有memcached兼容協(xié)議,包括網(wǎng)絡層流數(shù)據(jù)的緩存協(xié)議,可通過HTTP進行數(shù)據(jù)交換,并實現(xiàn)數(shù)據(jù)的持久存儲,但其不能獲取數(shù)據(jù)的指定區(qū)域。綜上所述,當前的非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議存在以下不足
I、存入前必須提前知道數(shù)據(jù)塊的大小,不利于大對象或者應用層流對象的存入。2、獲取數(shù)據(jù)必須是整塊數(shù)據(jù),不能獲取數(shù)據(jù)的指定區(qū)塊。3、對于數(shù)據(jù)不能做復雜檢索,只能根據(jù)鍵值獲取。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對現(xiàn)有技術(shù)的不足,提供一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議。本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取和查詢多種類型的非結(jié)構(gòu)化數(shù)據(jù)的具體實現(xiàn),,其特征在于,該協(xié)議包括
(I)普通數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取普通類型的非結(jié)構(gòu)化數(shù)據(jù)的具體實現(xiàn)
(I. I)普通數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以“key”為主鍵,向緩存中存儲“data block”,所存儲的數(shù)據(jù)大小為“bytes”,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下<key>〈flags〉〈exptime〉Kbytes} \r\n〈data 辦尤> Ir I/ ”,若存儲成功,則返回I/ ”客戶端以“key”為主鍵,向緩存中存儲“data block”,所存儲的數(shù)據(jù)大小為“bytes”,數(shù)據(jù)有效期至“exptime”,所要求的數(shù)據(jù)版本號為“cas unique”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下“cas〈key〉〈flags〉〈exptime〉Kbytes}〈cas unique} \r\n〈data block〉|r \n ”,如果輸入的版本號存在且存儲成功,則返回“EXISTS\r \n ”,如果輸入的版本號不存在,則返回“NOTjmNDIr \n”
(I. 2)普通數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以“key”為主鍵,獲取相應的“data block”,命令格式如下“gets <key>*\r I/ ” ;若獲取數(shù)據(jù)成功,貝 U返回“〈VALUE <key> <flags}〈bytes〉\r\n<data block} \r In〉*END |r \n ”
客戶端以“key”為主鍵,獲取相應的“data block”和相應的版本號,命令格式如下“gets;若獲取數(shù)據(jù)成功,貝1J返回“〈VALUE <key> <flags}〈bytes〉〈cas
unique} \r \n〈da ta block} Ir In>*END\r \n
(I. 3)數(shù)據(jù)刪除命令的實現(xiàn)
客戶端在緩存中刪除以“key”為主鍵的相應數(shù)據(jù),命令格式如下'“ deleteI
r\n\若刪除成功,則返回“DELETED Ir k ”,若以該“ key ”為主鍵的值不存在,則返回” NOT_FOUND\r\n” ;
(1.4)獲取緩存狀態(tài)命令的實現(xiàn)
客戶端想獲取服務器的狀態(tài)列表,命令格式如下Ir U ”,若獲取狀態(tài)成功,則返回“〈STAT <name> <value〉Ir In〉*END\r \nv
(2)流數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取流數(shù)據(jù)的具體實現(xiàn)
(2. I)流數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以“key”為主鍵,向緩存中存儲數(shù)據(jù)幀(data frames),數(shù)據(jù)幀的格式如圖I所
示;
可見,數(shù)據(jù)幀的存儲時分段實現(xiàn)的,每個分段的數(shù)據(jù)前加控制命令以表明該段數(shù)據(jù)的大小,因此可以存儲大容量的數(shù)據(jù)并維持數(shù)據(jù)的一致性,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為 “flags”,命令格式如下“sset〈key>〈flags>〈exptime>\r\n〈data frames>\r\n”,若存儲成功,則返回“ST0RED\r\n” ;
客戶端以“key”為主鍵,向緩存中存儲data frames,所存儲的數(shù)據(jù)版本號為“cas unique”,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flag”,命令格式如下:uscas<key><f IagsXexptimeXcas unique>\r\n<data frames>\r\n”,如果輸入的版本號存在且存儲成功,則返回“EXISTS\r\n”;如果輸入的版本號不存在,則返回“N0T_F0UND\r\n” ;如果輸入的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r\n” ;
(2. 2)流數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以”key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以“offset”為偏移量,大小為“bytes”的某個數(shù)據(jù)中的部分數(shù)據(jù),命令格式如下Zsgei <<key>〈offset〉r I/ ”,若數(shù)據(jù)獲取成功,則返回 “<7^見 <key> <flags}〈offset〉〈bytes〉\r\n<datablock〉|r \n>*END\r \n;
客戶端以“key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以“offset”為偏移量,大小為“bytes”的某個數(shù)據(jù)中的一塊以及該數(shù)據(jù)的版本號,命令格式如下“sgets key>〈offset〉若數(shù)據(jù)獲取成功,則返回“〈VALUE <key> <flags}〈offset〉〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ;
(3)對象數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取對象數(shù)據(jù)的具體實現(xiàn)
(3. I)對象數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以“左印廠(· field) *],,表明其所要存取的數(shù)據(jù)在xml或json文件中的具體位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下·,“〈xmlset / json set}〈key [(· field)*]> <flags}〈exptime〉<bytes> \r\n〈data block〉|r \n ”,若存儲成功,則返回“STORED |r \n ”,若要存儲的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r \n ”,如果要存儲的數(shù)據(jù)標簽對應關(guān)系不正確,則返回“PARSE_ERROR\ r I/ ” ;
客戶端以“左印廠(· Λ' 7ο9*_/”表明其所要存取的數(shù)據(jù)在xml或json文件中的具體位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,所要求的數(shù)據(jù)版本號為“cas unique”,命令格式如下cas / jsoncas} <key[(.field) *]> <flags}〈exptime〉〈bytes〉〈case unique} \r\n〈data 辦尤> Ir 丨/ ,,,若輸入的版本號存在且存儲成功,則返回“EXISTS\r \n ”,若輸入的版本號不存在,則返回FOUND Ir \n ”,若要存儲的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r \n ”,如果要存儲的數(shù)據(jù)標簽對應關(guān)系不正確,則返回“PARSE_ERROR\r \n ” ;
(3. 2)普通數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令
客戶端以“左印廠(· Λ' 7ο9*_/”表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù),命令格式如下·.“〈xmlgets / jasongets> < key[ (. field) *]>*\r \n,y ;如果數(shù)據(jù)獲取成功,貝丨J返回< key[ (. field) *]> <flags} <bytes> \r \n<data
block〉|r \n>*END\r \n;
客戶端以“左印廠(· Λ' 7ο9*_/”表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù)和其所對應的版本號,命令格式如下〈xmlgets / jasongets> < key[(.field) *]>* Ir I/ ” ;如果數(shù)據(jù)獲取成功,貝U 返回“〈VALUE < key[ (. field) *]> <flags}〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ;
(3. 3)對象數(shù)據(jù)刪除命令的實現(xiàn)
客戶端在緩存中的xml或jason文件中的“左印廠(·位置處刪除相應內(nèi)容,
命令格式如下/ jsondelete}〈key[ ?!?i<97o9 Ir 丨/ ”,若 xml 或 jason文件中的對應內(nèi)容已被刪除成功,則返回” DELETED\r\n”,若或jason文件中不存在相應的 “key[ (. field) € ” 位置的內(nèi)容,則返回” NOT_FOUND Ir I/ ” ;
(4)查詢協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中對數(shù)據(jù)鍵值和內(nèi)容的復雜混合查詢等的具體實現(xiàn)
(4. I)鍵查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令
客戶端以為數(shù)據(jù)主鍵的開頭前置查詢相關(guān)數(shù)據(jù),命令格式如下“querykey. startwith (“〈keyprefix〉,,) [KEY_ONLY] \r\n,y,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù)據(jù)獲取成功,則返回查找到的鍵值、附加存儲的內(nèi)容“flags”、數(shù)據(jù)大小“bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block,格式如下“〈VALUE <key><flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n ” ;(4.2)正則查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令
客戶端以expression”為正則表達式查詢匹配該正則表達式的主鍵和主鍵所對應的數(shù)據(jù),命令格式如下-.“query key. like (“〈regular expression〉”)[KEY_Ir k”,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù)據(jù)獲取成功,則返回查找到的主鍵值、附加存儲的內(nèi)容” flags”、數(shù)據(jù)大小為“bytes”,如果要求返回整個數(shù)據(jù),則同時返回 data block,格式如下“〈VALUE〈key〉〈flags〉Kbytes} \r\n[(data block} \r In]>*END |r \n ” ;
(4. 3)值查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令
客戶端以“regular expression ”為正則表達式查詢匹配該正則表達式的數(shù)據(jù)和數(shù)據(jù)所對應的主鍵,命令格式如下“query value, querywi th (“〈queryexpression〉”)[KEY—ONLY] \r\n”,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù) 據(jù)獲取成功,則返回查找到的主鍵值、附加存儲的內(nèi)容“flags”、數(shù)據(jù)大小為“bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block,格式如下“〈VALUE <key>〈flags〉<bytes> |r \n[(dataIrI/ ” ;值查詢命令還可以支持多個運算符,比如
Y ‘‘>= ‘‘〈= “= iiOf ,等,支持連接符,比如—V, ‘or,,‘(,,‘),等,返回格式不變
(4.4)混合查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令
該查詢是多個值查詢以“and”和“or”相結(jié)合的復雜鍵值查詢和值查詢的實現(xiàn)方式,命令格式(舉例)如下query key. s tartwi th Ci keyprefix} and key. like Ci Kregularexpression} “)or value, querywi th Ci query expression} 丨/ ”,返回格式同值查詢相同
(4. 5)建立索引的協(xié)議實現(xiàn),包括實現(xiàn)以下的命令
客戶端對00對象的某個子鍵建立索引,自動忽略非00或者不含此子鍵的對象,命令格式如下·.“ ν C field Γ.Ir I/ ”,若索引已被成功創(chuàng)建,則返回Ir I/ ”;(4. 6)刪除索引的協(xié)議實現(xiàn),包括實現(xiàn)以下的命令
客戶端刪除相應的索引,命令格式如下'“dvi <· field (· /idWPlrk”,若索引刪除成功,則返回“DELETED Ir I/ ”若相應索弓丨不存在,則返回” N0T—F0UND Ir I/ ";
(5 )上述命令如果在使用時出錯或程序運行在客戶端或服務端出現(xiàn)其他錯誤,則會返回以下出錯信息,如 “ERR0R\r\n,CLIENT_ERR0R <error>\r\n, SERVER_ERR0R <error>\r\n,,。本發(fā)明具有的有益效果是
I、普通協(xié)議可以方便高效地把數(shù)據(jù)存儲,取出,刪除。2、流協(xié)議可以在有限的內(nèi)存條件下存儲大文件,消除內(nèi)存拷貝,減少延遲可以存儲大小未知的數(shù)據(jù);對于00的對象,可以邊編碼邊傳輸,減少延遲非常明顯;可以獲取大數(shù)據(jù)塊中的指定區(qū)塊。對于超大的數(shù)據(jù)塊提供了多線程并行下載的可能性;非常適合對于流媒體文件存放??梢垣@取播放任意一段流媒體。3、對象協(xié)議存儲00對象時可以做到語言無關(guān)性;可以存儲或者獲取00對象中的某個子對象的內(nèi)容。4、查詢協(xié)議不再局限于鍵完全匹配的查尋,提供了靈活多樣的查尋方式;支持對OO對象建立索引,提高查詢的效率。
圖I為數(shù)據(jù)幀的格式圖。
具體實施例方式非結(jié)構(gòu)化數(shù)據(jù)緩存協(xié)議是復雜數(shù)據(jù)對象分布式存儲的重要實現(xiàn)形式和功能展現(xiàn),廣泛應用于動態(tài)分布式Web應用的大型系統(tǒng)中。當前的非結(jié)構(gòu)化數(shù)據(jù)對象緩存協(xié)議只提供了支持分布式操作的簡單數(shù)據(jù)對象的存取和獲取功能和簡單的自定義鍵值的數(shù)據(jù)查詢,所要存取的數(shù)據(jù)對象大小事先必須已知且受內(nèi)存大小的限制。本專利在現(xiàn)有的多個非結(jié)構(gòu)化數(shù)據(jù)對象緩存協(xié)議的基礎上,通過改進和重新設計memcached中的協(xié)議模塊,實現(xiàn)了一個支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議,包括實現(xiàn)了大規(guī)模流對象數(shù)據(jù)的存取和獲取、數(shù)據(jù)的自定義部分存取以及多種靈活的復雜數(shù)據(jù)檢索的實現(xiàn),同時保證數(shù)據(jù)存取的高效性。 協(xié)議模塊和相關(guān)介紹
I、普通協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取普通類型的非結(jié)構(gòu)化數(shù)據(jù),包括
I.I存儲命令,其命令格式和返回格式如下
I.I. I命令格式
set〈key〉〈flags〉〈exptime〉Kbytes} \r \n〈data block} \r\n表明客戶端以” key”為主鍵,向緩存中存儲” data block”,所存儲的數(shù)據(jù)大小為” bytes”,數(shù)據(jù)有效期至” exptime”,附加存儲的數(shù)據(jù)為” flags”
cas〈key〉〈flags〉〈exptime〉Kbytes}〈cas unique} \r\n〈data block} \r\n表明客戶端以” key”為主鍵,向緩存中存儲” data block”,所存儲的數(shù)據(jù)大小為”bytes”,數(shù)據(jù)有效期至”exptime”,所要求的數(shù)據(jù)版本號為”cas unique”,附加存儲的數(shù)據(jù)為” flags”
I.I. 2返回格式
ST0RED\r\n
對于” set”命令,如果存儲成功,則返回此命令.
EXISTS\r\n
對于” cas”命令,如果輸入的版本號存在且存儲成功,則返回此命令。N0T_F0UND\r\n
對于” cas”命令,如果輸入的版本號不存在,則返回此命令。I. 2取出命令,其命令格式和返回格式如下
I.2. I命令格式
get <key}^\r\n
表明客戶端以”key”為主鍵,獲取相應的data block。gets〈key〉*\r\n
表明客戶端以”key”為主鍵,獲取相應的data block及其版本號。I. 2. 2返回格式
〈VALUE〈key〉〈flags〉〈bytes〉[(cas uni que}]\r\n <da ta block〉\r\n〉*END\r\n。
I. 3刪除命令,其命令格式和返回格式如下
I.3. I命令格式
delete 〈key〉\r\n
表明客戶端以”key”為主鍵,刪除相應的data block。I. 3.2返回格式
DELETED\r\n
若刪除成功,則返回此命令。N0T_F0UND\r\n 若以該” key”為主鍵的值不存在,則返回此命令。I. 4狀態(tài)命令,其命令格式和返回格式如下
1.4. I命令格式
sta ts |r \n
返回當天服務器的狀態(tài)列表。I. 4. 2返回格式
〈STA T〈name〉< value} I r I n〉*END\r\n
2、流協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取流數(shù)據(jù),包括
2.I存儲命令
2.I. I命令格式
s set〈key〉〈flags〉K exp time} \r\n〈data frames} \r\n
表明客戶端以”key”為主鍵,向緩存中存儲data frames,所存儲的數(shù)據(jù)大小不規(guī)定,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”。scas<key><fIagsXexptimeXcas unique>\r\n〈data frames>\r\n
表明客戶端以”key”為主鍵,向緩存中存儲data frames,所存儲的數(shù)據(jù)版本號位”casunique”,數(shù)據(jù)有效期至” exptime”,附加存儲的數(shù)據(jù)為” flag”
2.I. 2數(shù)據(jù)巾貞(data frames)格式如圖I所示。
由此可見,流協(xié)議是對大容量數(shù)據(jù)的分段存儲實現(xiàn)的,并在每個分段的數(shù)據(jù)前加控制命令以表明該段數(shù)據(jù)的大小,因此可以存儲大容量的數(shù)據(jù)并維持數(shù)據(jù)的一致性。2. I. 2返回格式
ST0RED\r\n
對于” sset”命令,如果存儲成功,則返回此命令。EXISTS\r\n
對于” seas”命令,如果輸入的版本號存在且存儲成功,則返回此命令。N0T_F0UND\r\n
對于” seas"命令,如果輸入的版本號不存在,則返回此命令。DATA_ERR0R\r \n
對于” sset”或” seas”命令,如果輸入的數(shù)據(jù)格式不符合要求,則返回此命令。2. 2取出命令
2.2. I命令格式
sget key}〈offset〉<bytes>}^\r\n表明客戶端以”key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以”offset”為偏移量,大小為”bytes”的某個數(shù)據(jù)中的部分數(shù)據(jù)。sgets〈〈key〉〈offset〉<bytes>>*\r \n
表明客戶端以”key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以”offset”為偏移量,大小為”bytes”的某個數(shù)據(jù)中的一塊以及該數(shù)據(jù)的版本號。2. 2. 2返回格式
〈VALUE〈key〉〈flags〉〈offset〉〈bytes〉[(cas uni que}] \r\n <da ta block〉\r\n>*END\r\n
3、對象協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取對象數(shù)據(jù) 3.I存儲命令
3.I. I命令格式
<xml set I jsonse t>〈key [ (. field) *]>〈flags〉〈exptime〉<bytes> \r\n〈datablock〉 |r\n 表明客戶端以”々印廠(·表明其所要存取的數(shù)據(jù)在xml或json文件中的具體
位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”?!磝mlcas / jsoncas}〈key[ (. field) *]> <flags}〈exptime〉〈bytes〉〈caseunique}\r\n〈da ta block〉\r\n
表明客戶端以”々印廠(·表明其所要存取的數(shù)據(jù)在xml或json文件中的具體
位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,所要求的數(shù)據(jù)版本號為“cas unique”。3.1.2返回格式
ST0RED\r\n
對于”Xttilse ”或” jsonset ”命令,如果存儲成功,則返回此命令。EXISTS\r\n
對于”Xmlcas”或” jsoncas”命令,如果輸入的版本號存在且存儲成功,則返回此命令。N0T_F0UND\r\n
對于” xmlcas”或” jsoncas”命令,如果輸入的版本號不存在,則返回此命令。DA TA—ERROR\r\n
如果要存儲的數(shù)據(jù)格式不合要求,則返回此命令。PARSE_ERROR\r \n
如果要存儲的數(shù)據(jù)標簽對應關(guān)系不正確,則返回此命令。3. 2取出命令
3.2. I命令格式
<xml get I jasonget} < key[ (. field) *]>*\r \n
表明客戶端以”(· Λ' 7ο9*_/”表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù)?!磝mlgets / jasongets}〈 key [ (. field) *]>*\r\n
表明客戶端以”(· Λ' 7ο9*_/”表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù)和其所對應的版本號。
3. 2. 2返回格式
〈VALUE < key[ (. field) *]> <flags}〈bytes〉[(cas unique〉] \r\n〈data block} Ir\n>*END\r\n
3. 3刪除命令
3.3. I命令格式 〈xmldelete / jsondelete〉〈key [ (· field) *]>\r\n
表明客戶端在緩存中的xml或jason文件中的”左印廠(· Λ' 7ο9*_/”位置處刪除相應內(nèi)容。3. 3. 2返回格式
DELETED\r\n
表明xml或jason文件中的對應內(nèi)容已被刪除成功。N0T_F0UND\r\n
表明xml或jason文件中不存在相應的”左印廠(·位置的內(nèi)容。4、查詢協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中對數(shù)據(jù)鍵值和內(nèi)容的復雜混合查詢等
4.I鍵查詢
4.I. I前置查詢
4.I. I. I命令格式
query key. startwith (“〈keyprefix〉”) [KEY—ONLY] \r\n
表明客戶端以”為數(shù)據(jù)主鍵的開頭查詢相關(guān)數(shù)據(jù),可選擇返回該數(shù)據(jù)的主鍵還是整個數(shù)據(jù)。4. I. I. 2 返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n返回查找到的鍵值、附加存儲的內(nèi)容”flags”、數(shù)據(jù)大小”bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block。4. I. 2正則查詢
4.I. 2. I命令格式
query key. like (“〈regular expression} [KEY_0NLY] \ r\n表明客戶端以” regular為正則表達式查詢匹配該正則表達式的主鍵和
主鍵所對應的數(shù)據(jù)。4. I. 2. 2 返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n返回查找到的主鍵值、附加存儲的內(nèi)容”flags”、數(shù)據(jù)大小為”bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block。4. 2 值查詢
4.2. I命令格式
query value, querywi th (“ <query expression} [KEY_0NLY] \r\n表明客戶端以” regular為正則表達式查詢匹配該正則表達式的數(shù)據(jù)和
數(shù)據(jù)所對應的主鍵。
4. 2. I. I支持運算符
Y“>= ‘‘<= “= iiOf ‘like,
4. 2. I. 2支持連接符
‘md,,‘or,,‘(,,‘),
4. 2. 2返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n ]>*END\r \n返回查找到的主鍵值、附加存儲的內(nèi)容”flags”、數(shù)據(jù)大小為”bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block。4. 3混合查詢
該查詢是多個值查詢以“and”和“or”相結(jié)合的復雜查詢的實現(xiàn)方式 4. 3. I命令示例
query key. s tartwi th (“〈keyprefix>,,) and key. like (“〈regular expression} or value, querywi th (uKquery expression〉,’) \r \n
4.3. 2支持連接符
‘md,,‘or,,‘(,,‘),
4. 3. 3返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n4. 4、索引建立
4. 4. I命令格式
vi <. field (. field) *> \r \n
表明客戶端對00對象的某個子鍵建立索引,自動忽略非00或者不含此子鍵的對象。返回格式
CREATED\r\n
表明該索引已被成功創(chuàng)建。4. 5索引刪除
4. 5. I命令格式
dvi K. field (. field) *> \r \n
表明客戶端刪除相應的索引。4. 5. 2返回格式
DELETED\r\n表明索引刪除成功。N0T_F0UND\r\n表明相應的索引不存在。4. 6錯誤代碼表明對協(xié)議命令的使用出錯或程序運行在客戶端或服務端出現(xiàn)其他錯誤
ERR0R\r\n
CLIENT_ERROR <error> \r \nSERVER—ERROR <error> \r \n0本發(fā)明按照上述四個模塊來實施,將每一個功能模塊單獨分開來實施。本發(fā)明部分引用memcached協(xié)議。下面將就本體系作詳細介紹。錯誤代碼
ERROR\r\n指令代碼不可識別。CLIENT—ERROR <error> |r \n
識別出相應指令,但是指令格式不符合約定。SERVER—ERROR <error> \r \n
服務器發(fā)生嚴重錯誤。一般情況下這種錯誤并不常見。 協(xié)議模塊
I、普通協(xié)議
I.I存儲命令
I.I. I示例命令
set key I O 3000 50\r \n〈data block} \r\n
cas key2 I 1272164977406 IOOO 5\r\n〈data block} \r \n
1.1.2命令解析
此命令為將一個數(shù)據(jù)塊存入服務器。參數(shù)解析
<key>
將要存儲的數(shù)據(jù)鍵 <flags}
數(shù)據(jù)標志位,用戶自定義 〈exp time〉
數(shù)據(jù)過期時間。若為O則永不過期
若為UNIX時間戳,則過期日為此時間 否則過期時間為從現(xiàn)在起的exptime秒 〈bytes〉
將要存儲的數(shù)據(jù)塊大小
〈cas unique}
當前數(shù)據(jù)版本號,使用cas命令時,此版本號必須與實際版本號匹配,否則插入失敗。〈da ta block〉
將要插入的二進制數(shù)據(jù)塊。I. I. 3返回代碼
ST0RED\r\n表述數(shù)據(jù)存儲成功EXISTS\r\n
表不使用cas命令存儲時版本號與實際版本號不匹配。
N0T_F0UND\r\n
表示用cas命令存儲此數(shù)據(jù)不存在或者已被存儲。
I. 2取出命令
I. 2. I命令示例
get key I key2 key3\r\ngets key I \r \n
1.2.2命令解析
返回鍵所對應的數(shù)據(jù),若無此數(shù)據(jù)則不返回。gets命令同時返回cas unique版本號。I. 2. 3返回示例
VALUE key I O 50\r\n<data block} \r \n VALUE key3 3 50\r\n<data block} \r\nEND\ r\n
VALUE key I O 50 3\r\n<data block} \r\n END\r\n
1.3刪除命令
i.命令示例
delete keyI \r \n
ii.命令解析
刪除一個鍵對應的數(shù)據(jù)。iii.返回代碼
DELETED\r\n
數(shù)據(jù)被成功刪除。NOT_FOUND\r\n
對應的數(shù)據(jù)未找到。I. 4狀態(tài)命令
i.命令解析
返回當天服務器的狀態(tài)列表。ii.返回示例
STAT maxSize 10000\r\nSTAT usedSize 50\r\nEND\r\n
2、流協(xié)議
2.I存儲命令
2.I. I命令示例
sset key I O O |r \n〈data frames} \r\nseas key I I O 5\r \n〈data frames} \r\n
2.2. 2命令解析
普通存儲命令必須傳入數(shù)據(jù)塊大小,在流協(xié)議中,數(shù)據(jù)大小在編碼完成前是未知的,所以sset命令中無需〈bytes〉參數(shù)。同時將〈data block〉中的內(nèi)容由raw data改為數(shù)據(jù)巾貞(data frames)。數(shù)據(jù)中貞具體格式如附圖I。每個幀的開頭都包含前一幀的數(shù)據(jù)塊長度和當前幀的數(shù)據(jù)塊長度。第一幀的前幀長度為0,整個數(shù)據(jù)幀以當前幀長為O的幀結(jié)束。當校驗第一幀的前幀長度不為0,或者后續(xù)幀的前幀長度和實際不符,則判斷為數(shù)據(jù)錯誤,報“DATA_ERR0R\r\n”錯誤。2. 2. 3返回代碼STORED\r\nEXISTS\r\nNOT_FOUND\r\n以上同普通存儲協(xié)議DATA_ERROR\r\n數(shù)據(jù)幀解析失敗
2.2取出命令
2.2. I命令示例
sget key I O 100 key2 O -I \r\nsgets key I 100 O key2 100 50\r\n
2.2. 2命令解析
sget命令中key, offset和bytes為一組鍵參數(shù)。鍵參數(shù)可為多組。執(zhí)行結(jié)果類似于普通的取出命令,但是增加offset參數(shù),并且每組返回數(shù)據(jù)均為從指定offset開始,最大長度為bytes的數(shù)據(jù)塊。若offest越界,則將offset和bytes同時置為O。若bytes越界,貝U獲取從offset開始的所有數(shù)據(jù)。返回數(shù)據(jù)為raw data,而非數(shù)據(jù)中貞。其余規(guī)則同普通取出命令。2. 2. 3返回示例
VALUE key I O O 50\r\n<data block} \r \n VALUE key2 3 0 50\r\n<data block〉\r\nEND\r\n
VALUE key I 0 100 50 3\r\n<data block} \r\n END\r\n
3、對象協(xié)議
對象協(xié)議不局限于xml和jason,可擴展至其他平臺無關(guān)性數(shù)據(jù)協(xié)議。3. I存儲協(xié)議
3.I. I命令示例
xml set key I I O 50\r\n〈data block} \r\njasoncas key I. a I 0 100 5\r\n〈data block} \r\n
3.1.2命令解析
鍵不含子鍵
傳入數(shù)據(jù)必須能被指定格式(xml或json,其他格式也可以)解析,否則報“DATA_ERR0R\r\n” 錯誤。鍵包含子鍵
自動忽略flags和exptime。輸入數(shù)據(jù)必須包含相應的子鍵,如keyl. a. b對應的輸入必須包含<a><b>value</b></a>,否則報 “DATA_ERR0R\r\n” 錯誤。若對應主鍵下無數(shù)據(jù),則存入相應的子鍵。若對應主鍵下有數(shù)據(jù),解析相應數(shù)據(jù),只更新相應的子鍵。若解析失敗則報“PARSE_ERR0R\r\n” 錯誤。
3. I. 3返回代碼
STORED\r\nEXISTS\r\nNOT_FOUND\r\n以上同普通存儲DATA_ERROR\r\n輸入數(shù)據(jù)解析失敗PARSE_ERROR\r\n主鍵下原有數(shù)據(jù)解析失敗
3.2取出命令
3. 2. I命令示例 xmlge t key I. a. b \r \n xmlgets key I \r \n
3.2. 2命令解析
若指定主鍵下的數(shù)據(jù)不能被指定協(xié)議解析,報“PARSE_ERR0R\r\n”錯誤。若未指定子鍵,則返回全部數(shù)據(jù)。若指定子鍵,則只獲取子鍵內(nèi)容(包含tag信息)。如xmlget keyl. a. b,返回內(nèi)容需為〈a>〈b>value〈/b>〈/a>,而不僅僅是 value.
若解析錯誤,作為數(shù)據(jù)不存在處理,不報錯誤。3. 2. 3返回示例
VALUE keyl. a. b O 50\r \n<data blockl> \r \nEND \r\ndata blockl 為
〈a>〈b>hello world〈/b>〈/a>
VALUE keyl 0 50 3\r\n<data block2> \r\n END\r\ndata block2 為
〈a〉〈c〉this is〈/c〉〈b〉hello worlcl〈/b>〈e>〈f>haha〈/f>〈/e>〈/a>
3.3刪除命令
3. 3. I命令示例 jasondele te keyl. a. b \r \n
3.3. 2命令解析
刪除一個子鍵。刪除整個最內(nèi)層子鍵,包含tag信息。如
<a><c>this is</c><b>hello WOrZor(ZfcXe)OAaAa(Zf)OXZg)在刪除· a. b 子鍵后
為
〈a>〈c>this is〈/<e><f>haha〈/f>〈/e>〈/a〉
3.3. 3返回代碼
DELETED\r\n刪除成功N0T_F0UND\r\n對應子鍵不存在
4、查詢協(xié)議
4.I鍵查詢
4.I. I前置查詢
命令示例
query key. s tartwi th (“this”) KEY—ONLY \r\n命令解析
特殊符號需要轉(zhuǎn)譯,如
找到所有鍵以〈keyprefix〉打頭的數(shù)據(jù)。若有KEY_ONLY標識,則不返回數(shù)據(jù),只返回鍵和一些相關(guān)屬性,否則和普通取出命令一樣依次返回匹配數(shù)據(jù)。返回示例
VALUE thisO O 500\r\nVALUE thisl O 500\r\nVALUE this2 0 500\r\nEND\r\n
4.I. 2正則查詢
命令示例
query key. like Ci ^
_ this \r \n命令解析
針對正則表達式對所有的鍵進行匹配,返回所有匹配的鍵及對應數(shù)據(jù),若標識為KEY_ONLY則不返回數(shù)據(jù)。正則查詢需要對所有的鍵進行掃描,效率一般較低 返回示例
VALUE O—this O 500\r\n<data block>\r\nVALUE I—this 0 500\r\n<data block>\r\n VALUE 2—this 0 500\r\n<data block>\r\nEND\r\n
4.2值查詢
命令示例
query value, querywi th (“· a. b > 10 and . c like \ff ^E \,,,,) KEY—ONLY \r\n命令解析
子鍵必須以”開頭。自動忽略非00類型數(shù)據(jù),對于00對象,根據(jù)對應類型(xml,json或者其他)解析原有數(shù)據(jù),取出對應子鍵進行比較。自動忽略解析錯誤的數(shù)據(jù)。如有索引優(yōu)先使用索引
若沒有索引或者條件復雜時需要全表掃描,效率較低。返回示例
VALUE keyl O 500\r \n VALUE key2 0 500\r\nVALUE key3 0 500\r\nEND\r\n
4.3混合查詢
命令示例
query value, querywi th (“· a. b > 10 and . c like I ” 7 1,,,,) and (key. s tartwi th(“this”) or key. like Ci ^
_ this ) KEY_ONLY\r\n命令解析
支持鍵和值混合的復雜查詢。
可能涉及全表掃描,效率較低。4. 4索引建立
命令示例 vi . a. b\r \n 命令解析
子鍵需要以”開始。對00對象的某個子鍵建立索引,自動忽略非00或者不含此子鍵的對象。有助于提高非正則查詢效率。返回代碼
CREATED\r\n索引創(chuàng)建成功
4.5索引刪除
命令示例 dvi · a. b \r\n
命令解析
刪除對應的索引。返回代碼
DELETED\r\n索引刪除成功N0T_F0UND\r\n指定索弓I不存在
本發(fā)明主要在memcached協(xié)議基礎上做修改和改進,除了在普通協(xié)議部分保留對普通非結(jié)構(gòu)話數(shù)據(jù)存取和讀取的部分功能外,主要實現(xiàn)對大對象或者應用層流對象的數(shù)據(jù)存取,使客戶端在數(shù)據(jù)存取前不必獲取整塊完整的數(shù)據(jù)或確保其數(shù)據(jù)塊不超過內(nèi)存限制,并能獲取指定區(qū)塊的大容量數(shù)據(jù)中的局部數(shù)據(jù),大大方便了各種類型非結(jié)構(gòu)化應用層數(shù)據(jù)的靈活存儲和獲取。此外,提供了多種靈活的數(shù)據(jù)檢索方式,提供既支持鍵值又支持內(nèi)容的前置查詢、正則查詢、關(guān)聯(lián)查詢等功能。新的協(xié)議的保留基于存儲鍵/值對的hashmap的實現(xiàn)方式,但其增加了基于B+樹的支持靈活數(shù)據(jù)檢索的實現(xiàn)方式,從而保證了大容量非結(jié)構(gòu)化數(shù)據(jù)存儲、獲取、檢索等的效率。
權(quán)利要求
1.一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取和查詢多種類型的非結(jié)構(gòu)化數(shù)據(jù)的具體實現(xiàn),,其特征在于,該協(xié)議包括 (I)普通數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取普通類型的非結(jié)構(gòu)化數(shù)據(jù)的具體實現(xiàn) (I. I)普通數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以“key”為主鍵,向緩存中存儲“data block”,所存儲的數(shù)據(jù)大小為“bytes”,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下<key>〈flags〉〈exptime〉Kbytes} \r\n〈data 辦尤> Ir I/ ”,若存儲成功,則返回“I/ ” 客戶端以“key”為主鍵,向緩存中存儲“data block”,所存儲的數(shù)據(jù)大小為“bytes”,數(shù)據(jù)有效期至“exptime”,所要求的數(shù)據(jù)版本號為“cas unique”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下“cas〈key〉〈flags〉〈exptime〉〈bytes〉〈cas unique} \r\n〈data block〉|r \n ”,如果輸入的版本號存在且存儲成功,則返回“EXISTS\r \n ”,如果輸入的版本號不存在,則返回“NOT_WUNDIr \n” (I. 2)普通數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以“key”為主鍵,獲取相應的“data block”,命令格式如下“gets <key>*\r I/ ” ;若獲取數(shù)據(jù)成功,貝 Ij返回“〈VALUE <key> <flags}〈bytes〉\r\n<data block} \r In〉*END |r \n ” 客戶端以“key”為主鍵,獲取相應的“data block”和相應的版本號,命令格式如下“gets1 ” ;若獲取數(shù)據(jù)成功,貝 1J返回“〈VALUE <key> <flags}〈bytes〉〈casunique} \r \n〈da ta block} Ir In>*END\r \n (I. 3)數(shù)據(jù)刪除命令的實現(xiàn) 客戶端在緩存中刪除以“key”為主鍵的相應數(shù)據(jù),命令格式如下'“deleter\n\若刪除成功,則返回“DELETED Ir k ”,若以該“ key ”為主鍵的值不存在,則返回” NOT_FOUND\r\n” ; (1.4)獲取緩存狀態(tài)命令的實現(xiàn) 客戶端想獲取服務器的狀態(tài)列表,命令格式如下Ir U ”,若獲取狀態(tài)成功,則返回“〈STAT <name> <value〉Ir In〉*END\r \nv 流數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取流數(shù)據(jù)的具體實現(xiàn) (2. I)流數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以“key”為主鍵,向緩存中存儲數(shù)據(jù)幀(data frames),數(shù)據(jù)幀的格式如圖I所示; 可見,數(shù)據(jù)幀的存儲時分段實現(xiàn)的,每個分段的數(shù)據(jù)前加控制命令以表明該段數(shù)據(jù)的大小,因此可以存儲大容量的數(shù)據(jù)并維持數(shù)據(jù)的一致性,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為 “flags”,命令格式如下“sset〈key>〈flags>〈exptime>\r\n〈data frames>\r\n”,若存儲成功,則返回“ST0RED\r\n” ; 客戶端以“key”為主鍵,向緩存中存儲data frames,所存儲的數(shù)據(jù)版本號為“cas unique”,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flag”,命令格式如下:uscas<key><f IagsXexptimeXcas unique>\r\n<data frames>\r\n”,如果輸入的版本號存在且存儲成功,則返回“EXISTS\r\n”;如果輸入的版本號不存在,則返回“NOT_FOUND\r\n” ;如果輸入的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r\n” ; (2. 2)流數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以” key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以“offset”為偏移量,大小為“bytes”的某個數(shù)據(jù)中的部分數(shù)據(jù),命令格式如下 key>〈offset〉r I/ ”,若數(shù)據(jù)獲取成功,則返回 “<7^見 <key> <flags}〈offset〉〈bytes〉\r\n<datablock〉|r \n>*END\r \n; 客戶端以“key”為主鍵,從緩存中獲取某個數(shù)據(jù)中以“offset”為偏移量,大小為“bytes”的某個數(shù)據(jù)中的一塊以及該數(shù)據(jù)的版本號,命令格式如下“sgets key>〈offset〉若數(shù)據(jù)獲取成功,則返回“〈VALUE <key> <flags}〈offset〉 〈bytes〉〈cas uni que} \r\n <da ta block} \r \n>*END \r\n,y ; 對象數(shù)據(jù)存取協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中存取對象數(shù)據(jù)的具體實現(xiàn) (3. I)對象數(shù)據(jù)存儲協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以“左印廠( field) *],,表明其所要存取的數(shù)據(jù)在xml或json文件中的具體位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,命令格式如下〈xmlset / json set}〈key [( field)*]> <flags}〈exptime〉<bytes> \r\n〈data block〉|r \n ”,若存儲成功,則返回“STORED |r \n ”,若要存儲的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r \n ”,如果要存儲的數(shù)據(jù)標簽對應關(guān)系不正確,則返回“PARSE_ERROR\r I/ ” ; 客戶端以“左印廠( 表明其所要存取的數(shù)據(jù)在xml或json文件中的具體位置,向緩存中存取data block,數(shù)據(jù)有效期至“exptime”,附加存儲的數(shù)據(jù)為“flags”,所要求的數(shù)據(jù)版本號為“cas unique”,命令格式如下/ jsoncas} <key[(.field) *]> <flags}〈exptime〉〈bytes〉〈case unique} \r\n〈data 辦尤> Ir 丨/ ,,,若輸入的版本號存在且存儲成功,則返回“EXISTS\r \n ”,若輸入的版本號不存在,則返回FOUND Ir \n ”,若要存儲的數(shù)據(jù)格式不合要求,則返回“DATA_ERROR\r \n ”,如果要存儲的數(shù)據(jù)標簽對應關(guān)系不正確,則返回“PARSE_ERROR\r \n ” ; (3. 2)普通數(shù)據(jù)獲取協(xié)議的實現(xiàn),包括實現(xiàn)以下兩種命令 客戶端以“左印廠( 表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù),命令格式如下〈xmlgets / jasongets> < key[ (. field) *]>*\r \n,y ;如果數(shù)據(jù)獲取成功,貝丨J返回< key[ (. field) *]> <flags} <bytes> \r \n<datablock〉|r \n>*END\r \n; 客戶端以“左印廠( 表明要從緩存中的xml或jason文件的某個具體位置獲取相應的數(shù)據(jù)和其所對應的版本號,命令格式如下〈xmlgets / jasongets> < key[(.field) *]>* Ir I/ ” ;如果數(shù)據(jù)獲取成功,貝U 返回“〈VALUE < key[ (. field) *]> <flags}〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ; (3. 3)對象數(shù)據(jù)刪除命令的實現(xiàn)客戶端在緩存中的xml或jason文件中的“左印廠( 位置處刪除相應內(nèi)容,命令格式如下/ jsondelete}〈key[ /i<97o9 *_/> Ir 丨/ ”,若 xml 或 jason文件中的對應內(nèi)容已被刪除成功,則返回” DELETED\r\n”,若或jason文件中不存在相應的 “key[ (. field) € ” 位置的內(nèi)容,則返回” NOT_FOUND Ir I/ ” ; (4)查詢協(xié)議的實現(xiàn),即在一個客戶端向多個分布式服務器的緩存中對數(shù)據(jù)鍵值和內(nèi)容的復雜混合查詢等的具體實現(xiàn) (4. I)鍵查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令 客戶端以為數(shù)據(jù)主鍵的開頭前置查詢相關(guān)數(shù)據(jù),命令格式如下“query key. startwith (“〈keyprefix〉,,) [KEY_0NLY] \r\n,y,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù)據(jù)獲取成功,則返回查找到的鍵值、附加存儲的內(nèi)容“flags”、數(shù)據(jù)大小“bytes”,如果要求返回整個數(shù)據(jù),則同時返回data block,格式如下“〈VALUE <key><flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n ” ; (4.2)正則查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令 客戶端以“八expression”為正則表達式查詢匹配該正則表達式的主鍵和主鍵所對應的數(shù)據(jù),命令格式如下-.“query key. like (“〈regular expression〉”)[KEY_Ir k”,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù)據(jù)獲取成功,則返回查找到的主鍵值、附加存儲的內(nèi)容” flags”、數(shù)據(jù)大小為“bytes”,如果要求返回整個數(shù)據(jù),則同時返回 data block,格式如下“〈VALUE〈key〉〈flags〉Kbytes} \r\n[(data block} \r In]>*END |r \n ” ; (4. 3)值查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令 客戶端以“regw/ar expression”為正則表達式查詢匹配該正則表達式的數(shù)據(jù)和數(shù)據(jù)所對應的主鍵,命令格式如下“query value, querywith (“〈query expression〉”)[KEY_ONLY]\r\n,,,可選擇返回查找到的數(shù)據(jù)主鍵還是整個數(shù)據(jù),若數(shù)據(jù)獲取成功,則返回查找到的主鍵值、附加存儲的內(nèi)容“flags”、數(shù)據(jù)大小為“bytes”,如果要求返回整個數(shù)據(jù),則同時返回 data block,格式如下“〈VALUE <key> <flags} <bytes> \r\n[(dataWocP IrIr I/ ”;值查詢命令還可以支持多個運算符,比如"V、‘<,、)=,、‘<=,、C、W、等,支持連接符,比如‘or,,‘(,,7等,返回格式不變; (4.4)混合查詢協(xié)議的實現(xiàn),包括實現(xiàn)以下的命令 該查詢是多個值查詢以“and”和“or”相結(jié)合的復雜鍵值查詢和值查詢的實現(xiàn)方式,命令格式(舉例)如下query key. s tartwi th (“ keyprefix〉”) and key. like (“〈regularexpression} “)or value, querywi th Ci query expression} 丨/ ”,返回格式同值查詢相同 (4. 5)建立索引的協(xié)議實現(xiàn),包括實現(xiàn)以下的命令 客戶端對00對象的某個子鍵建立索引,自動忽略非00或者不含此子鍵的對象,命令格式如下 /‘ Vi. C field (./_/£^/ 1了1/7”,若索引已被成功創(chuàng)建,則返回“0別7^1了1/ ”;(4. 6)刪除索引的協(xié)議實現(xiàn),包括實現(xiàn)以下的命令 客戶端刪除相應的索引,命令格式如下'“dvi < field ( /id>lrk”,若索引刪除成功,則返回“DELETED Irk”若相應索弓丨不存在,則返回” N0T—F0UND Ir I/ "; (5 )上述命令如果在使用時出錯或程序運行在客戶端或服務端出現(xiàn)其他錯誤,則會返回以下出錯信息,如 “ERROR\r\n,CLIENT_ERROR <error>\r\n, SERVER_ERROR <error>\ r\n,,。
全文摘要
本發(fā)明公開了一種支持多粒度查詢的高性能非結(jié)構(gòu)化數(shù)據(jù)存取協(xié)議,用于在一個客戶端向多個分布式服務器的緩存中存取和查詢多種類型的非結(jié)構(gòu)化數(shù)據(jù)的具體實現(xiàn),該協(xié)議包括普通數(shù)據(jù)存取協(xié)議的實現(xiàn)、流數(shù)據(jù)存取協(xié)議的實現(xiàn)和查詢協(xié)議的實現(xiàn);其中,普通協(xié)議可以方便高效地把數(shù)據(jù)存儲,取出,刪除;流協(xié)議可以在有限的內(nèi)存條件下存儲大文件,消除內(nèi)存拷貝,減少延遲;對象協(xié)議可以在存儲OO對象時可以做到語言無關(guān)性,可以存儲或者獲取OO對象中的某個子對象的內(nèi)容;查詢協(xié)議不再局限于鍵完全匹配的查尋,提供了靈活多樣的查尋方式;支持對OO對象建立索引,提高查詢的效率。
文檔編號G06F17/30GK102750300SQ20111044377
公開日2012年10月24日 申請日期2011年12月27日 優(yōu)先權(quán)日2011年12月27日
發(fā)明者李善平, 楊小虎, 王新宇, 王新根 申請人:浙江大學