彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB( 三 )


注意:此种情况仅限于新插入的数据字段与表A字段的交集即表A的情况,如果新插入数据字段与表A完全不同则会插入失败 。
3.查询表
# 显示该数据库中的表SHOW MEASUREMENTS
【彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB】4.删除表:
DROP MEASUREMENT "measurementName"
5.插入数据
insert host_cpu_usage_total,host_name=host1,cpu_core=core1 cpu_usage=0.26,cpu_idle=0.76
上面,我们新增一条数据,measurement为host_cpu_usage_total, tag为host_name,cpu_core, field为cpu_usage,cpu_idle 。
我们简单小结一下插入的语句写法:
 

  1. 基本格式:.insert + measurement + "," + tag=value,tag=value +空格+ field=value,field=value ;
  2. tag与tag之间用逗号分隔;field与field之间用逗号分隔;
  3. tag与field之间用空格分隔;
  4. tag都是string类型,不需要引号将value包裹;
  5. field如果是string类型,需要加引号;
 
6.查询数据
select * from host_cpu_usage_total
查询语句使用select 关键字,格式与mysql 基本一致 。
彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB

文章插图
 
4.2.3 用户管理
InfluxDB 默认管理员账号:admin,密码为空 。我们可以新增用户和权限 。命令如下:
#显示用户show users#创建用户create user "username" with password 'password'#创建管理员权限用户create user "username" with password 'password' with all privileges#删除用户drop user "username"
以上是对InfluxDB数据库操作的基本总结,其他复杂的用法可以参考官网教程 。官网教程地址:https://docs.influxdata.com/influxdb/v1.7/ 。
五、SpringBoot整合InfluxDB
前面介绍了InfluxDB的基本安装和使用 。接下来我们介绍SpringBoot项目如何整合InfluxDB,实现数据的增删改查 。这里使用的Spring Boot版本为2.4.1 。接下来看看如何实现的 。
5.1 添加依赖
首先创建springboot项目spring-boot-starter-influxdb,并添加相关依赖,具体依赖如下:
org.springframework.bootspring-boot-starterorg.springframework.bootspring-boot-starter-testtestorg.influxdbinfluxdb-JAVA2.14
5.2 修改Application.properties 配置
接下来修改application.properties 配置文件,增加InfluxDB的相关配置,具体如下:
#influxdb 配置spring.influx.url=http://localhost:8086spring.influx.user=adminspring.influx.password=spring.influx.database=weiz_test
上面配置的是InfluxDB数据库连接配置,默认url为:http://localhost:8086 ,数据库为之前创建的weiz_test数据库 。用户名为admin,密码默认为空 。
5.3 读取配置文件
创建InfluxDBConfig类,负责读取Influx的数据库连接配置 。具体代码如下:
@Configurationpublic class InfluxDBConfig {@Value("${spring.influx.user}")public String userName;@Value("${spring.influx.password}")public String password;@Value("${spring.influx.url}")public String url;//数据库@Value("${spring.influx.database}")public String database;
5.4 数据库操作类
创建数据库操作类InfluxDBService,负责数据库的初始化,增删改查等操作的具体实现,示例代码如下:
@Servicepublic class InfluxDBService {@Autowiredprivate InfluxDBConfig influxDBConfig;@PostConstructpublic void initInfluxDb() {this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;this.influxDB = influxDbBuild();//保留策略private String retentionPolicy;private InfluxDB influxDB;* 设置数据保存策略 defalut 策略名 /database 数据库名/ 30d 数据保存时限30天/ 1 副本个数为1/ 结尾DEFAULT* 表示 设为默认的策略public void createRetentionPolicy() {String command = String.format("CREATE RETENTION POLICY "%s" ON "%s" DURATION %s REPLICATION %s DEFAULT","defalut", influxDBConfig.database, "30d", 1);this.query(command);* 连接时序数据库;获得InfluxDBprivate InfluxDB influxDbBuild() {if (influxDB == null) {influxDB = InfluxDBFactory.connect(influxDBConfig.url, influxDBConfig.userName, influxDBConfig.password);influxDB.setDatabase(influxDBConfig.database);return influxDB;* 插入* @param measurement 表* @param tags 标签* @param fields 字段public void insert(String measurement, Map tags, Map fields) {influxDbBuild();Point.Builder builder = Point.measurement(measurement);builder.time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);influxDB.write(influxDBConfig.database, "", builder.build());* @desc 插入,带时间time* @date 2021/3/27*@param measurement*@param time*@param tags*@param fields* @return voidpublic void insert(String measurement, long time, Map tags, Map fields) {influxDbBuild();Point.Builder builder = Point.measurement(measurement);builder.time(time, TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);influxDB.write(influxDBConfig.database, "", builder.build());* @desc influxDB开启UDP功能,默认端口:8089,默认数据库:udp,没提供代码传数据库功能接口* @date 2021/3/13*@param measurement*@param time*@param tags*@param fields* @return voidpublic void insertUDP(String measurement, long time, Map tags, Map fields) {influxDbBuild();Point.Builder builder = Point.measurement(measurement);builder.time(time, TimeUnit.MILLISECONDS);builder.tag(tags);builder.fields(fields);int udpPort = 8089;influxDB.write(udpPort, builder.build());* 查询* @param command 查询语句* @returnpublic QueryResult query(String command) {influxDbBuild();return influxDB.query(new Query(command, influxDBConfig.database));* @desc 查询结果处理* @date 2021/5/12*@param queryResultpublic List> queryResultProcess(QueryResult queryResult) {List> mapList = new ArrayList<>();List resultList = queryResult.getResults();//把查询出的结果集转换成对应的实体对象,聚合成listfor(QueryResult.Result query : resultList){List seriesList = query.getSeries();if(seriesList != null && seriesList.size() != 0) {for(QueryResult.Series series : seriesList){List columns = series.getColumns();String[] keys = columns.toArray(new String[columns.size()]);List> values = series.getValues();if(values != null && values.size() != 0) {for(List value : values){Map map = new HashMap(keys.length);for (int i = 0; i < keys.length; i++) {map.put(keys[i], value.get(i));mapList.add(map);return mapList;* @desc InfluxDB 查询 count总条数* @date 2021/4/8public long countResultProcess(QueryResult queryResult) {long count = 0;List> list = queryResultProcess(queryResult);if(list != null && list.size() != 0) {Map map = list.get(0);double num = (Double)map.get("count");count = new Double(num).longValue();return count;* 查询* @param dbName 创建数据库* @returnpublic void createDB(String dbName) {influxDbBuild();influxDB.createDatabase(dbName);* 批量写入测点* @param batchPointspublic void batchInsert(BatchPoints batchPoints) {influxDbBuild();influxDB.write(batchPoints);* 批量写入数据* @param database 数据库* @param retentionPolicy 保存策略* @param consistency 一致性* @param records 要保存的数据(调用BatchPoints.lineProtocol()可得到一条record)public void batchInsert(final String database, final String retentionPolicy,final InfluxDB.ConsistencyLevel consistency, final List records) {influxDbBuild();influxDB.write(database, retentionPolicy, consistency, records);* @desc 批量写入数据* @date 2021/3/19*@param consistency*@param recordspublic void batchInsert(final InfluxDB.ConsistencyLevel consistency, final List records) {influxDbBuild();influxDB.write(influxDBConfig.database, "", consistency, records);


推荐阅读