发明名称 一种支持多粒度查询的高性能非结构化数据存取方法
摘要 本发明公开了一种支持多粒度查询的高性能非结构化数据存取方法,用于在一个客户端向多个分布式服务器的缓存中存取和查询多种类型的非结构化数据的具体实现,该协议包括普通数据存取协议的实现、流数据存取协议的实现和查询协议的实现;其中,普通协议可以方便高效地把数据存储,取出,删除;流协议可以在有限的内存条件下存储大文件,消除内存拷贝,减少延迟;对象协议可以在存储OO对象时可以做到语言无关性,可以存储或者获取OO对象中的某个子对象的内容;查询协议不再局限于键完全匹配的查寻,提供了灵活多样的查寻方式;支持对OO对象建立索引,提高查询的效率。
申请公布号 CN102750300B 申请公布日期 2014.05.07
申请号 CN201110443773.3 申请日期 2011.12.27
申请人 浙江大学 发明人 王新宇;王新根;李善平;杨小虎
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 杭州求是专利事务所有限公司 33200 代理人 周烽
主权项 一种支持多粒度查询的高性能非结构化数据存取方法,用于在一个客户端向多个分布式服务器的缓存中存取和查询多种类型的非结构化数据的具体实现,其特征在于,该方法包括:(1)普通数据存取方法的实现,即在一个客户端向多个分布式服务器的缓存中存取普通类型的非结构化数据的具体实现:(1.1)普通数据存储方法的实现,包括实现以下两种命令:客户端以“key”为主键,向缓存中存储“data block”,所存储的数据大小为“bytes”,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下:“set<key><flags><exptime><bytes>/r/n<data block>/r/n”,若存储成功,则返回“STORED/r/n”;客户端以“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_FOUND/r/n”;(1.2)普通数据获取方法的实现,包括实现以下两种命令:客户端以“key”为主键,获取相应的“data block”,命令格式如下:“gets<key>*/r/n”;若获取数据成功,则返回“<VALUE<key><flags><bytes>/r/n<data block>/r/n>*END/r/n”;客户端以“key”为主键,获取相应的“data block”和相应的版本号,命令格式如下:“gets<key>*/r/n”;若获取数据成功,则返回“<VALUE<key><flags><bytes><cas unique>/r/n<data block>/r/n>*END/r/n”;(1.3)数据删除命令的实现:客户端在缓存中删除以“key”为主键的相应数据,命令格式如下:“delete<key>/r/n”,若删除成功,则返回“DELETED/r/n”,若以该“key”为主键的值不存在,则返回”NOT_FOUND/r/n”;(1.4)获取缓存状态命令的实现:客户端想获取服务器的状态列表,命令格式如下:“stats/r/n”,若获取状态成功,则返回“<STAT<name><value>/r/n>*END/r/n”:(2)流数据存取方法的实现,即在一个客户端向多个分布式服务器的缓存中存取流数据的具体实现:(2.1)流数据存储方法的实现,包括实现以下两种命令:客户端以“key”为主键,向缓存中存储数据帧data frames,数据帧的格式为:数据帧的存储时分段实现的,每个分段的数据前加控制命令以表明该分段的数据的大小,因此可以存储大容量的数据并维持数据的一致性;数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下:“sset<key><flags><exptime>/r/n<data frames>/r/n”,若存储成功,则返回“STORED/r/n”;客户端以“key”为主键,向缓存中存储data frames,所存储的数据版本号为“cas unique”,数据有效期至“exptime”,附加存储的数据为“flag”,命令格式如下:“scas<key><flags><exptime><cas unique>/r/n<dataframes>/r/n”,如果输入的版本号存在且存储成功,则返回“EXISTS/r/n”;如果输入的版本号不存在,则返回“NOT_FOUND/r/n”;如果输入的数据格式不合要求,则返回“DATA_ERROR/r/n”;(2.2)流数据获取方法的实现,包括实现以下两种命令:客户端以”key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的部分数据,命令格式如下:“sget<<key><offset><bytes>>*/r/n”,若数据获取成功,则返回“<VALUE<key><flags><offset><bytes>/r/n<data block>/r/n>*END/r/n”;客户端以“key”为主键,从缓存中获取某个数据中以“offset”为偏移量,大小为“bytes”的某个数据中的一块以及该数据的版本号,命令格式如下:“sgets<<key><offset><bytes>>*/r/n”,若数据获取成功,则返回“<VALUE<key><flags><offset><bytes><casunique>/r/n<data block>/r/n>*END/r/n”;(3)对象数据存取方法的实现,即在一个客户端向多个分布式服务器的缓存中存取对象数据的具体实现:(3.1)对象数据存储方法的实现,包括实现以下两种命令:客户端以“key[(.field)*]”表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,命令格式如下:“<xmlset|jsonset><key[(.field)*]><flags><exptime><bytes>/r/n<data block>/r/n”,若存储成功,则返回“STORED/r/n”,若要存储的数据格式不合要求,则返回“DATA_ERROR/r/n”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR/r/n”;客户端以“key[(.field)*]”表明其所要存取的数据在xml或json文件中的具体位置,向缓存中存取data block,数据有效期至“exptime”,附加存储的数据为“flags”,所要求的数据版本号为“cas unique”,命令格式如下:“<xmlcas|jsoncas><key[(.field)*]><flags><exptime><bytes><case unique>/r/n<data block>/r/n”,若输入的版本号存在且存储成功,则返回“EXISTS/r/n”,若输入的版本号不存在,则返回“NOT_FOUND/r/n”,若要存储的数据格式不合要求,则返回“DATA_ERROR/r/n”,如果要存储的数据标签对应关系不正确,则返回“PARSE_ERROR/r/n”;(3.2)普通数据获取方法的实现,包括实现以下两种命令:客户端以“key[(.field)*]”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据,命令格式如下:“<xmlgets|jasongets><key[(.field)*]>*/r/n”;如果数据获取成功,则返回“<VALUE<key[(.field)*]><flags><bytes>/r/n<data block>/r/n>*END/r/n”;客户端以“key[(.field)*]”表明要从缓存中的xml或jason文件的某个具体位置获取相应的数据和其所对应的版本号,命令格式如下:“<xmlgets|jasongets><key[(.field)*]>*/r/n”;如果数据获取成功,则返回“<VALUE<key[(.field)*]><flags><bytes><cas unique>/r/n<data block>/r/n>*END/r/n”;(3.3)对象数据删除命令的实现:客户端在缓存中的xml或jason文件中的“key[(.field)*]”位置处删除相应内容,命令格式如下:“<xmldelete|jsondelete><key[(.field)*]>/r/n”,若xml或jason文件中的对应内容已被删除成功,则返回”DELETED/r/n”,若xml或jason文件中不存在相应的“key[(.field)*]”位置的内容,则返回”NOT_FOUND/r/n”;(4)查询方法的实现,即在一个客户端向多个分布式服务器的缓存中对数据键值和内容的复杂混合查询等的具体实现:(4.1)键查询方法的实现,包括实现以下的命令:客户端以“keyprefix”为数据主键的开头前置查询相关数据,命令格式如下:“query key.startwith(“<keyprefix>”)[KEY_ONLY]/r/n”,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的键值、附加存储的内容“flags”、数据大小“bytes”,如果要求返回整个数据,则同时返回data block,格式如下:“<VALUE<key><flags><bytes>/r/n[<data block>/r/n]>*END/r/n”;(4.2)正则查询方法的实现,包括实现以下的命令:客户端以“regular expression”为正则表达式查询匹配该正则表达式的主键和主键所对应的数据,命令格式如下:“query key.like(“<regular expression>”)[KEY_ONLY]/r/n”,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的主键值、附加存储的内容”flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回data block,格式如下:“<VALUE<key><flags><bytes>/r/n[<data block>/r/n]>*END/r/n”;(4.3)值查询方法的实现,包括实现以下的命令:客户端以“regular expression”为正则表达式查询匹配该正则表达式的数据和数据所对应的主键,命令格式如下:“query value.querywith(“<query expression>”)[KEY_ONLY]/r/n”,可选择返回查找到的数据主键还是整个数据,若数据获取成功,则返回查找到的主键值、附加存储的内容“flags”、数据大小为“bytes”,如果要求返回整个数据,则同时返回data block,格式如下:“<VALUE<key><flags><bytes>/r/n[<data block>/r/n]>*END/r/n”;值查询命令还可以支持多个运算符,比如‘>’‘<‘‘>=‘‘<=‘‘=‘‘<>’‘like’等,支持连接符,比如‘and’,‘or’,‘(’,‘)’等,返回格式不变;(4.4)混合查询方法的实现,包括实现以下的命令:该查询是多个值查询以“and”和“or”相结合的复杂键值查询和值查询的实现方式,命令格式(举例)如下:“query key.startwith(“keyprefix>”)and key.like(“<regular expression>“)or value.querywith(“query expression>“)/r/n”,返回格式同值查询相同;(4.5)建立索引的方法实现,包括实现以下的命令:客户端对OO对象的某个子键建立索引,自动忽略非OO或者不含此子键的对象,命令格式如下:“vi<.field(.field)*>/r/n”,若索引已被成功创建,则返回“CREATED/r/n”;(4.6)删除索引的方法实现,包括实现以下的命令:客户端删除相应的索引,命令格式如下:“dvi<.field(.field)*>/r/n”,若索引删除成功,则返回“DELETED/r/n”若相应索引不存在,则返回”NOT_FOUND/r/n”;(5)上述命令如果在使用时出错或程序运行在客户端或服务端出现其他错误,则会返回以下出错信息,如“ERROR/r/n,CLIENT_ERROR<error>/r/n,SERVER_ERROR<error>/r/n”。
地址 310058 浙江省杭州市西湖区余杭塘路388号