前言
最近我在瞭解時序資料庫Influxdb 2.x版本,體驗一翻之後,感覺官方的出品的.net客戶端還有很多優化的地方,於是閉關幾天,不吃不喝,將老夫多年練就的高效能網路通訊與高效能Buffer操作的功力融入其中,終於寫出Influxdb2.Client這個客戶端。
不追求完整功能
官方的客戶端,提供全功能Api,其中90%以上是管理用,這個和直接在Influxdb的管理皮膚UI上操作是完全一樣的,Influxdb2.Client沒有提供這些功能,只是提供了查詢與寫入的功能。
更簡單的配置
Influxdb大改後的2.x版本和1.x版本出入很大,官方的客戶端由於要相容1.x版本,所以在配置上顯得很凌亂,一不小心就把1.x的配置對著2.x的伺服器,然後就異常了。Influxdb2.Client由於沒有這些包袱,同時使用了Microsoft.Extensions.Options,配置簡單明瞭
// 註冊與配置Infuxdb服務
services.AddInfuxdb(o =>
{
o.Host = new Uri("http://localhost:8086");
o.Token = "base64 token value";
o.DefaultOrg = "my-org"; // 查詢或寫入資料時,省略的org引數的預設值
o.DefaultBucket = "my-bucket"; // 查詢或寫入資料時,省略的bucket引數的預設值
});
更易用的查詢功能
官方的客戶端只支援string查詢的flux語句,2.0以後的flux語句,估計沒人願意記住,Influxdb2.Client多提供了IFlux查詢引數物件,對並IFlux提供了近30個函式擴充套件,使用時任意疊堆這些函式,如同Linq一樣親切,開發者也可以為IFlux增加更多函式擴充套件。
/// <summary>
/// 查詢資料
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <param name="flux">flux表示式</param>
/// <param name="org">組織</param>
/// <returns></returns>
Task<TModel[]> QueryAsync<TModel>(IFlux flux, string? org = default) where TModel : new();
/// <summary>
/// 查詢資料
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <param name="flux">flux表示式</param>
/// <param name="org">組織</param>
/// <returns></returns>
Task<TModel[]> QueryAsync<TModel>(string flux, string? org = default) where TModel : new();
/// <summary>
/// 查詢資料
/// </summary>
/// <param name="flux">flux表示式</param>
/// <param name="org">組織</param>
/// <returns></returns>
Task<IDataTableCollection> QueryAsync(IFlux flux, string? org = default);
/// <summary>
/// 查詢資料
/// </summary>
/// <param name="flux">flux表示式</param>
/// <param name="org">組織</param>
/// <returns></returns>
Task<IDataTableCollection> QueryAsync(string flux, string? org = default);
更高的效能
效能是Influxdb2.Client最關注的面,從網路請求、資料編碼解碼、模型描述等層面都進行了效能極限優化。現在,使用靜態資源伺服器響應csv檔案模擬Influxdb資料庫,官方客戶端查詢耗時是Influxdb2.Client的180%。高度併發請求之後,由於GC關係,這個耗時比例還會有所增加。
ref struct ValueStringBuilder
使用ValueStringBuilder儲存編碼或解碼後的資料內容,0GC壓力;
RecyclableBufferWriter
使用RecyclableBufferWriter緩衝寫入的資料二進位制(或unicode文字)內容,傳送資料之後回收複用RecyclableBufferWriter佔用的Buffer,記憶體0分配,而官方的寫入資料,還是基於StringBuilder拼接字串,然後utf8編碼為byte[],最後才複製到請求網路流。
泛型的EntityDesciptor等
靜態泛型型別的欄位儲存各屬性的Desciptor,無快取查詢。
基於Span的CsvReader
讀取CSV流時,解析CSV行內容都是基於Span
如何使用
如果你需要用到時序資料庫Influxdb,也想使用這個庫,可以連線到github檢視更多使用方法或查詢原始碼。