JFinal中使用InfluxDB时序数据库

3 篇文章 0 订阅
3 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、InfluxDB是什么?

二、使用步骤

1.引入库

2.实现JFinal插件

3.InfluxDB工具类

4.启动配置

总结


前言

InfluxDB时序数据库是当前市场是使用率比较高的时序数据库,实现了IoTDB在JFinal中的使用,想起直接也实现InfluxDB的。使用的版本是开源的OSS单体版,其他版本有Cloud,Enterprise ,这都是付费的。


一、InfluxDB是什么?

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

InfluxDB有三大特性:

Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等)
Metrics(度量):你可以实时对大量数据进行计算
Eevents(事件):它支持任意的事件数据
特点

为时间序列数据专门编写的自定义高性能数据存储。 TSM引擎具有高性能的写入和数据压缩
Golang编写,没有其它的依赖
提供简单、高性能的写入、查询 http api,Native HTTP API, 内置http支持,使用http读写
插件支持其它数据写入协议,例如 graphite、collectd、OpenTSDB
支持类sql查询语句
tags可以索引序列化,提供快速有效的查询
Retention policies自动处理过期数据
Continuous queries自动聚合,提高查询效率
schemaless(无结构),可以是任意数量的列
Scalable可拓展
min, max, sum, count, mean,median 一系列函数,方便统计
Built-in Explorer 自带管理工具

二、使用步骤

1.引入库

<dependency>
   <groupId>com.influxdb</groupId>
   <artifactId>influxdb-client-java</artifactId>
   <version>6.3.0</version>
</dependency>

2.实现JFinal插件

public class InfluxDBPlugin implements IPlugin {

    protected InfluxDBClient client;

    protected String url;
    protected String token;
    protected String bucket;
    protected String org;

    public InfluxDBPlugin(String url,String token,String bucket,String org) {
        this.url=url;
        this.token=token;
        this.bucket=bucket;
        this.org=org;
    }

    @Override
    public boolean start() {
        if(client==null)
        {
            client= InfluxDBClientFactory.create(url,token.toCharArray());
        }
        InfluxDBUtils.init(client,bucket,org);
        return true;
    }

    @Override
    public boolean stop() {
        InfluxDBUtils.close();
        return true;
    }
}

3.InfluxDB工具类

public class InfluxDBUtils {

    public static InfluxDBClient client;
    public static String bucket;
    public static String org;

    public InfluxDBUtils() {

    }
    public static void init(InfluxDBClient _client)
    {
        if(_client==null)
        {
            throw new IllegalArgumentException("InfluxDBClient can not be null");
        }
        else
        {
            client=_client;
        }
    }
    public static void init(InfluxDBClient _client,String _bucket,String _org)
    {
        if(_client==null)
        {
            throw new IllegalArgumentException("InfluxDBClient can not be null");
        }
        else
        {
            client=_client;
            bucket=_bucket;
            org=_org;
        }
    }

    public static void close()
    {
        if(client!=null)
        {
            client.close();
        }
    }

    /**
     *  使用influxdb线路协议写入数据
     * @param data
     */
    public void writeRecord(String data)
    {
        //String data = "mem,host=host1 used_percent=23.43234543";
        WriteApiBlocking writeApi=client.getWriteApiBlocking();
        writeApi.writeRecord(bucket,org, WritePrecision.NS,data);
    }
    /**
     *  使用influxdb线路协议写入数据
     * @param datas
     */
    public static void writeRecords(List<String> datas)
    {
        //String data = "mem,host=host1 used_percent=23.43234543";
        WriteApiBlocking writeApi=client.getWriteApiBlocking();
        writeApi.writeRecords(bucket,org, WritePrecision.NS,datas);
    }

    /**
     * 使用数据插入节点
     * @param mem
     * @param tags
     * @param fields
     */
    public static void writePoint(String mem, HashMap<String,String> tags, HashMap<String,Object> fields)
    {
        Point point=Point.measurement(mem);
        if(tags!=null)
        {
            point.addTags(tags);
        }
        point.addFields(fields);
        point.time(Instant.now(),WritePrecision.NS);

        WriteApiBlocking writeApi=client.getWriteApiBlocking();
        writeApi.writePoint(bucket,org,point);
    }
    
