Yet Another TimeSeries Database是受InfluxDb和RavenDB啟發的實驗性時間序列資料庫。
YATsDb 採用純.NET和現代C#實現,具有出色的性能(在 Intel i7-8550U CPU、1.80GHz、24GB RAM、SSD 上每秒大約 30K 插入 - 一次插入一行)。
我需要一個用於家庭 IoT 專案的時間序列資料庫,但使用InfluxDb會很無聊。原型的實作只花了 12 個小時,它知道如何輸入資料並進行查詢。
YATsDb是一個完整的資料庫實現,具有 GUI、OpenAPI 定義和作業。它需要 .NET 8 運行時才能運作。
YATsDb.Lite是具有核心時間序列資料庫功能的 AOT 編譯版本。它不依賴目標系統。
產生的二進位檔案相對較小< 15MB 。
以下是使用 cURL 來使用YATsDb/YATsDb.Litle的範例( YATsDb也提供了 OpenAPI 端點定義)。
在範例中,基本 URL 是 http://localhost:8080/。
建立一個新儲存桶smart_home
:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
以簡單行格式輸入樣本資料( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
),此格式受到InfluxDb的啟發,但不使用命名值,但是位置值。此外,在InfluxDb之前,請務必使用以毫秒為單位的 unix 時間戳作為時間。
以下範例數據代表感測器家庭測量的數據 - 溫度、濕度、光強度。
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 "
可以在一條訊息中發送多行,但並非每個 shell 都支援這一點。
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允許使用類似 SQL 的語法進行查詢,但使用值位置而不是名稱。查詢的結果是一個 JSON 結果。
選擇Room2超過 12 小時的濕度數據:
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 "
插入資料資料的完整語法-簡單線路協定:
<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
無標籤測量:
sensors_data 12.5 1608852317000
帶標籤測量:
sensors_data,home/room3/esp32 12.5 1608852317000
多值測量:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
缺失值的測量(缺失值使用NULL
):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
沒有 unix 時間戳記的測量 - 使用當前伺服器時間:
sensors_data,home/room3/esp32 12.5
多行值:
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
查詢資料的完整語法:
<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 }
選擇所有數據:
SELECT * FROM sensors_data
從Room3中選擇前 5 筆記錄:
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
按10分鐘選擇溫度資料組:
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
從Room2選擇濕度資料:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
選擇Room2超過 12 小時的濕度數據:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
選擇最後一筆記錄:
SELECT * FROM sensors_data LIMIT ..1
將所有資料分組:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
依特定時間選擇(使用以毫秒為單位的unix時間戳記):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
依特定時間選擇(使用人類可讀的時間):
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m