开源Influxdb2高性能客户端
前言
最近我在了解时序数据库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查看更多使用方法或查询源代码。
开源Influxdb2高性能客户端的更多相关文章
- SSDB是一个开源的高性能数据库服务器
SSDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据, 同时支持类似Redis中的zset和hash等数据结构, 在同时需求高性能和大数据的条件下 ...
- 使用calabash测试开源中国Android客户端
Calabash-android是支持android的UI自动化测试框架,前面已经介绍过<中文Win7下成功安装calabash-android步骤>,这篇博文尝试测试一个真实应用:开源中 ...
- 开源中国iOS客户端学习
开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客 http://blog.csdn.net/column/details/xfzl-kykhd.html ...
- 【转】【完全开源】微信客户端.NET版
[转][完全开源]微信客户端.NET版 目录 说明 功能 原理步骤 一些参考 说明 前两天比较闲,研究了一下web版微信.因为之前看过一篇博客讲微信web协议的,后来尝试分析了一下,半途中发现其实没什 ...
- 基于开源SuperSocket实现客户端和服务端通信项目实战
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
- 【完全开源】微信客户端.NET版
目录 说明 功能 原理步骤 一些参考 说明 前两天比较闲,研究了一下web版微信.因为之前看过一篇博客讲微信web协议的,后来尝试分析了一下,半途中发现其实没什么意义,但又不想半途而废,所以最后做出了 ...
- 几个开源XMPP Android客户端简单比较
想做个基于xmpp的即时通讯工具,服务端已经基本成型了.当然需要客户端需要配合,PC端基于spark进行改造,手机端先从Android入手(IOS估计一个人是搞不过来了). 原本Android开发 ...
- 开源分享 Unity3d客户端与C#分布式服务端游戏框架
很久之前,在博客园写了一篇文章,<分布式网游server的一些想法语言和平台的选择>,当时就有了用C#做网游服务端的想法.写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本, ...
- 一个开源的强类型客户端(.NET 中的 Open Fegin)— Rabbit Go
在做RabbitCloud(之前是一个RPC,现在是一个微服务框架)的时候往往避不开客户端代理,之前把这些客户端代理都算作服务框架不可缺少的一部分,随着后期的深入发现这些客户端代理其实可以互通,类似s ...
随机推荐
- Vue学习笔记-vue调试工具vue-devtools安装及使用
一 使用环境: windows 7 64位操作系统 二 vue调试工具vue-devtools安装及使用 1.下载: 百度中查找 "vue-devtools下载" 找到最新 ...
- SpringCloud之服务调用
1.Ribbon 1.1负载均衡LB 全称Load Balance,将用户的请求平摊到多个服务器上,从而达到系统的HA.集中式LB:在服务消费者和服务提供者之间使用独立的LB设施,如硬件,由该设施负责 ...
- cat常用参数
cat 命令格式 cat [选项] [文件] -A, --show-all:等价于 -vET. -b --number-nonblank:和 -n 相似,只不过对于空白行不编号. -e:等价于&qu ...
- Git使用的常用场景
场景一 小张作为一个开发人员,刚进团队,发现团队是使用git进行代码管理的,现在需要去初始化团队的代码仓库以及新增提交自己修改的一部分代码 1.克隆远程仓库 git clone <ssh> ...
- SnowNLP——获取关键词(keywords(1))
一.SnowNLP的获取文本关键词 前面介绍了SnowNLP的获取关键词的方法,这里再重现一下 1 from snownlp import SnowNLP 2 # 提取文本关键词,总结3个关键词 3 ...
- Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现
下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像 ...
- 统一Java环境变量配置,Java环境如何配置?
一 JDK下载和安装 Java开发工具包统一下载地址:https://www.hiai.top/archives/268.html 二 java环境变量配置 1.变量名:JAVA_HOME 变量值:你 ...
- There only 10 people use the same phone as you(i春秋CTF题解)
(1)访问网址进行CTF测试,仅出现登陆与注册的页面 (2)进行注册尝试登陆并进行burp抓取数据包: (3)注册成功,进行登陆尝试查看信息是否具有提示,在登录的页面只有两个点击页面,一个为:Ch ...
- java内部类 的理解
* 类的第5个成员:内部类 * 1.相当于说,我们可以在类的内部再定义类.外面的类:外部类.里面定义的类:内部类 * 2.内部类的分类:成员内部类(声明在类内部且方法外的) vs 局部内部类(声明在类 ...
- webpack核心模块tapable用法解析
前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...