    public static void writeMeasurement(Class<T> mem)
    {
        WriteApiBlocking writeApi=client.getWriteApiBlocking();
        writeApi.writeMeasurement(bucket,org,WritePrecision.NS,mem);
    }

    /**
     * 写入 pojo的list集合
     * @param list
     */
    public static void writeMeasurements(List<T> list)
    {
        WriteApiBlocking writeApi=client.getWriteApiBlocking();
        writeApi.writeMeasurement(bucket,org,WritePrecision.NS,list);
    }

    /**
     *  查询数据
     * @param query
     * @return
     */
    public static List<FluxTable> query(String query)
    {
        List<FluxTable> tables = client.getQueryApi().query(query, org);
        return tables;
    }

    /**
     * 查询结果影射成为POJO
     * @param T
     * @param query
     * @return
     */
    public static List<T> query(Class<T> T,String query)
    {
        /*String flux = "from(bucket: \"wxm-influx\")\n" +
                "  |> range(start: 2022-03-12T08:18:04Z,stop:2022-03-13T08:19:05Z)\n" +
                "  |> filter(fn:(r)=>(r.owner==\"wxm\"))";*/
        List<T> list = client.getQueryApi().query(query, T.class);
        //list.forEach(System.out::println);
        return list;
    }

    /**
     * 删除开始结束时间
     * @param start
     * @param stop
     */
    public static void delete(OffsetDateTime start,OffsetDateTime stop)
    {
        client.getDeleteApi().delete(start,stop,"",bucket,org);
    }
    
    /**
     *   List<FluxTable> 转 List<Record>
     * @param tables 单设备的数据集合
     * @return
     */
    public static List<Record> ToListRecord(List<FluxTable> tables){
        List<Record> list=new ArrayList<Record>();
        for (FluxTable fluxTable : tables) {
            List<FluxColumn> listCols = fluxTable.getColumns();     //数据信息
            List<FluxRecord> records = fluxTable.getRecords();
            for (FluxRecord fluxRecord : records) {
                Instant time=fluxRecord.getTime();
                Record record=new Record();
                record.set("time",time);

                String colName=fluxRecord.getField();
                Object obj = fluxRecord.getValue();
                record.set(colName,obj);

                list.add(record);
            }
        }
        return list;
    }

    /**
     *  查询出单参数的时间折线图数据集
     * @param tables    单设备的数据集合
     * @param field
     * @return
     */
    public static List<Object> ToList(List<FluxTable> tables,String field){
        List<Object> data;
        List<Object> list_data = new ArrayList<Object>();
        for (FluxTable fluxTable : tables) {
            List<FluxRecord> records = fluxTable.getRecords();
            for (FluxRecord fluxRecord : records) {
                data=new ArrayList<Object>();
                data.add(fluxRecord.getTime());
                data.add(fluxRecord.getValue());
                //System.out.println(fluxRecord.getTime() + ": " + fluxRecord.getValueByKey(field));
                list_data.add(data);
            }
        }
        return list_data;
    }

}

4.启动配置

influxdb.url=http://127.0.0.1:8086
influxdb.token=token
influxdb.bucket=adlot
influxdb.org=adlot
InfluxDBPlugin influxDBPlugin=new InfluxDBPlugin(p.get("influxdb.url")
						,p.get("influxdb.token"),p.get("influxdb.bucket"),p.get("influxdb.org"));
				plugins.add(influxDBPlugin);

查询数据并显示折线图

 String query="from(bucket: \""+bucket+"\")" +
                "  |> range(start: "+sdate+",stop:"+edate+") " +
                "  |> range(start:"+sdate+",stop:"+edate+") " +
                "  |> filter(fn:(r)=>r._measurement == \""+deviceId+"\" ";
        
        query+=" and r._field == \""+paramid+"\" ";
        query+=")";
        List<FluxTable> list= InfluxDBUtils.query(query);


 

总结

influxDB解决了大数据量的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值