PDF.NET开发框架“内存数据库”架构设计

前一段时间,我写了篇《移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记 》,记录了PDF.NET内存数据库的设计过程,最近做了些小改动,已经投入生产使用了,目前运行良好。今天重新看了看源码,觉得有必要画一个内存数据库的架构图,因为整个程序的核心代码加上详细的文件注释,才391行代码,时间长了恐怕无法了解整个程序的设计思路。

先直接上图,再说明架构的设计问题:

(PDF.NET内存数据库架构图)

架构说明

 1,核心类 MemDB

  • 一个存储所有实体类集合的集合,即Memory Data,应用程序要取数据,通过Get<T>方法获取(T为实体类类型);
  • 当获取数据的时候,如发现Memory Data里面没有,就调用Load<T>方法,从PMDb实体类文件加载数据;
  • 当有新实体数据需要保存的时候,调用Add<T>方法;
  • 当数据更新以后,如果想保存,就显式的调用一下Save<T>方法,注意,该方法并不直接保存数据,它只保存这个“保存数据的方法”,参见“移花接木”一文的说明;
  • 后台维护一个数据写入线程,检查是否有“保存数据的方法”需要执行;
  • 数据操作的日志记录。

2,核心类 MemDBEngin

该类实际上就是一个MemDB的工厂类,它会根据不同的数据库“路径”生成一个MemDB对象实例;

MemDB实例的生命周期由“系统缓存”管理,这里使用.NET 4.0的System.Runtime.Caching里面的缓存管理对象。

由于使用了系统缓存,所以MemDB能够做到“按需加载”,“闲置关闭”的功能。

MemDB实例中的Memory Data对应的就是“系统缓存”。

3,ICacheProvider 缓存提供程序接口

定义了一套缓存使用的方法,可以指定缓存策略,如相对过期、绝对过期等。

4,缓存提供程序

系统缓存的默认实现了Memory CacheProvider ,也就是内存缓存提供程序;由于采用接口设计,所以理论上也可以扩展为第三方的“分布式缓存”。

5,数据持久化

整个内存数据库使用的数据都是PDF.NET的实体类,这里使用PDF.NET框架的“序列化”和“反序列化”功能,将内存数据写入磁盘上的pmdb文件,或者从文件加载数据到内存中。

6,用户应用程序

这里是使用“内存数据库”的数据的地方,可以使用多种方式来操作内存数据,比如直接使用Linq To Object来查询内存中的数据,或者使用PDF.NET的EntityQuery对象,实现内存数据库和“关系数据库系统”(DBMS)的数据库间的双向同步。实际使用中,可以完全抛弃DBMS,使用Linq To Object已经足够了。

 7,PDF.NET Entity Object

这是整个系统使用的实体数据了,它由相关的组件调用传递。由于PDF.NET实体类的独特设计,使得它的序列化和反序列化效率非常高,另外不使用反射,性能也很好,而且,最重要的,它没有关系数据库那一套“沉重”的数据库元数据标识,所以它非常轻巧,适合作为内存数据库数据的最佳载体。

系统的伸缩能力

纵观整个系统的设计,可以看到它有很好的扩展能力:

  • 大型应用--可以很方便的扩展支持第三方分布式缓存,构建大型的系统应用;
  • 中小型应用--也可以将常用的DBMS数据放在内存数据库中,提高响应能力;
  • 轻微型应用--可以完全抛弃DBMS,使用纯内存数据库,以获得最大的响应速度。

有关PDF.NET开发框架的详细内容,请看官网 http://www.pwmis.com/sqlmap

内存数据库目前已经投入生产使用,即将整合在PDF.NET框架的下一个版本中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏BeJavaGod

不错位的 java .class 反编译工具推荐

我们经常会反编译看一些class文件,但是反编译出来的文件里面会有很多杂乱的东西 一直以来都是用的idea来反编译的,只要把class文件往里面一拖就行了 这么...

53850
来自专栏Java技术栈

Dubbo起死回生后的第一个版本:2.5.4发布

Dubbo2012年就停止更新维护了,版本停留在2.5.3。而在2017年7月31号这一天,官方公布了这一振奋人心的消息,Dubbo将得到官方重视继续更新维护,...

32870
来自专栏拂晓风起

Mozilla Firefox Extension扩展 内幕 教程 源代码分析 安装过程分析(XPInstall,xpcom,rdf,xpi,chrome,manifest)

20150
来自专栏java达人

项目本机部署过程中的若个问题

项目本机部署对老手来说纯粹是一个操作的过程,没有任何的技术难点,因此不会去关注,也不常去操作,有时候换一台计算机,或者在别人的计算机上开发一个新项目,部署的时候...

19650
来自专栏云瓣

打包优化实践(如何Code Spliting)

开发环境中可使用 analyze-webpack-plugin 观察各模块的占用情况。以该项目为例:浏览器中输入 http://localhost:3000/a...

13320
来自专栏进击的君君的前端之路

npm、npm scripts

21240
来自专栏GopherCoder

专栏:001: git 简易教程12:概念介绍篇3 代码示例篇3:附属篇4:参考

16740
来自专栏转载gongluck的CSDN博客

如何用Doxgen制作chm格式文档

对程序员来说,在开发自己的接口时,制作一个easy-go的文档也是coding中必不可少的一步,而且是相当重要的一步,虽然国内很多程序员,现在都略过了这一步。 ...

410110
来自专栏deepcc

nodejs服务器anywhere简介

41640
来自专栏IMWeb前端团队

Express使用手记:核心入门

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 入门简介 ? Express是基于nodejs的web开发框架。优点是易上...

22060

扫码关注云+社区

领取腾讯云代金券