Celer DB简介

什么是Celer DB和它又是如何工作的?

Celer DB设计从底层使用事件驱动和基于日志的架构,允许使用底层硬件存储的最大IO带宽进行快速更新。如果硬件允许,Celer DB可以达到每秒百万级的更新速度。

在Celer DB执行中,每一个DB更新事件,都会生成事件监听、生成独有的索引并存储在日志中。

通过一个或多个索引执行搜索。为了获得最佳性能,应考虑DB的用法,选择最合适的索引。

数据模型

CelerDB存储记录。记录有一个更多的字段。每个字段,可说是一个键值对。支持以下数据类型:

数据类型和架构

Celer DB支持以下数据类型(所有值都都具有包容性),字符串类型为默认类型:

名称 大小(字节) 缩写 描述
byte 1 b -128 to 127.
Unsiged byte 1 B 0 to 255
short 2 h -32,768 to 32,767
unsigned short 2 H 0 to 65535
int 4 i -2^31 to 2^31-1
unsigned int 4 I 0 to 2^32-1
date 4 d 以YYYYMMDD格式存储为INT类型数据
long 8 l -2^63 to 2^63-1
timestamp 8 t 0 to 2^63-1, 13位时间戳
String upto 1^16-2 bytes s 被视为二进制.
UTF8 String upto 1^16-2 bytes u UTF8编码的字符串
JSON upto 1^16-2 bytes j UTF8编码的JSON

可以使用以下符号定义的DB架构:

            
    {field name}:{type}[,{fieldname}:{type}]
    

一个模式至少要包含一个字段,最多可以有65535个字段可以被定义。然而, 任何一个超过128字段的数据库是非常不常见的,也是不被提倡的。

一个字段必须有一个名称和一个可选的类型。如果没有指定,默认类型为字符串。如果一个字段以”!”结尾,那么这个字段是必要的。域的默认值可以定义在“!”后。想将一个字段的所有记录值赋值给相同的默认值时,默认值是有效的。

例如,下面的架构用于存储用户的评论:

  • <services  dict=" id:i,created:t,parent:I!,state:b!1,author,comments" />

在上面的示例中,每个评论都一个id(int类型),创建时间(时间戳类型),父引用(int类型)、状态(byte类型、必填、默认值为1)、作者和评论。作者和评论都是二进制的。

Celer DB字段的范围

描述 Limit
最大存储数量 2^31-1
单条数据最大容量 64K bytes
最大存储字段 16384 bytes. 超出范围的键值不受控,同时单个键值的大小应小于4 bytes

唯一主键 DB

Celer DB支持几种不同类型的DB,最常见的就是Unique Key DB。这种类型的数据库每条记录必须有唯一的主键。

特殊字段

下列字段含有特殊的意义,如果字典中包含他们,他们将根据以下表格处理:

名称 描述
id 系统分配的唯一ID
type:b 数据的分类. 0-新建. 1-已有.
access:b 用户组别的操作权限
src:i 资源的ID
srcTitle 资源显示的标题
target:i 目标ID
targetTitle 数据的简短描述
ownerId:i 创建数据的用户ID
created:l 如果定义,创建时,按当前时间的毫秒时间戳填充字段
lastUpdated:l 如果定义,更新时,按当前时间的毫秒时间戳填充字段
access:b 如果存在,此字段将定义访问控制策略
owner:l 如果存在,其值是所有者的用户id
group:l 如果存在,其值是组的id,目前,只支持64个分组

索引

如果一个人不能搜索DB时,DB就没有用处了。Celer DB与其他数据库不同的地方是,我们假设一个开发者熟悉她的数据,所以她能够选择最合适的索引。最终的结果是,Celer DB可以通常在O(1)时间的成本下执行快速的查询。Celer DB性能是如此之高以至于传统的基于SQL的数据库是无法与之匹敌的。

支持以下索引:

名称 描述 用法 例子
反向索引 这是最常见的索引。此种索引最适用于以下情况:如果数据集有一个相对较少的可能值,每个值可能会有大量与之关联的记录。如果每一个值都是独一无二的,就不要使用这个索引了。例如,当你设计一个user.db时,不要用这种方式索引用户名,因为每个用户只有一个记录。另一方面,最好用它来索引有大量记录的数据标签。 fields="{field}..." fields="tag,state"
反向索引排序 如果你想对db中的数据使用tag字段进行查询,并将结果根据ratings字段进行排序,那么Celer DB提供了一个有效快速的反向索引排序。 fields="{field^sortfield}..." fields="tag^ratings"

如何使用

在你的sitemap.xml,添加如下代码:

  • <service  store=" issues.db"   storeType=" binary"   primaryKey=" id"   seqKey=" true"   sorted=" id"   fields=" title,owner,projId^id,parentId,submitter,state^id"   dict=" id,projId,parentId,title,description,owner,difficulty:b,submitter,type:b,state:b,priority:b,createDate:t" >
    • <get  path=" /json/issue"   xpipe=" http://www.xmlpipe.org/xpe/db/unique/record/get" />
    • <del  path=" /json/issue"   xpipe=" http://www.xmlpipe.org/xpe/db/unique/record/del" />
    • <post  path=" /json/issues"   xpipe=" http://www.xmlpipe.org/xpe/db/unique/record/post" />
    • <get  path=" /json/issues"   xpipe=" http://www.xmlpipe.org/xpe/db/search"   mask=" id,projId,parentId,title,description,owner,difficulty,submitter,type,state,priority" />
    </service>

在顶层,我们已经定义了所有管道共享的公共属性。然后,我们定义了4个服务:

  1. get服务,用于获取一条记录的详细信息,需要提供要拿回来记录的id。
  2. del服务,用于删除一条记录
  3. post服务,用于创建一条记录,只需提供有效的JSON文件即可添加新的记录。如果提供了一个id,则替换现有记录。如果没有提供id,则由系统生成新的id。
  4. 搜索服务,用于高级搜索。