p3k / quartz-db
一个针对存储时间序列数据优化的平面文件数据库。
0.2.0
2021-11-17 16:52 UTC
Requires (Dev)
- phpunit/phpunit: ^9.5
README
一个针对存储时间序列数据优化的平面文件数据库。
我应该何时使用它?
QuartzDB的一些优秀用途
- 存储GPS日志(只需将记录存储为GeoJSON!)
- 存储来自IRC、Slack、SMS或iMessage等的聊天日志
- 存储来自物联网设备的传感器日志,例如家庭环境传感器
你应该在以下情况下使用它...
- ...你相信文本文件更容易备份并保留多份副本
- ...你相信与二进制数据库文件相比,文本文件更有可能长期存在
API
$db = new Quartz\DB('/path/to/folder', 'w'); $db = new Quartz\DB('/path/to/folder', 'r');
添加记录
$db->add($date, $data);
这将始终将条目添加到适当文件的末尾,因为预计数据将按顺序插入。如果您需要无序插入,可以在需要时运行维护任务以重新排序日期文件。
查询
范围
$results = $db->queryRange($fromDate, $toDate); // Loop through the result set. // The JSON is parsed when the row is accessed. foreach($results as $id=>$record) { echo $id . ": " . $record->property . "\n"; }
最后n条记录
$results = $db->queryLast(10); foreach($results as $id=>$record) { echo $id . ": " . $record->property . "\n"; }
单个记录
$db->getByDate($date); $db->getByID("YYYYMMDDline");
维护
// Re-sorts all the data in the shard by date. // This requires loading the entire file into memory. $shard = $db->getShard("YYYY","MM","DD"); $shard->sort();
文件系统
每天一个文件。
数据库的基本路径包含一个“data”文件夹和一个“index”文件夹。
/data/
/2015/08/05.txt
/2015/08/05.meta
/2015/08/06.txt
/2015/08/06.meta
/2015/08/07.txt
/2015/08/07.meta
文件每行包含一个记录,由换行符分隔。前26个字符是微秒级精度的日期,后面跟着一个空格,然后是JSON记录。
2015-08-03 09:00:00.000000 {"foo":"bar","value":300}
2015-08-03 09:00:01.000000 {"foo":"bar","value":300}
2015-08-03 09:00:02.000000 {"foo":"bar","value":300}
“.meta”文件用于存储有关数据文件的信息。目前元文件中只有第一行包含数据文件中的行数。
在数据文件夹的根目录中还有一个文件,包含最后看到日期的日期。这是为了快速检索数据库中的最后n条记录,而无需在文件系统中搜索所有文件。
许可证
版权所有 2015-2017 由 Aaron Parecki
QuartzDB 在 Apache 2.0许可证 下授权