influxDB开发

influxDB

一、安装influxDB

安装环境: OS X Yosemite, 使用brew命令安装

brew install influxdb

执行结果:

➜  ~ brew install influxdb
==> Downloading https://homebrew.bintray.com/bottles/influxdb-0.13.0.yosemite.bo
######################################################################## 100.0%
==> Pouring influxdb-0.13.0.yosemite.bottle.tar.gz
==> Caveats
To have launchd start influxdb now and restart at login:
  brew services start influxdb
Or, if you don't want/need a background service you can just run:
  influxd -config /usr/local/etc/influxdb.conf
==> Summary
 /usr/local/Cellar/influxdb/0.13.0: 6 files, 48.7M
➜  ~

启动influxdb

influxd -config /usr/local/etc/influxdb.conf

执行结果ßß:

➜  ~ influxd -config /usr/local/etc/influxdb.conf

 8888888           .d888 888                   8888888b.  888888b.
   888            d88P"  888                   888  "Y88b 888  "88b
   888            888    888                   888    888 888  .88P
   888   88888b.  888888 888 888  888 888  888 888    888 8888888K.
   888   888 "88b 888    888 888  888  Y8bd8P' 888    888 888  "Y88b
   888   888  888 888    888 888  888   X88K   888    888 888    888
   888   888  888 888    888 Y88b 888 .d8""8b. 888  .d88P 888   d88P
 8888888 888  888 888    888  "Y88888 888  888 8888888P"  8888888P"

[run] 2017/03/03 11:31:41 InfluxDB starting, version 0.13.0, branch 0.13, commit e57fb88a051ee40fd9277094345fbd47bb4783ce
[run] 2017/03/03 11:31:41 Go version go1.6.2, GOMAXPROCS set to 4
[run] 2017/03/03 11:31:41 Using configuration at: /usr/local/etc/influxdb.conf
[store] 2017/03/03 11:31:41 Using data dir: /usr/local/var/influxdb/data
[subscriber] 2017/03/03 11:31:41 opened service
[monitor] 2017/03/03 11:31:41 Starting monitor system
[monitor] 2017/03/03 11:31:41 'build' registered for diagnostics monitoring
[monitor] 2017/03/03 11:31:41 'runtime' registered for diagnostics monitoring
[monitor] 2017/03/03 11:31:41 'network' registered for diagnostics monitoring
[monitor] 2017/03/03 11:31:41 'system' registered for diagnostics monitoring
[cluster] 2017/03/03 11:31:41 Starting cluster service
[shard-precreation] 2017/03/03 11:31:41 Starting precreation service with check interval of 10m0s, advance period of 30m0s
[snapshot] 2017/03/03 11:31:41 Starting snapshot service
[copier] 2017/03/03 11:31:41 Starting copier service
[admin] 2017/03/03 11:31:41 Starting admin service
[admin] 2017/03/03 11:31:41 Listening on HTTP: [::]:8083
[continuous_querier] 2017/03/03 11:31:41 Starting continuous query service
[httpd] 2017/03/03 11:31:41 Starting HTTP service
[httpd] 2017/03/03 11:31:41 Authentication enabled: false
[httpd] 2017/03/03 11:31:41 Listening on HTTP: [::]:8086
[retention] 2017/03/03 11:31:41 Starting retention policy enforcement service with check interval of 30m0s
[run] 2017/03/03 11:31:41 Listening for signals
[monitor] 2017/03/03 11:31:41 Storing statistics in database '_internal' retention policy 'monitor', at interval 10s
2017/03/03 11:31:41 Sending anonymous usage statistics to m.influxdb.com
[tsm1wal] 2017/03/03 11:31:51 tsm1 WAL starting with 10485760 segment size
[tsm1wal] 2017/03/03 11:31:51 tsm1 WAL writing to /usr/local/var/influxdb/wal/_internal/monitor/1
[shard] 2017/03/03 11:31:51 /usr/local/var/influxdb/data/_internal/monitor/1 database index loaded in 7.667µs

访问http://127.0.0.1:8083 查看是否安装成功.

