p3k/quartz-db

一个针对存储时间序列数据优化的平面文件数据库。

0.2.0 2021-11-17 16:52 UTC

This package is auto-updated.

Last update: 2024-09-17 22:52:53 UTC


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许可证 下授权