对于传统关系型数据库,增删改查应该是必备且常用的功能,而influxdb常用的只有insert和select,没有提供update语法,虽然有delete可以删除数据(delete语法和mysql相似),但是需求不大。
influxdb 相对于对监控数据的记录,用于对数据图标的展示,influxdb 2.0 版本已经更新,但由于2.0 版本与1.+ 版本相差比较大。加上对java 等相对应配套还不完善,这里都是1.+版本。
安装使用一、下载安装
# docker启动influxdb docker run -d -p 8083:8083 -p 8086:8086 --name my_influxdb influxdb:1.7.9 # 进入docker 容器 docker exec -it my_influxdb /bin/bash #进入指定目录,启动客户端 cd /usr/bin ./influx
二、使用前准备工作
#创建用户名密码 create user "root" with password 'newpwd' with all privileges; #创建数据库 CREATE DATABASE mydb; #更改当前数据库过期策略 ALTER RETENTION POLICY "autogen" ON mydb DURATION 14d REPLICATION 1 SHARD DURATION 1d DEFAULT ; #查看当前用户 show users; # 查看有哪些数据库 show databases; # 进入数据库设置名称 use 数据库名称;
influxdb保留策略
- retention_policy_name: 策略名。
- duration: 数据保留时长。
- REPLICATION: 复制因子,单机版设置为1即可。
- SHARD DURATION:设置shardGroupDuration时长,表示每个shard group时间跨度时长。可不填,默认根据RP的duration计算。
- default: true为设置该RP为默认RP
> show users user admin ---- ----- > create user "root" with password 'newpwd' with all privileges; > show users; user admin ---- ----- root true > show databases; name: databases name ---- _internal > CREATE DATABASE mydb; > show databases; > name: databases name ---- _internal mydb > SHOW RETENTION POLICIES ON mydb; name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 true > use mydb; Using database mydb > ALTER RETENTION POLICY "autogen" ON mydb DURATION 14d REPLICATION 1 SHARD DURATION 1d DEFAULT ; > SHOW RETENTION POLICIES ON mydb; name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 336h0m0s 24h0m0s 1 trueSpringboot 结合influxDb
一、引入依赖
org.influxdb influxdb-java 2.14
二、设置配置文件
influx: url: http://xx:8086 user: root password: newpwd database: mydb
三、代码配置
@Component
@Configuration
@Data
public class InfluxDBConfig implements InitializingBean {
@Value("${influx.user}")
private String userName;
@Value("${influx.password}")
private String password;
@Value("${influx.url}")
private String url;
//数据库
@Value("${influx.database}")
private String database;
//保留策略
private String retentionPolicy;
private InfluxDB influxDB;
public InfluxDBConfig(){}
public InfluxDBConfig(String userName, String password, String url, String database) {
this.userName = userName;
this.password = password;
this.url = url;
this.database = database;
// autogen默认的数据保存策略
this.retentionPolicy = retentionPolicy == null || "".equals(retentionPolicy) ? "autogen" : retentionPolicy;
this.influxDB = influxDbBuild();
}
private InfluxDB influxDbBuild() {
if (influxDB == null) {
influxDB = InfluxDBFactory.connect(url, userName, password);
influxDB.setDatabase(database);
}
return influxDB;
}
@Override
public void afterPropertiesSet() throws Exception {
influxDbBuild();
}
}
四、java 实现类
@Service
public class InfluxDbServiceImpl {
@Resource
InfluxDBConfig influxDBConfig;
public void insert(String measurement, Map tags, Map fields) {
insert(measurement, System.currentTimeMillis(), tags, fields);
}
public void insert(String measurement, long time, Map tags, Map fields) {
Point.Builder builder = Point.measurement(measurement);
builder.time(time, TimeUnit.MILLISECONDS);
if(CollectionUtils.isNotEmpty(tags)){
builder.tag(tags);
}
builder.fields(fields);
InfluxDB influxDB = influxDBConfig.getInfluxDB();
influxDB.write(influxDBConfig.getDatabase(), "", builder.build());
}
public QueryResult queryResult(String command) {
InfluxDB influxDB = influxDBConfig.getInfluxDB();
return influxDB.query(new Query(command, influxDBConfig.getDatabase()));
}
public List
五、controller
@GetMapping("/influx")
public void insertData(@RequestParam("language") String language,@RequestParam("addr") String addr){
Map tagMap = new HashMap<>();
tagMap.put("language",language);
tagMap.put("addr",addr);
Map fieldMap = new HashMap<>();
fieldMap.put("value", 1234);
fieldMap.put("id", 3);
influxDbService.insert("influx_db", tagMap, fieldMap);
}
@GetMapping("/getInflux")
public List> getInflux(){
return influxDbService.query( "SELECT value FROM influx_db WHERe language='python'");
}
InfluxDB HTTP 查询
influxDb也是根据http 方式提供服务的,所以我们也是可以直接可以通过http 方式连接到数据库。
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECt value FROM influx_db WHERe language='python'"
curl -GET 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECt value FROM influx_db group by language"



