开源Influxdb2高性能客户端

前言

最近我在了解时序数据库Influxdb 2.x版本,体验一翻之后,感觉官方的出品的.net客户端还有很多优化的地方,于是闭关几天,不吃不喝,将老夫多年练就的高性能网络通讯与高性能Buffer操作的功力融入其中,终于写出Influxdb 2.x这个客户端。

不追求完整功能

官方的客户端,提供全功能Api,其中90%以上是管理用,这个和直接在Influxdb的管理面板UI上操作是完全一样的,Influxdb2.Client没有提供这些功能,只是提供了查询与写入的功能。

更简单的配置

Influxdb大改后的2.x版本和1.x版本出入很大,官方的客户端由于要兼容1.x版本,所以在配置上显得很凌乱,一不小心就把1.x的配置对着2.x的服务器,然后就异常了。Influxdb2.Client由于没有这些包袱,同时使用了Microsoft.Extensions.Options,配置简单明了

 

Copy

// 注册与配置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增加更多函数扩展。

 

Copy

/// <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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值