文本数据库--.Net界未来的一朵奇葩

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

文本存储,这是一个我以前很少去实施具体应用的领域。

 

何以会说起文本数据库,从上篇:秋色园QBlog技术原理解析:性能优化篇:读写分离与文本数据库(十八) 中,看出是出于应用,故而有几许冲动。

 

当然地,从上文中,可以看出:基本基于文本的简单的读写应用,轻轻地严格地一点地来说和“数据库”不太着边,境界不够。

 

我想象中“文本数据库”,再怎么简单,也得应该有以下几个的吧:

 

复制代码
1 :有存储结构[表结构]

2 :有主键ID,不是GUID时,咋也得整个自增ID吧(大伙的应用习惯)。

3 :能添加,修改,删除数据。

4 :最好还能查询,排序,分页,至于分组可能要求高了点。

5 :再最好有并发控制。
复制代码

 

回头再看秋色园 QBlog 当前的应用是:

 

1 :文本存储的内容少:1个文本存的不是表,基本是1行(偶尔多行)。

2 :基于第1点,只能说是文本的读取应用,和“数据库”还扯不上关系。

 

故从以上目前的应用来说,完全达不到文本数据库应用的境界。

 

当然,有了基于文本的应用,故而顺理成章的对文本扩展出的“文本数据库”产生了些许兴趣与冲动也就很自然了。

 

于是,我上网搜了一下“文本数据库”,发现.net界几乎没有它的身影,倒是曾在php界大放过异采,这是为什么呢?

 

这是为什么呢?估计是为了以下内容:

 

用文本当数据库的基本优势:

 

复制代码
1 :简单的文本操作速度比数据库快:

非要解释,我只能这么说:大伙都存的磁盘,直接存肯定比数据库绕了一定的存储结构规则后存的快,当然越往后越复杂,就不好说了。

2 :存取操作简单:

不用啥ADO.NET,直接System.IO.File就可以搞定,多省事啊!
复制代码

 

用文本当数据库的基本劣势:

 

复制代码
1 :数据量不适合大。

2 :并发似乎不太好

3 :删除与修改不好操作

4 :要变身成“文本数据库”有好多要事要处理:

a:这自增加ID咋出来啊?

b:这要查询咋整啊?

c:这要排序咋整啊?
复制代码

 

用文本数据库的基本适用的应用场景:

 

复制代码
1 :小型应用,以文本为主数据库:

单个(表)文本数据量不大:10万条数据以下,10M大小以下(一次性加载到内存中操作,就成了内存数据库了,速度哗啦啦)。

2 :大型应用,以文本为辅数据库:

通过将一些数据库分散到零散的文本中,降低主数据库的压力。

3 :中型应用,以文本为主数据库:

这个不好说,说不好,不说好,需要有一定强力的技术阵容支持。 
复制代码

 

 

为了更好的发挥“文本数据库”的能动性,本人花了些时间对其进行了些许研究及思考,下面和大伙分享一下经验:

 

1:存储结构

 

复制代码
这个我从秋色园 QBlog 的文本应用中得到提示,存成json,挺好的呀,这不json都流行的么,直接读取传到前端,爱干啥干啥!

所以这里的技术点是:如何输出json和读取json解析。

这里:CYQ.Data V3.
0  框架开源版本(下载)里有一个JsonHelper,能把数据生成Json,也能把json字符串解析成KeyValue键值对应,感兴趣的可去研究。

于是,基本读与取就解决了。
复制代码

 

2:数据插入

 

使用:System.IO.File.AppendAllText就可以轻松把一行的json加到文本的末尾中。

 

3:更新、删除

 

复制代码
这两个操作几乎是差不多,个人想到的两种方式:

方式一:简单型 [这个其实挺好,因此从文本数据库的应用场景上看,基本要求并不是太高]

将整个表的重新输出json,再重写一次文本就可以了。

方式二:复杂型[这个是性能考虑的多一些,对于文本数据库追求的过些过了一点,因为如果太复杂,何不找其它数据库,用文本不就图个简单么]

这个比较痛苦,这里也给出一点个人的思路想法:

1 :定表结构时,必须定好每个字段的长度,这样就定出一行总的最大长度。

2 :写一行数据时,不够总长时,后面补空(好像通常是写入\0)。

3 :更新或删除时,根据行的(ID-1)*总长,定位到起始写的位置,然后改写一行即可,如果是删除则当行全写空(\0)。

这里其实就是空间换时间,而且数据删除时,文本大小也没变化,是不是有点像access呢?

复制代码

 

针以上面方式二,这里给出点示例代码:

 

                FileStream fs  =  File.Open(文件路径);
                fs.Seek(
定位要写入的开始位置 , SeekOrigin.Current);
                fs.Write(..写入内容...);
                fs.Close();

 

4:自增ID咋出来

 

增加ID还是比较容易,读取文本最后一行的首字段的值 + 1就出来了,当然仅适合于数字型的了,然后全局缓存,每次读取 ++

 

下面给出一个参考的示例代码:

 

复制代码
  ///   <summary>
        
///  下一个自增加ID
        
