Yet Another TimeSeries Database ist eine experimentelle Zeitreihendatenbank, die von InfluxDb und RavenDB inspiriert wurde.
YATsDb wird in reinem .NET und modernem C# mit hervorragender Leistung implementiert (ca. 30.000 Einfügungen pro Sekunde auf Intel i7-8550U-CPU, 1,80 GHz, 24 GB RAM, SSD – Zeilen werden einzeln eingefügt).
Ich brauchte eine Zeitreihendatenbank für Heim-IoT-Projekte, aber die Verwendung von InfluxDb wäre langweilig. Die Implementierung des Prototyps, der Daten eingeben und abfragen konnte, dauerte nur 12 Stunden.
YATsDb ist eine vollständige Datenbankimplementierung mit GUI, OpenAPI-Definitionen und Jobs. Zur Ausführung ist die .NET 8-Laufzeitumgebung erforderlich.
YATsDb.Lite ist eine AOT-kompilierte Version mit Kernfunktionen der Zeitreihendatenbank. Es bestehen keine Abhängigkeiten zu Zielsystemen.
Die resultierende Binärdatei ist relativ klein < 15 MB .
Das Folgende ist ein Beispiel für die Verwendung von YATsDb/YATsDb.Litle mit cURL ( YATsDb stellt auch eine OpenAPI-Endpunktdefinition bereit).
In den Beispielen lautet die Basis-URL http://localhost:8080/.
Erstellen Sie einen neuen Bucket smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
Geben Sie Beispieldaten im einfachen Zeilenformat ein ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
). Dieses Format ist von InfluxDb inspiriert, verwendet jedoch keine benannten Werte , sondern Positionswerte. Außerdem wird vor InfluxDb immer der Unix-Zeitstempel in Millisekunden als Zeit verwendet.
Die folgenden Beispieldaten stellen Daten aus der Heimmessung von Sensoren dar – Temperatur, Luftfeuchtigkeit, Lichtintensität.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719242779202 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.1,39.4,75.0 1719243079200 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.2,41.7,NULL 1719243379246 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 23.0,41,80.4 1719243379256 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719243679194 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 22.7,47.4,NULL 1719243979257 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.1,47,NULL 1719244279035 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room3 18.7,NULL,NULL 1719244579031 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109 "
Es ist möglich, mehrere Zeilen in einer Nachricht zu senden, aber nicht jede Shell unterstützt dies.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109
sensors_data,Room1 24.8,55.7,3.9 1719244899109 "
YATsDb ermöglicht Abfragen in einer SQL-ähnlichen Syntax, verwendet jedoch Wertpositionen anstelle von Namen. Das Ergebnis der Abfrage ist ein JSON-Ergebnis.
Wählen Sie Luftfeuchtigkeitsdaten von Raum2 aus, die älter als 12 Stunden sind:
curl -XPOST http://localhost:8080/query/raw/smart_home --data-binary " SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -10h) GROUP BY +10m "
Vollständige Grammatik zum Einfügen von Datendaten – einfaches Zeilenprotokoll:
<lines> ::= <line> [ [r]n...n ]
<line> ::= <measurement> <values> [<timestamp>]
<measurement> ::= measurement_name [, tag]
<values> ::= <value> [, ...250]
<value> ::={ double_value | NULL }
<timestamp> ::= unix timestamp in milliseconds
Messung ohne Etikett:
sensors_data 12.5 1608852317000
Messung mit Tag:
sensors_data,home/room3/esp32 12.5 1608852317000
Messung mit mehreren Werten:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
Messung mit fehlenden Werten (für fehlenden Wert NULL
verwenden):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
Messung ohne Unix-Zeitstempel – es wird die aktuelle Serverzeit verwendet:
sensors_data,home/room3/esp32 12.5
Mehrzeilige Werte:
sensors_data,home/room3/esp32 12.5 1608852317000
pc_data,Workstation1 25.78,47.5,236566 1608852317900
sensors_data,home/room3/esp32 13.5 1608852417000
Vollständige Grammatik zum Abfragen von Daten:
<SELECT statement> ::= SELECT <projection statement> FROM measurement_name
[<WHERE statement>]
[<GROUPBY statement>]
[<LIMIT statement>]
<projection statement> ::= { * | <projection> [ ,...250 ]}
<projection> ::= <projection function>(<index>)
<projection function> ::= { VARIANCE | SUM | COUNT | AVG | IDENTITY | MAX | MIN | STDDEV | REMEDIAN | SIGN | CHANGE_PER_SEC | CHANGE_PER_HOUR | CHANGE_PER_DAY }
<index> ::= integer_number
<WHERE statement> ::= WHERE <where function> [AND ...n]
<where function> ::= { TAG(<string>) | INTERVAL(<interval exp>, <interval exp>) }
<string> ::= string
<interval exp> ::= { integer_number | <time span> | <string> | NOW() }
<time span> ::= { + | - }double_value{ ms | s | m | h | d | w | y }
<GROUPBY statement> ::= GROUP BY <time span>
<LIMIT statement> ::= LIMIT { integer_number | integer_number, integer_number | ..integer_number }
Alle Daten auswählen:
SELECT * FROM sensors_data
Wählen Sie die ersten 5 Datensätze aus Raum3 aus:
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
Wählen Sie die Temperaturdatengruppe in 10-Minuten-Schritten aus:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Wählen Sie die Luftfeuchtigkeitsdaten von Raum2 aus:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
Wählen Sie Luftfeuchtigkeitsdaten von Raum2 aus, die älter als 12 Stunden sind:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
Letzten Datensatz auswählen:
SELECT * FROM sensors_data LIMIT ..1
Alle Daten gruppieren:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
Auswahl nach konkreter Zeit (unter Verwendung des Unix-Zeitstempels in Millisekunden):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
Wählen Sie nach konkreter Zeit (unter Verwendung der für Menschen lesbaren Zeit):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m