暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于.NET Core框架InfluxDb的简单应用

码农游乐场 2021-09-08
4048

InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

对常见关系型数据库(MySQL)的基础概念对比

概念MySQLInfluxDB
数据库(同)databasedatabase
表(不同)tablemeasurement
列(不同)columntag(带索引的,非必须)、field(不带索引)、timestemp(唯一主键)

重要特性

  • 极简架构:单机版的InfluxDB只需要安装一个binary,即可运行使用,完全没有任何的外部依赖。

  • 极强的写入能力:底层采用自研的TSM存储引擎,TSM也是基于LSM的思想,提供极强的写能力以及高压缩率。

  • 高效查询:对Tags会进行索引,提供高效的检索。

  • InfluxQL:提供SQL-Like的查询语言,极大的方便了使用,数据库在易用性上演进的终极目标都是提供Query Language。

  • Continuous Queries: 通过CQ能够支持auto-rollup和pre-aggregation,对常见的查询操作可以通过CQ来预计算加速查询。

windows系统下运行influxdb

influxdb可以安装在各种环境中,这里主要是为了方便,不需要搭建linux系统,直接采用windows系统来进行测试。

  • 首先下载下来,解压缩如下: 

  • 运行powershell,进入改目录,运行influxd.exe

>.\influxd.exe

复制
  • influxdb自带了一个后台管理,打开http://ip:8086后台管理界面,第一次进入需要设置下账户密码。 

  • 我们可以看到支持很多语言,并且都有现成的库可以使用,插件也有很多 

实例

install两个依赖

PM> Install-Package InfluxDB.Client
PM> Install-Package InfluxDB.Client.Core

复制

token验证

  • 首先我们把token复制出来,如下图所示: 

  • org是组织,bucket是存储空间

    public class InfluxDbHelper
{
private InfluxDBClient client { get; }
private string token;
private string bucket;
private string org;

public InfluxDbHelper()
{
token = "STcR97-Ow_TQ2xylBGS4LOw6LmLU7D_Je97bNyE8d3YnQvqQlTyHaBq5k_ecm6a5y8mKncki1m-haSflVz66KA==";
bucket = "tronpi";
org = "bluetron";
client = InfluxDBClientFactory.Create("http://192.168.11.213:8086", token.ToCharArray());
}
}

复制

写数据

  • 定义了一个实体类,一般情况就3个字段,tag,value,time,我这里由于情况比较特殊,字段有点多不建议这么使用,这里就做个例子吧。

[Measurement("loop_status_detail")]
public class LoopStatusDetail
{
public static string Name = "loop_status_detail";
[Column("loopid", IsTag = true)] public string LoopId { get; set; }
[Column("deviceid")] public string DeviceId { get; set; }
[Column("teamid")] public string TeamId { get; set; }
[Column("looptypeid")] public string LoopTypeId { get; set; }
[Column("ignore")] public bool Ignore { get; set; }
[Column("status")] public int Status { get; set; }
[Column("stable")] public double Stable { get; set; }
[Column(IsTimestamp = true)] public DateTime Time { get; set; }
}

复制
  • WriteMeasurements()可以自动创建Measurements,也就是关系库中的表。

public async void WriteObjectData()
{
List<LoopStatusDetail> list = new List<LoopStatusDetail>();
var random = new Random();
for (var i = 1; i <= 10000; i++)
{
var mem = new LoopStatusDetail
{
LoopId = "loop" + i,
DeviceId = "10939",
TeamId = "-1",
LoopTypeId = "0486565c-e138-4dff-8b82-6c818331aa45",
Ignore = false,
Stable = random.NextDouble(),
Status = 1,
Time = DateTime.UtcNow
};

list.Add(mem);
}

using (var writeApi = client.GetWriteApi())
{
writeApi.WriteMeasurements(bucket, org, WritePrecision.Ns, list);
}
}

复制
  • WritePoints()也可以

public async void WriteData()
{
List<PointData> list = new List<PointData>();
for (var i = 1; i <= 10000; i++)
{
double value = new Random().Next(1, 1000);
var point = PointData.Measurement(LoopStatusDetail.Name)
.Tag("loopid", "loop" + i)
.Field("deviceid", "10939")
.Field("teamid", "-1")
.Field("looptypeid", "0486565c-e138-4dff-8b82-6c818331aa45")
.Field("ignore", false)
.Field("status", 1)
.Field("stable", -99999.99999)
.Timestamp(DateTime.UtcNow, WritePrecision.Ns);

list.Add(point);
}

using (var writeApi = client.GetWriteApi())
{
writeApi.WritePoints(bucket, org, list);
}
}

复制

打开后台Explore,可以查询到我们刚刚写进去的值。 

读取数据

public async Task<List<LoopStatusDetail>> QueryData(List<string> loops)
{
List<LoopStatusDetail> list = new List<LoopStatusDetail>();

int pageSize = 1;
var pageCount = Math.Ceiling((double)loops.Count pageSize);

for (var j = 1; j <= pageCount; j++)
{
var temp = loops.Skip((j - 1) * pageSize).Take(pageSize).ToList();
StringBuilder stringBuilder = new StringBuilder();
foreach (var loop in temp)
{
stringBuilder.Append($" r[\"loopid\"] == \"{loop}\" or");
}
stringBuilder.Remove(stringBuilder.Length - 2, 2);

var filter = stringBuilder.ToString();

var query = $"from(bucket: \"{ bucket}\") |> range(start: {DateTime.UtcNow.AddMinutes(-30).ToString("yyyy-MM-ddTHH:mm:ssZ")},stop: {DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")}) |> filter(fn: (r) =>{filter} )";

var fluxTables = await client.GetQueryApi().QueryAsync(query, org);
fluxTables.ForEach(fluxTable =>
{
var key = fluxTable.GetGroupKey();
var fluxRecords = fluxTable.Records;

fluxRecords.ForEach(fluxRecord =>
{
Console.WriteLine($"{fluxRecord.GetValueByKey("loopid")}/{fluxRecord.GetField()}====>{fluxRecord.GetTime()}: {fluxRecord.GetValue()}");
});


});
}
return list;
}

复制



微信识别二维码关注

文章转载自码农游乐场,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论