///   </summary>
         private   int  NextID
        {
            
get
            {
                
lock  (lockNextIDobj)
                {
                    
if  (maxID  >   0 )
                    {
                        maxID
++ ;
                    }
                    
else   if  (DataType.GetGroupID(Table.Columns[ 0 ].SqlType)  ==   1 ) // 自增ID仅对int有效
                    {
                        
if  (Table.Rows.Count  >   0 )
                        {
                            
int  lastIndex  =  _Table.Rows.Count  -   1 ;
                            
do
                            {
                                
if  (lastIndex  >=   0 )
                                {
                                    
if  (_Table.Rows[lastIndex][ 0 ].IsNull)
                                    {
                                        lastIndex
-- ;
                                    }
                                    
else
                                    {
                                        maxID 
=  Convert.ToInt32(_Table.Rows[lastIndex][ 0 ].Value)  +   1 ;
                                    }
                                }
                                
else
                                {
                                    maxID 
=   1 ;
                                }
                            }
                            
while  (maxID  ==   0 );

                        }
                        
else
                        {
                            maxID 
=   1 ;
                        }
                    }
                    
else
                    {
                        
throw   new  Exception( " Increment id only use for int type " );
                    }
                }
                
return  maxID;
            }
        }
复制代码

 

5:查询怎么办

 

其实这个很好办,将json解析还原为数组列表之后,数组有个FindAll方法,搜点教程研究一下就可以了,对于数组的查询,园子里还是有不少文章介绍的。

 

6:排序怎么办

 

这个也很好办,同样json解析还原为数组列表之后,数组有个Sort方法,同样搜点教程就可以了。

 

7:单进程并发怎么控制

 

这个其实也好办,加lock锁就行了。

 

8:多进程并发怎么控制

 

在IIS应用程序池回收或启用多个exe程序时,多进程可能出现同时操作文本数据库的情况,这里我也思考了良久,怎么去控制?

最后我想出来的方式是:进程在准备更改文本时,读取文本最后修改时间进行比对,进而达到一种相对控制。

 

总结:

 

个人觉得解决完上面的问题之后,基本简单的文本数据库也成型了,当然你也可以往上继续追求。

不过文本数据库,折腾的太复杂也没必要,毕竟文本数据库,还是以简单为主。

如果NoSql会流行,何不让文本数据库也在.net界也出出风头,成长成.Net界的一朵奇葩!

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/08/08/2130502.html

相关文章
|
3月前
|
开发框架 算法 Java
.NET 开发:实现高效能的秘诀
【7月更文挑战第4天】探索.NET高效开发涉及理解运行时(如GC、JIT)、代码与算法优化及工具利用。关键点包括适应性垃圾回收、异步编程、明智的并发控制;编写高效代码(避免对象创建,选对数据结构和算法);使用性能分析工具,善用高性能框架如ASP.NET Core,并借助云服务和CI/CD流程持续优化。性能优化是持续学习与实践的过程。
40 1
|
5月前
|
算法 Java 编译器
【专栏】.NET 开发:实现高效能的秘诀
【4月更文挑战第29天】本文探讨了提升.NET应用性能的三个方面:理解.NET运行时(垃圾回收、JIT编译器、异步编程和线程并发)、优化代码与算法(代码细节、数据结构选择和算法效率)以及利用工具和框架(性能分析工具、高性能库和CI/CD流程)。通过深入学习、合理设计和有效工具,开发者可实现.NET应用的高效能。
32 0
|
Cloud Native 安全 .NET
.NET 诞生 20 周年纪念日!微软发文庆祝
.NET 诞生 20 周年纪念日!微软发文庆祝
122 0
.NET 诞生 20 周年纪念日!微软发文庆祝
|
Windows
艾伟:.Net架构网站又一传奇:PlentyOfFish.com
这个叫PlentyOfFish的网站,  它只有一个员工,每天只干两小时活,但是却被估值$1000000000。 PlentyOfFish在山姆大叔家里算是一个很火的online dating网站,网站取名字来自这句话:There is plenty of fish in the sea. 对应的中文意思是“天涯何处无芳草”。
1499 0
|
容器
Silverli“.NET研究”ght开发廋身攻略(二)
  继上一篇《Silverlight开发廋身攻略(一)》,在上一节中我主要介绍了在实际开发中怎么动态加载图片资源的方法,并附有实例。在这一节中主要给大家介绍MEF(Managed Extensibility Framework)的知识来实现Xap包的动态加载。
1104 0
|
Android开发 iOS开发 开发者
“.NET研究”移动开发者生态实录:在失败与成功的天平上
  移动开发者当然不是这两年才出现的角色,但是个人开发者和小型团队开发者通过开发应用程序盈利却是在最近两年移动互联网尘嚣日上之后才出现的。在靠卖License作为主要盈利模式的传统“大”软件行业,不管中小型开发者如何优秀,都不太可能在与微软、Sun、CA等大型软件公司的较量中赢得胜算。
1321 0
|
Java Unix Linux
艾伟_转载:关于.NET VS JavaEE平台争论的沉思录
  最近关于.NET和java平台之间的争论似乎又热起来了,就我关注的两个社区,先是老赵的《为啥老赵不喜欢Java*语言*》。引发了博客园的大讨论,最近csdn又有人发博.Net与J2EE的快餐型比较,引发了空前的大讨论。
1225 0
|
UED
Silverlight开发廋身攻略(“.NET研究”一)
  相信大家在用Silverlight做应用开发时,随着项目的进展系统功能越来越多,肯定为Xap包越来越大而烦恼,Xap包的大小直接影响应用程序的加载速度,给用户造成不良的用户体验。我也曾为这个问题头痛过,经过在网上查阅资料和项目实践发现可通过以下三种方式给Silverlight应用程廋身。
941 0
|
.NET Java Python
一起谈.NET技术,谈谈微软技术,以及对待技术应有的态度
  昨晚在家上网,看看微软研究院TechFest 2010的消息,逛逛Channel 9,瞅瞅DevLabs里的项目,以及F#与Reactive Framework之类东西。然而,我一边对那些有趣而奇妙的技术感叹不已,同时却又产生出一种忿忿之情。
973 0
艾伟:[你必须知道的.NET] 开篇有益
本系列文章导航 [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.
1209 0