原因:
在我们写程序时经常需要用到将少量数据以秒级的保存起来,但这时无法使用当前自动化的实时数据(太大了,而且成本太高),所以想到了自己写一个这样的程序
功能:
本数据库用于单用户存储多用户访问以秒为单位的实时数据,数据以文本文件的方式保存于本地硬盘中,并可通过 HTTP 方式获得远程服务器中的数据并可实现通过 URL 方式直接查看结点曲线图
实现方式:
本系统以指定的基准目录 ( 或根目录 ) 为主,基准目录下存在三个目录:
临时实时数据目录 :临时实时数据分为两类:小时级缓存数据保存、压缩前实时数据保存。
小时级缓存数据保存: 为减小文件存储,提高读写性能特将当天数据以每小时一个文件的方式保存于本目录下,数据存储格式为: [min,data1,data2, … data60]
min 为 3 或 4 位数,表示某小时的某分钟,例如 603 表示 6 点 3 分; data1 等为每秒钟的数据,例如 data6 为 6 秒的数据;
小时级数据保存目录 : 根目录 /temp/caches/ 日期 / 信号点 - 小时 .txt
压缩前实时数据保存 :记录 7 天内的实时数据,超过 7 天后系统自动进行压缩并转存到压缩实时数据目录下。
目录格式为:根目录 /temp/data/ 日期 / 信号点 .txt ,
临时解压缩数据目录 :主要用于多用户对压缩数据读取时的解压缩缓存。
目录格式为:根目录 /temp/decom/ 用户 / 子文件夹
压缩实时数据目录 :为了减小系统数据对于硬盘的消耗,特通过 RAR 方式对历史数据进行压缩保存。
目录格式为:根目录 /data/ 年 / 月 / 日 / 每 10 个信号点组成的压缩文件
接口:
namespace System.RealTime
{
/// <summary>
/// 读取实时数据接口
/// </summary>
public interface IDBReadManager
{
/// <summary>
/// 读取单个信号点指定时间的数据
/// </summary>
/// <param name="node"> 信号点名称 </param>
/// <param name="time"> 操作时间 </param>
/// <returns></returns>
decimal Read(string node, string time);
/// <summary>
/// 读取单个信号点一段时间的数据
/// </summary>
/// <param name="node"> 信号点名称 </param>
/// <param name="startTime"> 开始时间 </param>
/// <param name="endTime"> 结束时间 </param>
/// <returns></returns>
List <decimal > Read(string node, DateTime startTime, DateTime endTime);
/// <summary>
/// 读取单个信号点一段时间的数据(自定义间隔)
/// </summary>
/// <param name="node"> 信号点名称 </param>
/// <param name="startTime"> 开始时间 </param>
/// <param name="endTime"> 结束时间 </param>
/// <param name="interval"> 间隔秒数 </param>
/// <returns></returns>
List <decimal > Read(string node, DateTime startTime, DateTime endTime, int interval);
/// <summary>
/// 读取多个信号点指定时间的数据
/// </summary>
/// <param name="nodes"> 信号点列表 </param>
/// <param name="time"> 操作时间 </param>
/// <returns></returns>
Dictionary <string , decimal > Read(List <string > nodes, string time);
}
}
namespace System.RealTime.Txt
{
/// <summary>
/// 数据库写入接口
/// </summary>
public interface IDBWriteManager
{
/// <summary>
/// 写入单个信号点数据
/// </summary>
/// <param name="node"> 信号点编号 </param>
/// <param name="time"> 操作时间 </param>
/// <param name="data"> 数据 </param>
void Write(string node, DateTime time, decimal data);
/// <summary>
/// 写入多个信号点数据
/// </summary>
/// <param name="time"> 操作时间 </param>
/// <param name="data"> 信号点数据 </param>
void Write(DateTime time, Dictionary <string , decimal > data);
/// <summary>
/// 设置自保存状态
/// </summary>
/// <param name="state"></param>
void SetAutoSaveEnabled(bool state);
/// <summary>
/// 手工保存数据
/// </summary>
void Flush();
}
}