一种支持多粒度查询的高性能非结构化数据存取协议的制作方法

文档序号:6443413阅读:235来源:国知局
专利名称:一种支持多粒度查询的高性能非结构化数据存取协议的制作方法
技术领域
本发明涉及Web应用技术领域,尤其涉及一种支持多粒度查询的高性能非结构化数据存取协议。
背景技术
非结构化数据缓存是动态分布式Web应用的重要实现技术,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,最终减轻数据库负载。基于分布式内存对象的非结构化数据存储协议是分布式复杂数据对象缓存的具体实现形式和功能展现。当前非结构化数据对象缓存协议memcached是基于存储键/值对的hashmap实现,其存储协议中提供了支持分布式操作的数据存取(set, cas)功能和数据获取(get, gets)功能。基于混合型非关系数据库Cassandra采用DHT (分布式哈希表)的完全P2P架构实现,其数据存储协议提供了比分布式存储键/值对方式更丰富的功能,主要 增加了基于自定义键值范围设定的数据查询功能等。Hadoop Common产品中的基于GoogleBigTable的分布式数据库HBase,适合存储非结构化或半结构化的稀疏数据,但其存储协议中缺少数据表同表之间关联查询的需求。数据库网络接口 Tokyo Tyrant拥有memcached兼容协议,包括网络层流数据的缓存协议,可通过HTTP进行数据交换,并实现数据的持久存储,但其不能获取数据的指定区域。综上所述,当前的非结构化数据存取协议存在以下不足
I、存入前必须提前知道数据块的大小,不利于大对象或者应用层流对象的存入。2、获取数据必须是整块数据,不能获取数据的指定区块。3、对于数据不能做复杂检索,只能根据键值获取。