二、Maven依赖
<dependency>
    <groupId>org.influxdb</groupId>
    <artifactId>influxdb-java</artifactId>
    <version>2.5</version>
</dependency>
三、Java示例
package influxdb;

import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;

/**
 * Created by zhengyong on 17/3/2.
 */
public class InfluxdbBuilder {

    private String   username;
    private String   password;
    private String   url;

    private InfluxDB influxDB;

    public InfluxdbBuilder(String url, String username, String password){
        this.url = url;
        this.username = username;
        this.password = password;
    }

    public InfluxDB build() {
        if (influxDB == null) {
            synchronized (this) {
                if (influxDB == null) {
                    influxDB = InfluxDBFactory.connect(url, username, password);
                }
            }
        }
        return influxDB;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package influxdb;

import org.influxdb.InfluxDB;
import org.influxdb.dto.Point;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;

import java.util.Map;

/**
 * influxdb操作类 <br/>
 * Created by zhengyong on 17/3/3.
 */
public class InfluxdbService {

    private String   database;
    private String   policyName;
    private InfluxDB influxDB;

    public InfluxdbService(String database, String policyName, InfluxDB influxDB){
        this.database = database;
        this.policyName = policyName;
        this.influxDB = influxDB;
    }

    /**
     * 创建数据库
     */
    public void createDatabase() {
        influxDB.createDatabase(database);
    }

    /**
     * 创建保存策略 <br/>
     * CREATE RETENTION POLICY "default" ON "influxdb-database" DURATION 30d REPLICATION 1 DEFAULT
     *
     * @param duration 存放时间 (30d)
     * @param replicationNum 备份数量
     */
    public void createRetentionPolicy(String duration, Integer replicationNum) {

        String command = String.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",
                                       policyName, database, duration, replicationNum);

        this.query(command);
    }

    /**
     * 插入数据
     *
     * @param measurement a Point in a fluent manner
     * @param tagsToAdd the Map of tags to add
     * @param fields the fields to add
     */
    public void insert(String measurement, Map<String, String> tagsToAdd, Map<String, Object> fields) {

        Point.Builder builder = Point.measurement(measurement).tag(tagsToAdd);
        if (fields != null && !fields.isEmpty()) {
            builder.fields(fields);
        }
        influxDB.write(database, policyName, builder.build());
    }

    /**
     * 查询数据
     *
     * @param command
     * @return QueryResult
     */
    public QueryResult query(String command) {
        return influxDB.query(new Query(command, database));
    }

    public InfluxDB getInfluxDB() {
        return influxDB;
    }

    public String getDatabase() {
        return database;
    }

    public String getPolicyName() {
        return policyName;
    }

}
package influxdb;

import org.apache.commons.collections.CollectionUtils;
import org.influxdb.InfluxDB;
import org.influxdb.dto.QueryResult;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by zhengyong on 17/3/2.
 */
public class InfluxdbTest {

    /**
     * 数据库名称
     */
    private static final String database        = "influxdb-database";

    /**
     * 数据报存策略
     */
    private static String       retentionPolicy = "default";

