最近用到了Influxdb数据库,这是一个优秀的时间序列数据库,我们主要用来记录了些监控日志,然后要做些统计查询。这里做个简单的总结。
项目基于 springboot2.*,整合 influxdb相当简单,引进依赖,1.7为当前最新版:
<dependency> <groupId>com.github.miwurster</groupId> <artifactId>spring-data-influxdb</artifactId> <version>1.7</version> </dependency>
添加配置:
spring: influxdb: url: http://localhost:8086 username: test password: test database: test retention-policy: autogen connect-timeout: 10 read-timeout: 30 write-timeout: 10
表在写入数据时自动创建,measurement相当于表。代码示例:
public void writeData(LoginLogDO loginLogDO) { final Point.Builder builder = Point.measurement("loginLogDO") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS); builder.tag("loginUser", loginLogDO.getLoginUser()) .tag("ip", loginLogDO.getIp()) .tag("result", loginLogDO.getResult()) .tag("brower", loginLogDO.getBrower()) .tag("os", loginLogDO.getOs()) .addField("count", loginLogDO.getCount()); final Point point = builder.build(); influxDBTemplate.write(point); } 如上,就可将数据写入数据库。 分页查询 sql示例:
select * from loginLogDO where time>now()-3d and time<now() order by time desc limit 10 offset 20
记住:limit后面是pageSize,offset后面是偏移量,就是起始记录数。是(当前页-1)*pageSize.
limit {pageSize} offset {offset}
下面也可以, 直接用时间纳秒数,秒后面9个0。
select * from loginLogDO where time>1568172960000000000 and time<1568179960000000000 order by time desc limit 10 offset 20
下面说统计查询。influxdb这方面比较强大。简单好用。 select count(*) from monitorDO where module='spdemo' and time>now()-10m group by time(1m),resultType limit 10 这样会查出一个列表,以resultType 分组的数据。按时间排序显示。查最近10分钟内,以1分钟为 节点单位的10条统计结果。 后面的limit 10 表示是取最靠近time>now()-10m这个时间的10条统计数据, 不加,则取所有。 结果如下: name: monitorDO tags: resultType=success time count_count ---- ----------- 1568182080000000000 0 1568182140000000000 0 1568182200000000000 0 1568182260000000000 0 1568182320000000000 0 1568182380000000000 0 1568182440000000000 0 1568182500000000000 0 1568182560000000000 3 1568182620000000000 0 1568182680000000000 2 时间函数也很灵活强大。 d代表天,h代表小时,m代表分, s代表秒。 now()-1d就表示当前时间的减一天的时间点。 group by time(1m) 表示以一分钟为单位进行数据统计。 最后是分页的示例部分代码:
Query countquery=new Query(countsql,influxDBTemplate.getDatabase()); QueryResult countresult = influxDBTemplate.query(countquery); int total = 0; if (countresult.getResults().get(0).getSeries() != null) { Object totalObj = countresult.getResults().get(0).getSeries().get(0).getValues().get(0).get(1); total = totalObj == null ? 0 : ((Double) totalObj).intValue(); } if (total > 0){ Query query = new Query(selectsql, influxDBTemplate.getDatabase()); QueryResult result = influxDBTemplate.query(query); log.debug("result==>" + result); List<List<Object>> mylist = result.getResults().get(0).getSeries().get(0).getValues(); loginColumns = loginColumns == null ? result.getResults().get(0).getSeries().get(0).getColumns() : loginColumns; return new CommonPager<>( new PageParameter(pageParameter.getCurrentPage(), pageParameter.getPageSize(), total), mylist.stream().map(this::toMap).collect(Collectors.toList()));
下面是统计的java主要代码:
Query query = new Query(sql.replace(",resultType", ""), influxDBTemplate.getDatabase()); QueryResult result = influxDBTemplate.query(query);if (result.getResults().get(0).getSeries() == null) { return null; } List<List<Object>> mylist = result.getResults().get(0).getSeries().get(0).getValues(); List<Map<String, Object>> allList= mylist.stream().map(this::toMonitorMinuteMap).collect(Collectors.toList()); Query rstquery = new Query(sql, influxDBTemplate.getDatabase()); QueryResult opresult = influxDBTemplate.query(rstquery); List<QueryResult.Series> seriesList=opresult.getResults().get(0).getSeries(); List<Map<String, Object>> errorList=null; List<Map<String, Object>> successList=null; for(QueryResult.Series series: seriesList){ if( series.getTags().get("resultType").equals("success")){ successList=series.getValues().stream().map(this::toMonitorMinuteMap).collect(Collectors.toList()); }else{ errorList=series.getValues().stream().map(this::toMonitorMinuteMap).collect(Collectors.toList()); } }
private Map<String, Object> toMonitorMinuteMap( List<Object> list) { Map<String, Object> map = new HashMap<>(); map.put("time", ((String)list.get(0)).replace("T", " ").replace("Z", "")); map.put("value",list.get(1)); return map; }
好吧,就先介绍这么多哈。希望对大家有所帮助. 补充配置类:
@Configuration @EnableConfigurationProperties(InfluxDBProperties.class) @ConditionalOnProperty(prefix = "spring.influxdb", name = "url") public class InfluxDbConfiguration { @Bean public InfluxDBConnectionFactory connectionFactory(final InfluxDBProperties influxDBProperties) { return new InfluxDBConnectionFactory(influxDBProperties); } @Bean public InfluxDBTemplate<Point> influxDBTemplate(final InfluxDBConnectionFactory connectionFactory) { return new InfluxDBTemplate<>(connectionFactory, new PointConverter()); } @Bean public DefaultInfluxDBTemplate defaultTemplate(final InfluxDBConnectionFactory connectionFactory) { return new DefaultInfluxDBTemplate(connectionFactory); } }
服务类示例:
@Service("myInfluxDbService") public class MyInfluxDbServiceImpl implements MyInfluxDbService { private InfluxDBTemplate<Point> influxDBTemplate; public InfluxDbServiceImpl (InfluxDBTemplate<Point> influxDBTemplate) { this.influxDBTemplate=influxDBTemplate; }
相关推荐
在风控系统中,HBase可以用于存储非结构化的海量历史数据,如用户的交易记录、信用评分等,支持高效的大数据查询和分析。 6. **Grafana**: Grafana是一个开源的数据可视化平台,支持多种数据源,包括InfluxDB和...
3. **数据存储**:数据采集后需要存储,这可能涉及关系型数据库(如MySQL、PostgreSQL)或者非关系型数据库(如MongoDB、Cassandra),也可能用到时间序列数据库如InfluxDB。开发者需要掌握JPA(Java Persistence ...
7. **监控系统设计**:系统可能包括数据采集(通过YARN API或metrics系统)、数据存储(如使用Elasticsearch或InfluxDB)、数据处理(如使用Logstash或Grafana)和前端展示(如使用React或Vue.js)等组件。...
根据业务需求,可能需要关系型数据库(如MySQL、PostgreSQL)存储结构化数据,NoSQL数据库(如MongoDB、Cassandra)处理非结构化或半结构化数据,以及时间序列数据库(如InfluxDB)记录事件时间序列数据。...
- **数据模型**:系统可能包含用户、房屋、水电表、计量记录等实体,需要设计相应的数据库表结构来存储这些信息。 - **关系型数据库**:如MySQL或PostgreSQL,用于存储用户信息、水电表读数等静态数据。 - **时间...
Java SpringBoot框架+海康SDK Linux版本代码,集成了所需的告警DEMO(存储在influxDB)。有获取该NVR下所有设备的接口,以及获取该NVR下某个时间段的视频文件下载,并转成MP4文件。
SpringBoot-Metricas 是一个基于Java的项目,它利用了Spring Boot框架的强大力量来实现应用程序的度量收集和监控。Spring Boot以其快速启动、简化配置和开箱即用的特性深受开发者喜爱,而Spring Boot Metricas则...
SpringBoot + SpringCloud + SpringSecurity学习过程中的二进制汇总,沉淀记录下学习历程 1.知识点图谱 所有博文集中发布在个人博客网站: 大致规划的内容包括以下章节,希望能用半年到一年(严重超期)的时间完成....
Dropwizard Metrics是一个强大的库,它提供了一套丰富的工具,用于测量、记录和报告各种应用程序的运行时数据。 首先,我们需要了解Spring Boot集成Dropwizard Metrics的基本步骤。在Spring Boot项目中,可以通过...