AvenirSQL基于 Node.js 的数据库

联合创作 · 2023-10-01 02:27

AvenirSQL是一个用Node.js设计的数据库,支持常见的SQL语句。


技术特点



  • 1.支持增删改查

  • 2.精确查找支持哈希索引,范围查找支持B+树索引

  • 3.智能缓存,提升QPS性能

  • 4.提供用户管理,cli程序(curl.js)

  • 5.实现串行锁功能

  • 6.灵活的策略配置


具体技术实现



  • 1.统一的底层错误处理函数,避免函数重复传递参数。



async response(type, client) {
let res = null;
if (typeof type == 'string') {
res = getError(type);
if (!res) {
res = unknown;
}
} else {
let code = type.code;
let data = type.data;
res = getError(code);
if (!res) {
res = unknown;
}
res.data = data;
}
client.write(JSON.stringify(res));
//如果没有配置默认短连接

if( ini.db.keepAlive != true) {
toLog("主动踢掉客户端的连接");
client.end();
}
}

2.数据库结构


数据库:文件夹名


表:数据文件、哈希索引文件、B+树索引文件(聚合索引)



  • 数据文件:

    第一行存放表结构定义,第二行开始第一位为压缩的16进制数,表示该行元素是否为空,后续存储按分隔符排列。


  • 哈希索引:

    对象,key为主键,value为所在文件的行号


  • B+树索引:

    存放B+树的结构



3.连接管理


为了区分不同的用户对数据库进行的不同操作,如同一秒内多个进程进行多次请求,AvenirSQL会生成一个签名,用户登录后需使用此签名进行操作。


4.串行锁


进行操作前加锁,操作完成后解锁,并刷新缓存(select语句不会刷新缓存)



//自动释放锁防止数据库死锁
async releaseLock() {
let now = moment().valueOf();
let releaseLockTime = ini.db.releaseLockTime;
releaseLockTime = releaseLockTime > ini.db.checkLockTime ? releaseLockTime : ini.db.checkLockTime;
for(let key in this.table) {
let tables = this.table[key];
for(let subKey in tables) {
let times = tables[subKey];
if(moment(now).diff(moment(times),'seconds') > releaseLockTime) {
delete tables[subKey];
toLog("自动释放了锁 ",tables[subKey]);
}
}
}
}

5.缓存


目前共五类缓存,数据库配置文件缓存和表结构缓存不会刷新,哈希索引、表数据、B+树索引缓存会定时刷新。


6.解析SQL


在此感谢阿里巴巴的sql解析器 node-sqlparser


AvenirSQL独有的sql会先解析,除此之外的SQL会转交给node-sqlparser。



//包含原生SQL和能够被AvenirSQL识别的语句
async parse(sql, sign) {
//先解析AvenirSQL特有的语句 再解析原生SQL
toLog("要解析的 sql为 ", sql);
let raw = this.getArray(sql);
if (raw.length === 0 || !sql) {
throw ('SQL_PARSE_ERROR');
} else {
//AvenirSQL解析出错不报错,转给解析器解析,解析器报错直接throw
try {
await this.parseAvenirSql(raw, sql, sign);
} catch (error) {
//不是内部定义的错误就代表程序处理出错了
toLog('error = ', error);
if (error == SUCCESS || error != 'error') {
throw (error);
}

//不需要try catch了,底层会抓住错误
let par = this.parseSql(sql);
await this.doSql(par, sign);

}
}
}
浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报