发明内容
本发明的目的在于针对现有技术的不足,提供一种支持多粒度查询的高性能非结构化数据存取协议。本发明的目的是通过以下技术方案来实现的一种支持多粒度查询的高性能非结构化数据存取协议,用于在一个客户端向多个分布式服务器的缓存中存取和查询多种类型的非结构化数据的具体实现,,其特征在于,该协议包括
(I)普通数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取普通类型的非结构化数据的具体实现
(I. I)普通数据存储协议的实现,包括实现以下两种命令
客户端以“key”为主键,向缓存中存储“data block”,所存储的数据大小为“bytes”,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下<key>〈flags〉〈exptime〉Kbytes} \r\n〈data 办尤> Ir I/ ”,若存储成功,则返回I/ ”客户端以“key”为主键,向缓存中存储“data block”,所存储的数据大小为“bytes”,数据有效期至“exptime”,所要求的数据版本号为“cas unique”,附加存储的数据为“flags”,命令格式如下“cas〈key〉〈flags〉〈exptime〉Kbytes}〈cas unique} \r\n〈data block〉|r \n ”,如果输入的版本号存在且存储成功,则返回“EXISTS\r \n ”,如果输入的版本号不存在,则返回“NOTjmNDIr \n”
(I. 2)普通数据获取协议的实现,包括实现以下两种命令
客户端以“key”为主键,获取相应的“data block”,命令格式如下“gets <key>*\r I/ ” ;若获取数据成功,贝 U返回“〈VALUE <key> <flags}〈bytes〉\r\n<data block} \r In〉*END |r \n ”
客户端以“key”为主键,获取相应的“data block”和相应的版本号,命令格式如下“gets;若获取数据成功,贝1J返回“〈VALUE <key> <flags}〈bytes〉〈cas
unique} \r \n〈da ta block} Ir In>*END\r \n
(I. 3)数据删除命令的实现
客户端在缓存中删除以“key”为主键的相应数据,命令格式如下'“ deleteI
r\n\若删除成功,则返回“DELETED Ir k ”,若以该“ key ”为主键的值不存在,则返回” NOT_FOUND\r\n” ;
(1.4)获取缓存状态命令的实现
客户端想获取服务器的状态列表,命令格式如下Ir U ”,若获取状态成功,则返回“〈STAT <name> <value〉Ir In〉*END\r \nv
(2)流数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取流数据的具体实现
(2. I)流数据存储协议的实现,包括实现以下两种命令
客户端以“key”为主键,向缓存中存储数据帧(data frames),数据帧的格式如图I所
示;
可见,数据帧的存储时分段实现的,每个分段的数据前加控制命令以表明该段数据的大小,因此可以存储大容量的数据并维持数据的一致性,数据有效期至“exptime”,附加存储的数据为 “flags”,命令格式如下“sset〈key>〈flags>〈exptime>\r\n〈data frames>\r\n”,若存储成功,则返回“ST0RED\r\n” ;
客户端以“key”为主键,向缓存中存储data frames,所存储的数据版本号为“cas unique”,数据有效期至“exptime”,附加存储的数据为“flag”,命令格式如下:uscas<key><f IagsXexptimeXcas unique>\r\n<data frames>\r\n”,如果输入的版本号存在且存储成功,则返回“EXISTS\r\n”;如果输入的版本号不存在,则返回“N0T_F0UND\r\n” ;如果输入的数据格式不合要求,则返回“DATA_ERROR\r\n” ;
(2. 2)流数据获取协议的实现,包括实现以下两种命令
客户端以”key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的部分数据,命令格式如下Zsgei <<key>〈offset〉r I/ ”,若数据获取成功,则返回 “<7^见 <key> <flags}〈offset〉〈bytes〉\r\n<datablock〉|r \n>*END\r \n;
客户端以“key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的一块以及该数据的版本号,命令格式如下“sgets key>〈offset〉若数据获取成功,则返回“〈VALUE <key> <flags}〈offset〉〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ;
(3)对象数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取对象数据的具体实现
(3. I)对象数据存储协议的实现,包括实现以下两种命令
客户端以“左印厂(· field) *],,表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下·,“〈xmlset / json set}〈key [(· field)*]> <flags}〈exptime〉<bytes> \r\n〈data block〉|r \n ”,若存储成功,则返回“STORED |r \n ”,若要存储的数据格式不合要求,则返回“DATA_ERROR\r \n ”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR\ r I/ ” ;
客户端以“左印厂(· Λ' 7ο9*_/”表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,所要求的数据版本号为“cas unique”,命令格式如下cas / jsoncas} <key[(.field) *]> <flags}〈exptime〉〈bytes〉〈case unique} \r\n〈data 办尤> Ir 丨/ ,,,若输入的版本号存在且存储成功,则返回“EXISTS\r \n ”,若输入的版本号不存在,则返回FOUND Ir \n ”,若要存储的数据格式不合要求,则返回“DATA_ERROR\r \n ”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR\r \n ” ;
(3. 2)普通数据获取协议的实现,包括实现以下两种命令
客户端以“左印厂(· Λ' 7ο9*_/”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据,命令格式如下·.“〈xmlgets / jasongets> < key[ (. field) *]>*\r \n,y ;如果数据获取成功,贝丨J返回< key[ (. field) *]> <flags} <bytes> \r \n<data
block〉|r \n>*END\r \n;
客户端以“左印厂(· Λ' 7ο9*_/”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据和其所对应的版本号,命令格式如下〈xmlgets / jasongets> < key[(.field) *]>* Ir I/ ” ;如果数据获取成功,贝U 返回“〈VALUE < key[ (. field) *]> <flags}〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ;
(3. 3)对象数据删除命令的实现
客户端在缓存中的xml或jason文件中的“左印厂(·位置处删除相应内容,
命令格式如下/ jsondelete}〈key[ Γ·/i<97o9 Ir 丨/ ”,若 xml 或 jason文件中的对应内容已被删除成功,则返回” DELETED\r\n”,若或jason文件中不存在相应的 “key[ (. field) € ” 位置的内容,则返回” NOT_FOUND Ir I/ ” ;
(4)查询协议的实现,即在一个客户端向多个分布式服务器的缓存中对数据键值和内容的复杂混合查询等的具体实现
(4. I)键查询协议的实现,包括实现以下的命令
客户端以为数据主键的开头前置查询相关数据,命令格式如下“querykey. startwith (“〈keyprefix〉,,) [KEY_ONLY] \r\n,y,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的键值、附加存储的内容“flags”、数据大小“bytes”,如果要求返回整个数据,则同时返回data block,格式如下“〈VALUE <key><flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n ” ;(4.2)正则查询协议的实现,包括实现以下的命令
客户端以expression”为正则表达式查询匹配该正则表达式的主键和主键所对应的数据,命令格式如下-.“query key. like (“〈regular expression〉”)[KEY_Ir k”,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的主键值、附加存储的内容” flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回 data block,格式如下“〈VALUE〈key〉〈flags〉Kbytes} \r\n[(data block} \r In]>*END |r \n ” ;
(4. 3)值查询协议的实现,包括实现以下的命令
客户端以“regular expression ”为正则表达式查询匹配该正则表达式的数据和数据所对应的主键,命令格式如下“query value, querywi th (“〈queryexpression〉”)[KEY—ONLY] \r\n”,可选择返回查找到的数据主键还是整个数据,若数 据获取成功,则返回查找到的主键值、附加存储的内容“flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回data block,格式如下“〈VALUE <key>〈flags〉<bytes> |r \n[(dataIrI/ ” ;值查询命令还可以支持多个运算符,比如
Y ‘‘>= ‘‘〈= “= iiOf ,等,支持连接符,比如—V, ‘or,,‘(,,‘),等,返回格式不变
(4.4)混合查询协议的实现,包括实现以下的命令
该查询是多个值查询以“and”和“or”相结合的复杂键值查询和值查询的实现方式,命令格式(举例)如下query key. s tartwi th Ci keyprefix} and key. like Ci Kregularexpression} “)or value, querywi th Ci query expression} 丨/ ”,返回格式同值查询相同
(4. 5)建立索引的协议实现,包括实现以下的命令
客户端对00对象的某个子键建立索引,自动忽略非00或者不含此子键的对象,命令格式如下·.“ ν C field Γ.Ir I/ ”,若索引已被成功创建,则返回Ir I/ ”;(4. 6)删除索引的协议实现,包括实现以下的命令
客户端删除相应的索引,命令格式如下'“dvi <· field (· /idWPlrk”,若索引删除成功,则返回“DELETED Ir I/ ”若相应索弓丨不存在,则返回” N0T—F0UND Ir I/ ";
(5 )上述命令如果在使用时出错或程序运行在客户端或服务端出现其他错误,则会返回以下出错信息,如 “ERR0R\r\n,CLIENT_ERR0R <error>\r\n, SERVER_ERR0R <error>\r\n,,。本发明具有的有益效果是
I、普通协议可以方便高效地把数据存储,取出,删除。2、流协议可以在有限的内存条件下存储大文件,消除内存拷贝,减少延迟可以存储大小未知的数据;对于00的对象,可以边编码边传输,减少延迟非常明显;可以获取大数据块中的指定区块。对于超大的数据块提供了多线程并行下载的可能性;非常适合对于流媒体文件存放。可以获取播放任意一段流媒体。3、对象协议存储00对象时可以做到语言无关性;可以存储或者获取00对象中的某个子对象的内容。4、查询协议不再局限于键完全匹配的查寻,提供了灵活多样的查寻方式;支持对OO对象建立索引,提高查询的效率。


图I为数据帧的格式图。
具体实施例方式非结构化数据缓存协议是复杂数据对象分布式存储的重要实现形式和功能展现,广泛应用于动态分布式Web应用的大型系统中。当前的非结构化数据对象缓存协议只提供了支持分布式操作的简单数据对象的存取和获取功能和简单的自定义键值的数据查询,所要存取的数据对象大小事先必须已知且受内存大小的限制。本专利在现有的多个非结构化数据对象缓存协议的基础上,通过改进和重新设计memcached中的协议模块,实现了一个支持多粒度查询的高性能非结构化数据存取协议,包括实现了大规模流对象数据的存取和获取、数据的自定义部分存取以及多种灵活的复杂数据检索的实现,同时保证数据存取的高效性。 协议模块和相关介绍
I、普通协议,用于在一个客户端向多个分布式服务器的缓存中存取普通类型的非结构化数据,包括
I.I存储命令,其命令格式和返回格式如下
I.I. I命令格式
set〈key〉〈flags〉〈exptime〉Kbytes} \r \n〈data block} \r\n表明客户端以” key”为主键,向缓存中存储” data block”,所存储的数据大小为” bytes”,数据有效期至” exptime”,附加存储的数据为” flags”
cas〈key〉〈flags〉〈exptime〉Kbytes}〈cas unique} \r\n〈data block} \r\n表明客户端以” key”为主键,向缓存中存储” data block”,所存储的数据大小为”bytes”,数据有效期至”exptime”,所要求的数据版本号为”cas unique”,附加存储的数据为” 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状态命令,其命令格式和返回格式如下
1.4. I命令格式
sta ts |r \n
返回当天服务器的状态列表。I. 4. 2返回格式
〈STA T〈name〉< value} I r I n〉*END\r\n
2、流协议,用于在一个客户端向多个分布式服务器的缓存中存取流数据,包括
2.I存储命令
2.I. I命令格式
s set〈key〉〈flags〉K exp time} \r\n〈data frames} \r\n
表明客户端以”key”为主键,向缓存中存储data frames,所存储的数据大小不规定,数据有效期至“exptime”,附加存储的数据为“flags”。scas<key><fIagsXexptimeXcas unique>\r\n〈data frames>\r\n
表明客户端以”key”为主键,向缓存中存储data frames,所存储的数据版本号位”casunique”,数据有效期至” exptime”,附加存储的数据为” flag”
2.I. 2数据巾贞(data frames)格式如图I所示。
由此可见,流协议是对大容量数据的分段存储实现的,并在每个分段的数据前加控制命令以表明该段数据的大小,因此可以存储大容量的数据并维持数据的一致性。2. I. 2返回格式
ST0RED\r\n
对于” sset”命令,如果存储成功,则返回此命令。EXISTS\r\n
对于” seas”命令,如果输入的版本号存在且存储成功,则返回此命令。N0T_F0UND\r\n
对于” seas"命令,如果输入的版本号不存在,则返回此命令。DATA_ERR0R\r \n
对于” sset”或” seas”命令,如果输入的数据格式不符合要求,则返回此命令。2. 2取出命令
2.2. I命令格式
sget key}〈offset〉<bytes>}^\r\n表明客户端以”key”为主键,从缓存中获取某个数据中以”offset”为偏移量,大小为”bytes”的某个数据中的部分数据。sgets〈〈key〉〈offset〉<bytes>>*\r \n
表明客户端以”key”为主键,从缓存中获取某个数据中以”offset”为偏移量,大小为”bytes”的某个数据中的一块以及该数据的版本号。2. 2. 2返回格式
〈VALUE〈key〉〈flags〉〈offset〉〈bytes〉[(cas uni que}] \r\n <da ta block〉\r\n>*END\r\n
3、对象协议,用于在一个客户端向多个分布式服务器的缓存中存取对象数据 3.I存储命令
3.I. I命令格式
<xml set I jsonse t>〈key [ (. field) *]>〈flags〉〈exptime〉<bytes> \r\n〈datablock〉 |r\n 表明客户端以”々印厂(·表明其所要存取的数据在xml或json文件中的具体
位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”。〈xmlcas / jsoncas}〈key[ (. field) *]> <flags}〈exptime〉〈bytes〉〈caseunique}\r\n〈da ta block〉\r\n
表明客户端以”々印厂(·表明其所要存取的数据在xml或json文件中的具体
位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,所要求的数据版本号为“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
如果要存储的数据格式不合要求,则返回此命令。PARSE_ERROR\r \n
如果要存储的数据标签对应关系不正确,则返回此命令。3. 2取出命令
3.2. I命令格式
<xml get I jasonget} < key[ (. field) *]>*\r \n
表明客户端以”(· Λ' 7ο9*_/”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据。〈xmlgets / jasongets}〈 key [ (. field) *]>*\r\n
表明客户端以”(· Λ' 7ο9*_/”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据和其所对应的版本号。
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*_/”位置处删除相应内容。3. 3. 2返回格式
DELETED\r\n
表明xml或jason文件中的对应内容已被删除成功。N0T_F0UND\r\n
表明xml或jason文件中不存在相应的”左印厂(·位置的内容。4、查询协议,用于在一个客户端向多个分布式服务器的缓存中对数据键值和内容的复杂混合查询等
4.I键查询
4.I. I前置查询
4.I. I. I命令格式
query key. startwith (“〈keyprefix〉”) [KEY—ONLY] \r\n
表明客户端以”为数据主键的开头查询相关数据,可选择返回该数据的主键还是整个数据。4. I. I. 2 返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n返回查找到的键值、附加存储的内容”flags”、数据大小”bytes”,如果要求返回整个数据,则同时返回data block。4. I. 2正则查询
4.I. 2. I命令格式
query key. like (“〈regular expression} [KEY_0NLY] \ r\n表明客户端以” regular为正则表达式查询匹配该正则表达式的主键和
主键所对应的数据。4. I. 2. 2 返回格式
〈VALUE〈key〉<flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n返回查找到的主键值、附加存储的内容”flags”、数据大小为”bytes”,如果要求返回整个数据,则同时返回data block。4. 2 值查询
4.2. I命令格式
query value, querywi th (“ <query expression} [KEY_0NLY] \r\n表明客户端以” regular为正则表达式查询匹配该正则表达式的数据和
数据所对应的主键。
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返回查找到的主键值、附加存储的内容”flags”、数据大小为”bytes”,如果要求返回整个数据,则同时返回data block。4. 3混合查询
该查询是多个值查询以“and”和“or”相结合的复杂查询的实现方式 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
表明该索引已被成功创建。4. 5索引删除
4. 5. I命令格式
dvi K. field (. field) *> \r \n
表明客户端删除相应的索引。4. 5. 2返回格式
DELETED\r\n表明索引删除成功。N0T_F0UND\r\n表明相应的索引不存在。4. 6错误代码表明对协议命令的使用出错或程序运行在客户端或服务端出现其他错误
ERR0R\r\n
CLIENT_ERROR <error> \r \nSERVER—ERROR <error> \r \n0本发明按照上述四个模块来实施,将每一个功能模块单独分开来实施。本发明部分引用memcached协议。下面将就本体系作详细介绍。错误代码
ERROR\r\n指令代码不可识别。CLIENT—ERROR <error> |r \n
识别出相应指令,但是指令格式不符合约定。SERVER—ERROR <error> \r \n
服务器发生严重错误。一般情况下这种错误并不常见。 协议模块
I、普通协议
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命令解析
此命令为将一个数据块存入服务器。参数解析
<key>
将要存储的数据键 <flags}
数据标志位,用户自定义 〈exp time〉
数据过期时间。若为O则永不过期
若为UNIX时间戳,则过期日为此时间 否则过期时间为从现在起的exptime秒 〈bytes〉
将要存储的数据块大小
〈cas unique}
当前数据版本号,使用cas命令时,此版本号必须与实际版本号匹配,否则插入失败。〈da ta block〉
将要插入的二进制数据块。I. I. 3返回代码
ST0RED\r\n表述数据存储成功EXISTS\r\n
表不使用cas命令存储时版本号与实际版本号不匹配。
N0T_F0UND\r\n
表示用cas命令存储此数据不存在或者已被存储。
I. 2取出命令
I. 2. I命令示例
get key I key2 key3\r\ngets key I \r \n
1.2.2命令解析
返回键所对应的数据,若无此数据则不返回。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.命令解析
删除一个键对应的数据。iii.返回代码
DELETED\r\n
数据被成功删除。NOT_FOUND\r\n
对应的数据未找到。I. 4状态命令
i.命令解析
返回当天服务器的状态列表。ii.返回示例
STAT maxSize 10000\r\nSTAT usedSize 50\r\nEND\r\n
2、流协议
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命令解析
普通存储命令必须传入数据块大小,在流协议中,数据大小在编码完成前是未知的,所以sset命令中无需〈bytes〉参数。同时将〈data block〉中的内容由raw data改为数据巾贞(data frames)。数据中贞具体格式如附图I。每个帧的开头都包含前一帧的数据块长度和当前帧的数据块长度。第一帧的前帧长度为0,整个数据帧以当前帧长为O的帧结束。当校验第一帧的前帧长度不为0,或者后续帧的前帧长度和实际不符,则判断为数据错误,报“DATA_ERR0R\r\n”错误。2. 2. 3返回代码STORED\r\nEXISTS\r\nNOT_FOUND\r\n以上同普通存储协议DATA_ERROR\r\n数据帧解析失败
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为一组键参数。键参数可为多组。执行结果类似于普通的取出命令,但是增加offset参数,并且每组返回数据均为从指定offset开始,最大长度为bytes的数据块。若offest越界,则将offset和bytes同时置为O。若bytes越界,贝U获取从offset开始的所有数据。返回数据为raw data,而非数据中贞。其余规则同普通取出命令。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、对象协议
对象协议不局限于xml和jason,可扩展至其他平台无关性数据协议。3. I存储协议
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命令解析
键不含子键
传入数据必须能被指定格式(xml或json,其他格式也可以)解析,否则报“DATA_ERR0R\r\n” 错误。键包含子键
自动忽略flags和exptime。输入数据必须包含相应的子键,如keyl. a. b对应的输入必须包含<a><b>value</b></a>,否则报 “DATA_ERR0R\r\n” 错误。若对应主键下无数据,则存入相应的子键。若对应主键下有数据,解析相应数据,只更新相应的子键。若解析失败则报“PARSE_ERR0R\r\n” 错误。
3. I. 3返回代码
STORED\r\nEXISTS\r\nNOT_FOUND\r\n以上同普通存储DATA_ERROR\r\n输入数据解析失败PARSE_ERROR\r\n主键下原有数据解析失败
3.2取出命令
3. 2. I命令示例 xmlge t key I. a. b \r \n xmlgets key I \r \n
3.2. 2命令解析
若指定主键下的数据不能被指定协议解析,报“PARSE_ERR0R\r\n”错误。若未指定子键,则返回全部数据。若指定子键,则只获取子键内容(包含tag信息)。如xmlget keyl. a. b,返回内容需为〈a>〈b>value〈/b>〈/a>,而不仅仅是 value.
若解析错误,作为数据不存在处理,不报错误。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命令解析
删除一个子键。删除整个最内层子键,包含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、查询协议
4.I键查询
4.I. I前置查询
命令示例
query key. s tartwi th (“this”) KEY—ONLY \r\n命令解析
特殊符号需要转译,如
找到所有键以〈keyprefix〉打头的数据。若有KEY_ONLY标识,则不返回数据,只返回键和一些相关属性,否则和普通取出命令一样依次返回匹配数据。返回示例
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命令解析
针对正则表达式对所有的键进行匹配,返回所有匹配的键及对应数据,若标识为KEY_ONLY则不返回数据。正则查询需要对所有的键进行扫描,效率一般较低 返回示例
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类型数据,对于00对象,根据对应类型(xml,json或者其他)解析原有数据,取出对应子键进行比较。自动忽略解析错误的数据。如有索引优先使用索引
若没有索引或者条件复杂时需要全表扫描,效率较低。返回示例
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索引创建成功
4.5索引删除
命令示例 dvi · a. b \r\n
命令解析
删除对应的索引。返回代码
DELETED\r\n索引删除成功N0T_F0UND\r\n指定索弓I不存在
本发明主要在memcached协议基础上做修改和改进,除了在普通协议部分保留对普通非结构话数据存取和读取的部分功能外,主要实现对大对象或者应用层流对象的数据存取,使客户端在数据存取前不必获取整块完整的数据或确保其数据块不超过内存限制,并能获取指定区块的大容量数据中的局部数据,大大方便了各种类型非结构化应用层数据的灵活存储和获取。此外,提供了多种灵活的数据检索方式,提供既支持键值又支持内容的前置查询、正则查询、关联查询等功能。新的协议的保留基于存储键/值对的hashmap的实现方式,但其增加了基于B+树的支持灵活数据检索的实现方式,从而保证了大容量非结构化数据存储、获取、检索等的效率。
权利要求
1.一种支持多粒度查询的高性能非结构化数据存取协议,用于在一个客户端向多个分布式服务器的缓存中存取和查询多种类型的非结构化数据的具体实现,,其特征在于,该协议包括 (I)普通数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取普通类型的非结构化数据的具体实现 (I. I)普通数据存储协议的实现,包括实现以下两种命令 客户端以“key”为主键,向缓存中存储“data block”,所存储的数据大小为“bytes”,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下<key>〈flags〉〈exptime〉Kbytes} \r\n〈data 办尤> Ir I/ ”,若存储成功,则返回“I/ ” 客户端以“key”为主键,向缓存中存储“data block”,所存储的数据大小为“bytes”,数据有效期至“exptime”,所要求的数据版本号为“cas unique”,附加存储的数据为“flags”,命令格式如下“cas〈key〉〈flags〉〈exptime〉〈bytes〉〈cas unique} \r\n〈data block〉|r \n ”,如果输入的版本号存在且存储成功,则返回“EXISTS\r \n ”,如果输入的版本号不存在,则返回“NOT_WUNDIr \n” (I. 2)普通数据获取协议的实现,包括实现以下两种命令 客户端以“key”为主键,获取相应的“data block”,命令格式如下“gets <key>*\r I/ ” ;若获取数据成功,贝 Ij返回“〈VALUE <key> <flags}〈bytes〉\r\n<data block} \r In〉*END |r \n ” 客户端以“key”为主键,获取相应的“data block”和相应的版本号,命令格式如下“gets1 ” ;若获取数据成功,贝 1J返回“〈VALUE <key> <flags}〈bytes〉〈casunique} \r \n〈da ta block} Ir In>*END\r \n (I. 3)数据删除命令的实现 客户端在缓存中删除以“key”为主键的相应数据,命令格式如下'“deleter\n\若删除成功,则返回“DELETED Ir k ”,若以该“ key ”为主键的值不存在,则返回” NOT_FOUND\r\n” ; (1.4)获取缓存状态命令的实现 客户端想获取服务器的状态列表,命令格式如下Ir U ”,若获取状态成功,则返回“〈STAT <name> <value〉Ir In〉*END\r \nv 流数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取流数据的具体实现 (2. I)流数据存储协议的实现,包括实现以下两种命令 客户端以“key”为主键,向缓存中存储数据帧(data frames),数据帧的格式如图I所示; 可见,数据帧的存储时分段实现的,每个分段的数据前加控制命令以表明该段数据的大小,因此可以存储大容量的数据并维持数据的一致性,数据有效期至“exptime”,附加存储的数据为 “flags”,命令格式如下“sset〈key>〈flags>〈exptime>\r\n〈data frames>\r\n”,若存储成功,则返回“ST0RED\r\n” ; 客户端以“key”为主键,向缓存中存储data frames,所存储的数据版本号为“cas unique”,数据有效期至“exptime”,附加存储的数据为“flag”,命令格式如下:uscas<key><f IagsXexptimeXcas unique>\r\n<data frames>\r\n”,如果输入的版本号存在且存储成功,则返回“EXISTS\r\n”;如果输入的版本号不存在,则返回“NOT_FOUND\r\n” ;如果输入的数据格式不合要求,则返回“DATA_ERROR\r\n” ; (2. 2)流数据获取协议的实现,包括实现以下两种命令 客户端以” key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的部分数据,命令格式如下 key>〈offset〉r I/ ”,若数据获取成功,则返回 “<7^见 <key> <flags}〈offset〉〈bytes〉\r\n<datablock〉|r \n>*END\r \n; 客户端以“key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的一块以及该数据的版本号,命令格式如下“sgets key>〈offset〉若数据获取成功,则返回“〈VALUE <key> <flags}〈offset〉 〈bytes〉〈cas uni que} \r\n <da ta block} \r \n>*END \r\n,y ; 对象数据存取协议的实现,即在一个客户端向多个分布式服务器的缓存中存取对象数据的具体实现 (3. I)对象数据存储协议的实现,包括实现以下两种命令 客户端以“左印厂( field) *],,表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下〈xmlset / json set}〈key [( field)*]> <flags}〈exptime〉<bytes> \r\n〈data block〉|r \n ”,若存储成功,则返回“STORED |r \n ”,若要存储的数据格式不合要求,则返回“DATA_ERROR\r \n ”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR\r I/ ” ; 客户端以“左印厂( 表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,所要求的数据版本号为“cas unique”,命令格式如下/ jsoncas} <key[(.field) *]> <flags}〈exptime〉〈bytes〉〈case unique} \r\n〈data 办尤> Ir 丨/ ,,,若输入的版本号存在且存储成功,则返回“EXISTS\r \n ”,若输入的版本号不存在,则返回FOUND Ir \n ”,若要存储的数据格式不合要求,则返回“DATA_ERROR\r \n ”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR\r \n ” ; (3. 2)普通数据获取协议的实现,包括实现以下两种命令 客户端以“左印厂( 表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据,命令格式如下〈xmlgets / jasongets> < key[ (. field) *]>*\r \n,y ;如果数据获取成功,贝丨J返回< key[ (. field) *]> <flags} <bytes> \r \n<datablock〉|r \n>*END\r \n; 客户端以“左印厂( 表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据和其所对应的版本号,命令格式如下〈xmlgets / jasongets> < key[(.field) *]>* Ir I/ ” ;如果数据获取成功,贝U 返回“〈VALUE < key[ (. field) *]> <flags}〈bytes〉〈cas unique} \r \n<data block〉\r \n>*END\r \n ” ; (3. 3)对象数据删除命令的实现客户端在缓存中的xml或jason文件中的“左印厂( 位置处删除相应内容,命令格式如下/ jsondelete}〈key[ /i<97o9 *_/> Ir 丨/ ”,若 xml 或 jason文件中的对应内容已被删除成功,则返回” DELETED\r\n”,若或jason文件中不存在相应的 “key[ (. field) € ” 位置的内容,则返回” NOT_FOUND Ir I/ ” ; (4)查询协议的实现,即在一个客户端向多个分布式服务器的缓存中对数据键值和内容的复杂混合查询等的具体实现 (4. I)键查询协议的实现,包括实现以下的命令 客户端以为数据主键的开头前置查询相关数据,命令格式如下“query key. startwith (“〈keyprefix〉,,) [KEY_0NLY] \r\n,y,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的键值、附加存储的内容“flags”、数据大小“bytes”,如果要求返回整个数据,则同时返回data block,格式如下“〈VALUE <key><flags}〈bytes〉\r \n[\data block〉\r \n]>*END\r \n ” ; (4.2)正则查询协议的实现,包括实现以下的命令 客户端以“八expression”为正则表达式查询匹配该正则表达式的主键和主键所对应的数据,命令格式如下-.“query key. like (“〈regular expression〉”)[KEY_Ir k”,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的主键值、附加存储的内容” flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回 data block,格式如下“〈VALUE〈key〉〈flags〉Kbytes} \r\n[(data block} \r In]>*END |r \n ” ; (4. 3)值查询协议的实现,包括实现以下的命令 客户端以“regw/ar expression”为正则表达式查询匹配该正则表达式的数据和数据所对应的主键,命令格式如下“query value, querywith (“〈query expression〉”)[KEY_ONLY]\r\n,,,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的主键值、附加存储的内容“flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回 data block,格式如下“〈VALUE <key> <flags} <bytes> \r\n[(dataWocP IrIr I/ ”;值查询命令还可以支持多个运算符,比如"V、‘<,、)=,、‘<=,、C、W、等,支持连接符,比如‘or,,‘(,,7等,返回格式不变; (4.4)混合查询协议的实现,包括实现以下的命令 该查询是多个值查询以“and”和“or”相结合的复杂键值查询和值查询的实现方式,命令格式(举例)如下query key. s tartwi th (“ keyprefix〉”) and key. like (“〈regularexpression} “)or value, querywi th Ci query expression} 丨/ ”,返回格式同值查询相同 (4. 5)建立索引的协议实现,包括实现以下的命令 客户端对00对象的某个子键建立索引,自动忽略非00或者不含此子键的对象,命令格式如下 /‘ Vi. C field (./_/£^/ 1了1/7”,若索引已被成功创建,则返回“0别7^1了1/ ”;(4. 6)删除索引的协议实现,包括实现以下的命令 客户端删除相应的索引,命令格式如下'“dvi < field ( /id>lrk”,若索引删除成功,则返回“DELETED Irk”若相应索弓丨不存在,则返回” N0T—F0UND Ir I/ "; (5 )上述命令如果在使用时出错或程序运行在客户端或服务端出现其他错误,则会返回以下出错信息,如 “ERROR\r\n,CLIENT_ERROR <error>\r\n, SERVER_ERROR <error>\ r\n,,。
全文摘要
本发明公开了一种支持多粒度查询的高性能非结构化数据存取协议,用于在一个客户端向多个分布式服务器的缓存中存取和查询多种类型的非结构化数据的具体实现,该协议包括普通数据存取协议的实现、流数据存取协议的实现和查询协议的实现;其中,普通协议可以方便高效地把数据存储,取出,删除;流协议可以在有限的内存条件下存储大文件,消除内存拷贝,减少延迟;对象协议可以在存储OO对象时可以做到语言无关性,可以存储或者获取OO对象中的某个子对象的内容;查询协议不再局限于键完全匹配的查寻,提供了灵活多样的查寻方式;支持对OO对象建立索引,提高查询的效率。
文档编号G06F17/30GK102750300SQ20111044377
公开日2012年10月24日 申请日期2011年12月27日 优先权日2011年12月27日
发明者李善平, 杨小虎, 王新宇, 王新根 申请人:浙江大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1