文本存储,这是一个自己以前大少去实践具体运用的园地。

 

怎会说自文本数据库,从上篇:秋色园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界的平等枚奇葩!

 

相关文章

网站地图xml地图