    public static void main(String[] args) {

        InfluxDB influxDB = new InfluxdbBuilder("http://127.0.0.1:8086", "user", "pass").build();

        InfluxdbService service = new InfluxdbService(database, retentionPolicy, influxDB);

        // 创建数据库
        service.createDatabase();

        // 创建数据保存策略
        service.createRetentionPolicy("30d", 1);

        // 插入数据
        Map<String, String> tags = new HashMap<>();
        tags.put("methodName", "getName");
        Map<String, Object> fields = new HashMap<>();
        fields.put("rt", 200);
        fields.put("tps", 300);
        service.insert("measurementKey", tags, fields);

        // 查询数据
        QueryResult queryResult = service.query("select * from \"measurementKey\"");
        List<QueryResult.Result> results = queryResult.getResults();
        if (CollectionUtils.isNotEmpty(results)) {
            for (QueryResult.Result result : results) {
                System.out.println(result.toString());
            }
        }

    }

}

四、备注

端口说明:8083端口为界面显示端口,8086端口为数据库通讯端口

参考地址:https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
开发流程: 1. 确定需求,设计数据库表结构; 2. 搭建 Flask 后端框架,实现用户注册、登录功能,使用 JWT 进行身份验证; 3. 设计任务列表和任务详情页面,使用 Vue.js 和 Element UI 开发前端页面; 4. 使用 InfluxDB 存储任务数据,编写 InfluxDB 数据库操作代码; 5. 后端提供接口,前端调用后端接口,实现任务列表和任务详情展示; 6. 编写代码测试,部署上线。 代码实现: 1. 设计数据库表结构 ``` CREATE TABLE users ( id INTEGER PRIMARY KEY, username TEXT NOT NULL, password TEXT NOT NULL ); CREATE TABLE tasks ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, description TEXT, status TEXT NOT NULL, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, user_id INTEGER NOT NULL, FOREIGN KEY (user_id) REFERENCES users (id) ); ``` 2. 后端 Flask 框架代码 ```python from flask import Flask, jsonify, request from flask_jwt_extended import JWTManager, jwt_required, create_access_token from werkzeug.security import generate_password_hash, check_password_hash from datetime import datetime from influxdb import InfluxDBClient app = Flask(__name__) app.config['JWT_SECRET_KEY'] = 'secret_key' jwt = JWTManager(app) client = InfluxDBClient(host='localhost', port=8086, username='root', password='root', database='tasks') @app.route('/api/register', methods=['POST']) def register(): username = request.json.get('username') password = request.json.get('password') hashed_password = generate_password_hash(password) client.write_points([{ "measurement": "users", "tags": { "username": username }, "fields": { "password": hashed_password } }]) return jsonify({'message': 'User created successfully!'}), 201 @app.route('/api/login', methods=['POST']) def login(): username = request.json.get('username') password = request.json.get('password') result = client.query(f'SELECT password FROM users WHERE username=\'{username}\'') if len(result) == 0: return jsonify({'message': 'Invalid username or password!'}), 401 pwd_hash = result[0][0]['password'] if check_password_hash(pwd_hash, password): access_token = create_access_token(identity=username) return jsonify(access_token=access_token), 200 else: return jsonify({'message': 'Invalid username or password!'}), 401 @app.route('/api/tasks', methods=['GET']) @jwt_required() def get_tasks(): result = client.query('SELECT * FROM tasks') tasks = [] for row in result: task = { 'id': row['id'], 'title': row['title'], 'description': row['description'], 'status': row['status'], 'created_at': row['created_at'], 'updated_at': row['updated_at'], 'user_id': row['user_id'] } tasks.append(task) return jsonify(tasks), 200 @app.route('/api/tasks/<int:task_id>', methods=['GET']) @jwt_required() def get_task(task_id): result = client.query(f'SELECT * FROM tasks WHERE id={task_id}') if len(result) == 0: return jsonify({'message': 'Task not found!'}), 404 row = result[0] task = { 'id': row['id'], 'title': row['title'], 'description': row['description'], 'status': row['status'], 'created_at': row['created_at'], 'updated_at': row['updated_at'], 'user_id': row['user_id'] } return jsonify(task), 200 @app.route('/api/tasks', methods=['POST']) @jwt_required() def create_task(): title = request.json.get('title') description = request.json.get('description') status = request.json.get('status') created_at = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') updated_at = created_at user_id = request.json.get('user_id') client.write_points([{ "measurement": "tasks", "fields": { "title": title, "description": description, "status": status, "created_at": created_at, "updated_at": updated_at, "user_id": user_id } }]) return jsonify({'message': 'Task created successfully!'}), 201 if __name__ == '__main__': app.run(debug=True) ``` 3. 前端 Vue.js 和 Element UI 代码 ```html <template> <div> <el-button type="primary" @click="showCreateDialog">Create Task</el-button> <el-table :data="tasks" style="width: 100%"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="title" label="Title"></el-table-column> <el-table-column prop="description" label="Description"></el-table-column> <el-table-column prop="status" label="Status"></el-table-column> <el-table-column prop="created_at" label="Created At"></el-table-column> <el-table-column prop="updated_at" label="Updated At"></el-table-column> <el-table-column prop="user_id" label="User ID"></el-table-column> <el-table-column label="Operations"> <template slot-scope="scope"> <el-button type="text" @click="showDetailDialog(scope.row.id)">Detail</el-button> </template> </el-table-column> </el-table> <el-dialog :visible.sync="createDialogVisible" title="Create Task"> <el-form :model="form" label-position="left" label-width="80px"> <el-form-item label="Title"> <el-input v-model="form.title"></el-input> </el-form-item> <el-form-item label="Description"> <el-input v-model="form.description"></el-input> </el-form-item> <el-form-item label="Status"> <el-select v-model="form.status"> <el-option label="Open" value="open"></el-option> <el-option label="In Progress" value="in_progress"></el-option> <el-option label="Closed" value="closed"></el-option> </el-select> </el-form-item> <el-form-item label="User ID"> <el-input v-model="form.user_id"></el-input> </el-form-item> </el-form> <div slot="footer"> <el-button @click="createTask">Create</el-button> <el-button @click="createDialogVisible = false">Cancel</el-button> </div> </el-dialog> <el-dialog :visible.sync="detailDialogVisible" title="Task Detail"> <el-card> <p>ID: {{ detailTask.id }}</p> <p>Title: {{ detailTask.title }}</p> <p>Description: {{ detailTask.description }}</p> <p>Status: {{ detailTask.status }}</p> <p>Created At: {{ detailTask.created_at }}</p> <p>Updated At: {{ detailTask.updated_at }}</p> <p>User ID: {{ detailTask.user_id }}</p> </el-card> <div slot="footer"> <el-button @click="detailDialogVisible = false">Close</el-button> </div> </el-dialog> </div> </template> <script> import axios from 'axios' export default { name: 'TaskList', data () { return { tasks: [], createDialogVisible: false, detailDialogVisible: false, form: { title: '', description: '', status: '', user_id: '' }, detailTask: {} } }, methods: { loadTasks () { axios.get('/api/tasks').then(response => { this.tasks = response.data }).catch(error => { console.error(error) }) }, showCreateDialog () { this.createDialogVisible = true }, createTask () { axios.post('/api/tasks', this.form).then(response => { console.log(response.data) this.createDialogVisible = false this.loadTasks() }).catch(error => { console.error(error) }) }, showDetailDialog (id) { axios.get(`/api/tasks/${id}`).then(response => { this.detailTask = response.data this.detailDialogVisible = true }).catch(error => { console.error(error) }) } }, mounted () { this.loadTasks() } } </script> ``` 4. InfluxDB 数据库操作代码 ```python from influxdb import InfluxDBClient from datetime import datetime client = InfluxDBClient(host='localhost', port=8086, username='root', password='root', database='tasks') def create_user(username, password): hashed_password = generate_password_hash(password) client.write_points([{ "measurement": "users", "tags": { "username": username }, "fields": { "password": hashed_password } }]) def get_user_password(username): result = client.query(f'SELECT password FROM users WHERE username=\'{username}\'') if len(result) == 0: return None pwd_hash = result[0][0]['password'] return pwd_hash def get_tasks(): result = client.query('SELECT * FROM tasks') tasks = [] for row in result: task = { 'id': row['id'], 'title': row['title'], 'description': row['description'], 'status': row['status'], 'created_at': row['created_at'], 'updated_at': row['updated_at'], 'user_id': row['user_id'] } tasks.append(task) return tasks def get_task_by_id(task_id): result = client.query(f'SELECT * FROM tasks WHERE id={task_id}') if len(result) == 0: return None row = result[0] task = { 'id': row['id'], 'title': row['title'], 'description': row['description'], 'status': row['status'], 'created_at': row['created_at'], 'updated_at': row['updated_at'], 'user_id': row['user_id'] } return task def create_task(title, description, status, user_id): created_at = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ') updated_at = created_at client.write_points([{ "measurement": "tasks", "fields": { "title": title, "description": description, "status": status, "created_at": created_at, "updated_at": updated_at, "user_id": user_id } }]) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值