RRD说明和注意事项org.rrd4j rrd4j 3.5
-
RRD数据库是一种环形数据库,使用 rrd4j 只能存储 double 类型的值。
-
RRD数据库的存储是基于时间的,比如时间间隔是 5 分钟,在 09:00 和 09:05 可以存储,如果 09:03 传入一个值,而指针又指在 09:00 的时候,这个值就会记录在 09:00,如果指针指在 9:05, 这个插入的值失效。
-
RRD数据库创建需要一个时间,这个时间可以自己指定,也可以使用默认时间。
模拟一个小时内,每三秒获取一次数据。
public class RrdController(){
private static final String FILENAME = "F:/demo.rrd"; //创建文件地址以及文件名称
private static final Long START_TIME = Util.getTimestamp(2021,11,14,15,0); //设置开始时间
private static final Long END_TIME = Util.getTimestamp(2021,11,14,16,0); //设置结束时间
1.创建rrd数据库
public static void insertFile() throws IOException {
RrdDef rrdDef = new RrdDef(FILENAME, START_TIME - 1, 3); //创建rrd文件
rrdDef.addDatasource("number", DsType.GAUGE,600,0,Double.NaN); //添加数据源
rrdDef.addArchive(ConsolFun.AVERAGE,0.5,1,1200); //添加存档方案
System.out.println("创建语法为:" + rrdDef.dump());
RrdDb rrdDb = new RrdDb(rrdDef); //生成rrd数据库
rrdDb.close(); //关闭rrd数据库
}
2.添加rrd数据
public static void addData() throws IOException {
RrdDb rrdDb = new RrdDb(FILENAME); //获取rrd文件数据库
Random random = new Random(100000); //创建存储的随机数
Sample sample = rrdDb.createSample(); //创建样本对象
long startTime = START_TIME;
long endTime = END_TIME;
while(startTime<=endTime){
// System.out.println(startTime);
sample.setTime(startTime).setValue("number",random.nextDouble()); //存储数据
sample.update(); //添加数据到rrd数据库中,否则不会添加。
startTime+=3;
}
// sample.setTime(System.currentTimeMillis()/1000).setValue("number",random.nextDouble()); //存储数据
// sample.setTime(1639465203).setValue("number",random.nextDouble()); //存储数据
// sample.setTime(1639465206).setValue("number",random.nextDouble()); //存储数据
// sample.setTime(1639465209).setValue("number",random.nextDouble()); //存储数据
// sample.setTime(1639465212).setValue("number",random.nextDouble()); //存储数据
rrdDb.close(); //添加完后必须要关闭数据库,否则添加失败。
}
3.查询rrd数据
public static void selectData() throws IOException {
RrdDb rrdDb = new RrdDb(FILENAME);
//创建获取请求
FetchRequest request = rrdDb.createFetchRequest(
ConsolFun.AVERAGE, //获取请求的方式,必须和创建时的一样
START_TIME, //存储数据开始时间
END_TIME); //存储数据结束时间
FetchData fetchData = request.fetchData(); //获取存档数据对象
System.out.println("上次更新时间为:" + rrdDb.getLastUpdateTime());
System.out.println("最后更新信息为:" + rrdDb.getInfo());
System.out.println("--获取一天的数据--");
System.out.println(request.dump());
// System.out.println(fetchData);
long[] timestamps = fetchData.getTimestamps();
double[] numbers = fetchData.getValues("number");
System.out.println("key: number");
for (int i = 0; i < numbers.length; i++) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(timestamps[i]*1000);
String format = simpleDateFormat.format(date);
System.out.println("时间:"+format+"-----"+"value:"+numbers[i]);
}
}
4.绘制线路图
public static void createPicture() throws IOException {
RrdDb rrdDb = new RrdDb(FILENAME);
RrdGraphDef gDef = new RrdGraphDef();
gDef.setWidth(600);
gDef.setHeight(400);
gDef.setFilename("F://demo.png");
gDef.setStartTime(START_TIME);
gDef.setEndTime(END_TIME);
gDef.setTitle("xuhy-number");
gDef.setImageFormat("png");
gDef.datasource("Number",FILENAME,"number",ConsolFun.AVERAGE);
gDef.line("Number", Color.GREEN,"number");
new RrdGraph(gDef);
}
5.启动测试
public static void main(String[] args){
try {
insertFile();
addData();
selectData();
createPicture();
} catch (IOException e) {
e.printStackTrace();
}
}
}



