InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
对常见关系型数据库(MySQL)的基础概念对比
概念 | MySQL | InfluxDB |
---|---|---|
数据库(同) | database | database |
表(不同) | table | measurement |
列(不同) | column | tag(带索引的,非必须)、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;
}复制
微信识别二维码关注