用NodeJS写一个数据库

广告位招租
扫码页面底部二维码联系

多年前我在用MySQL数据库时,始终没理【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。解innodb是什么意思,也就糊弄自己说本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。,那个东西就是一种存储数据的格式,多年后【本文首发于唐霜的博客】【本文受版权保护】我自己在写一个桌面应用时,想创建一个用来【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】存储数据的实体时,接触了sqlite,而本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】后再接触了leveldb,之所以要接触这未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net类东西,是因为我想要让自己的应用不需要依本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】赖用户机器上已经启动的其他数据库服务,而【本文首发于唐霜的博客】【版权所有,侵权必究】是把数据库本身随着应用部署到用户电脑上。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】而随着我对leveldb了解后,我逐渐意未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。识到,它就是和innodb一个层面的东西未经授权,禁止复制转载。【本文首发于唐霜的博客】,被称为“存储引擎”。

未经授权,禁止复制转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

从文件到引擎到最终的数据库,我们怎么才能【原创内容,转载请注明出处】未经授权,禁止复制转载。做一个自己的类似MySQL一样的数据库呢未经授权,禁止复制转载。【原创不易,请尊重版权】?本文我将讲解利用我们市面上已有的工具,【未经授权禁止转载】未经授权,禁止复制转载。用nodejs整合出一个自己的数据库。

本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】原创内容,盗版必究。【本文受版权保护】【本文首发于唐霜的博客】

数据库系统的架构【版权所有】唐霜 www.tangshuang.net

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

对于我们习惯了应用开发的开发者而言,很少原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】去考虑数据库的整体架构到底是怎样的。如果【本文受版权保护】著作权归作者所有,禁止商业用途转载。我们不理解数据库系统的整体架构,就没有办未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。法做出一个符合自己需求的数据库。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】原创内容,盗版必究。【转载请注明来源】转载请注明出处:www.tangshuang.net

我们常见的数据库有关系型数据库和NoSQ转载请注明出处:www.tangshuang.net【转载请注明来源】L数据库,此外还有其他类型的数据库,如时【版权所有】唐霜 www.tangshuang.net【本文受版权保护】序数据库、大数据数据库等等。这些数据库各【未经授权禁止转载】转载请注明出处:www.tangshuang.net有各的不同,但是在概念层面,总存在共通的原创内容,盗版必究。【本文首发于唐霜的博客】架构。

【关注微信公众号:wwwtangshuangnet】【转载请注明来源】转载请注明出处:www.tangshuang.net【作者:唐霜】

经过总结,我认为数据库系统的架构大致如下转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。,不一定全面,但是可以帮助我们理解数据库【原创不易,请尊重版权】【原创不易,请尊重版权】架构。

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【本文首发于唐霜的博客】

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net

在上述架构图中,处于最底层的,是引擎层,【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】我们可能会挑选市面上比较中意的存储引擎,【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。比如MySQL所选用的innodb,El【关注微信公众号:wwwtangshuangnet】【本文受版权保护】astic和Solr所选用的Apache原创内容,盗版必究。【版权所有,侵权必究】 Lucene等等。而存储引擎,很大程度本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。上决定了整个数据库的一些特性,甚至整个数转载请注明出处:www.tangshuang.net【版权所有,侵权必究】据库系统的设计都决定了我们是否应该采用该【未经授权禁止转载】本文作者:唐霜,转载请注明出处。引擎,而一旦确定了采用该引擎,就意味着后【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net续的很多开发工作都将被固定下来。基于引擎【作者:唐霜】【原创内容,转载请注明出处】和索引算法,设计一套适合该数据库的索引体【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】系,能够在将来的查询阶段提供非常高的性能著作权归作者所有,禁止商业用途转载。【本文受版权保护】,但是一般而言,索引的建立又会花掉性能。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net例如Elastic作为知名的全文搜索引擎【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。数据库,就在索引层面花了大量的设计。有些转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】引擎还设计了读写锁和事务,特别是写的时候【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。,因为大部分存储引擎都是基于文件的,所以本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。在写入文件时,就存在同时写入的问题,而通本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】过锁和事务,就可以有效控制数据错误问题。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。在这一层,我们要完成“存储单元->【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net存储集合+索引->存储库”的设计,【未经授权禁止转载】本文作者:唐霜,转载请注明出处。不管是“Column->Table【作者:唐霜】本文作者:唐霜,转载请注明出处。->Database”还是“Obj未经授权,禁止复制转载。未经授权,禁止复制转载。ect(key-value)->s转载请注明出处:www.tangshuang.net【版权所有,侵权必究】tore->database”,都【转载请注明来源】【本文受版权保护】需要在引擎层提前设计好。甚至,在某些数据转载请注明出处:www.tangshuang.net【转载请注明来源】库设计中,可以同时存在多个引擎,只要封装【版权所有】唐霜 www.tangshuang.net【转载请注明来源】的好,不同引擎之间还可以相互交互。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。

在进行更进一步设计之前,我们要知道,不同【转载请注明来源】本文版权归作者所有,未经授权不得转载。的数据库,针对的场景不同,除了通用的关系【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。型数据库之外,还有其他场景下的数据库,例【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net如专门用于存储日志的数据库、专门用于大数本文版权归作者所有,未经授权不得转载。【本文受版权保护】据分析的数据库、专门用于流程处理的数据库【转载请注明来源】【未经授权禁止转载】等等。因此,在引擎层的上方,我们看到有一转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。层叫“领域分析”,主要负责对数据应用的场【本文受版权保护】【版权所有】唐霜 www.tangshuang.net景进行分析,以更清楚自己的设计需求。只有【本文首发于唐霜的博客】【作者:唐霜】搞清楚自己的需求之后,我们才能知道,我们原创内容,盗版必究。原创内容,盗版必究。是否存在有多进程的需求,是否需要需要提供未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netC/S架构的服务层,如果都不需要,只是简【本文首发于唐霜的博客】【原创不易,请尊重版权】单的存取数据,那么我们的数据库设计就到此【本文首发于唐霜的博客】【本文受版权保护】结束了,直接用封装好的引擎接口就可以了,本文作者:唐霜,转载请注明出处。【未经授权禁止转载】比如我们在一个手机端app中用来存取用户【未经授权禁止转载】转载请注明出处:www.tangshuang.net在app中进行的内容创作等等,我们可能只【原创内容,转载请注明出处】【本文受版权保护】需要用到sqlite的封装即可,不需要再【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net往上走了。但是,假如我们需要考虑多进程或【作者:唐霜】未经授权,禁止复制转载。多线程或多用户的问题,就需要继续往上。

【作者:唐霜】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

我们都知道,如果基于存储引擎进行数据存取【版权所有,侵权必究】【版权所有,侵权必究】,就会存在一个争抢资源的问题,比如用户A【关注微信公众号:wwwtangshuangnet】【作者:唐霜】需要写入一条数据的同时,用户B也需要写入著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,此时,就存在一个争抢。而为了避免这种情【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。况发生,存储引擎一般都会做一个设计,即只【作者:唐霜】原创内容,盗版必究。允许在单一线程中打开自己,并通过一个PI【本文受版权保护】本文作者:唐霜,转载请注明出处。D文件记录打开自己的线程,再通过事务机制【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】来控制写入顺序。但是,正是这一看上去合理著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。的设计,导致我们在面对多用户读写时,由于【作者:唐霜】【版权所有】唐霜 www.tangshuang.net单个用户的访问往往都是独立一个进程来执行【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。,因此,我们需要做一个架构层面的设计,来原创内容,盗版必究。未经授权,禁止复制转载。达到这个目标,这个架构就是我们常说的C/转载请注明出处:www.tangshuang.net【未经授权禁止转载】S架构。我们在Server端用一个进程来【作者:唐霜】转载请注明出处:www.tangshuang.net负责数据的读写,而不同的用户通过Clie【未经授权禁止转载】原创内容,盗版必究。nt端向Server发送消息,所有读写都【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。交给Server端统一处理,从而达到可多【原创不易,请尊重版权】【本文首发于唐霜的博客】用户同时读写数据的效果。至于查询语言(如本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.netSQL等),统一在Server端完成执行【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。,当然,我们可以把SQL的解析等放到Cl【作者:唐霜】【版权所有,侵权必究】ient端,从而减少服务端的运算压力。C著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】/S架构也好,B/S架构也好,我们都会发本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】现,服务端需要强大的机器性能,才能支撑我【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。们的某些需求。

【转载请注明来源】【本文受版权保护】【原创内容,转载请注明出处】【版权所有,侵权必究】

在服务端之上,我们还会提供更多的能力,这未经授权,禁止复制转载。原创内容,盗版必究。些能力本质上不属于数据库本身,但是却对数【本文受版权保护】【本文首发于唐霜的博客】据库的管理有非常大的帮助,例如日志和缓存【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。。数据库管理系统则是可以提供用户和权限,原创内容,盗版必究。【未经授权禁止转载】以及提供可用户数据本身的管理的可视化页面【本文受版权保护】本文作者:唐霜,转载请注明出处。,甚至像Kibana还提供了统计分析的能【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】力。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

前面讲,C/S架构也好,BS架构也罢,我【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】们的瓶颈在Server端,而通过应用层,【转载请注明来源】【原创不易,请尊重版权】我们可以对数据库做更上层的架构设计,通过本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】云计算的能力,把数据库从底到顶都实现一遍本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net优化,以确保数据库的吞吐能力,以及安全风本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。险的管理等等。

本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。

我们在市面上见过很多非常知名的数据库,例【原创内容,转载请注明出处】【本文首发于唐霜的博客】如MySQL、PostgreSQL、Or【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netacle、Mongodb、redis、E转载请注明出处:www.tangshuang.net【作者:唐霜】S(本质上算引擎)、clickhouse【本文受版权保护】【关注微信公众号:wwwtangshuangnet】等等,同时,在不同公司内部也会自己设计和著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。实现数据库,例如华为的GaussDB、F【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。acebook的TiDB、中兴的Gold【本文受版权保护】本文作者:唐霜,转载请注明出处。enDB等等。这些数据库有的规模非常宏大【转载请注明来源】原创内容,盗版必究。,单无外乎都是上述的架构模式。

【原创内容,转载请注明出处】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。

LevelDB引擎【版权所有,侵权必究】

未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

几年前我研究indexedDB时不断阅读原创内容,盗版必究。【转载请注明来源】标准文档,作为国内比较早深入研究该库的开【原创不易,请尊重版权】未经授权,禁止复制转载。发者之一,在阅读标准文档时发现它的设计非【关注微信公众号:wwwtangshuangnet】【本文受版权保护】常有意思,之后无意之间知道它的底层是基于原创内容,盗版必究。转载请注明出处:www.tangshuang.netleveldb实现的,随后我就对leve【本文首发于唐霜的博客】【未经授权禁止转载】ldb非常痴迷。虽然作为前端开发者,我并著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。没有太多兴趣去阅读leveldb的源码,转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。但是谷歌的这一小巧的数据引擎,让我觉得可【本文受版权保护】【关注微信公众号:wwwtangshuangnet】以用它做不少应用的存储工具。

【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【版权所有,侵权必究】【作者:唐霜】

简单讲,LevelDB在很多领域被应用,【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net我们前端开发最熟悉的就是indexedD【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】B、localStorage等等,fac未经授权,禁止复制转载。【作者:唐霜】ebook从leveldb的源码fork【未经授权禁止转载】【本文首发于唐霜的博客】了一份经过优化后发布了rocksdb,并【原创内容,转载请注明出处】【作者:唐霜】基于它发布了TiDB(后面更换了引擎)。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。我之所以关注它,是因为它让我接触了存储引【转载请注明来源】著作权归作者所有,禁止商业用途转载。擎这一比较底层的概念,我以前只了解比较上【转载请注明来源】本文版权归作者所有,未经授权不得转载。层的数据库,很少有认真思考它的底层数据最【本文首发于唐霜的博客】未经授权,禁止复制转载。终落地为文件时,是如何去存储的,而通过对【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。leveldb原理进行了解后,逐渐明白,【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。原来最终一个数据库存储的数据,不是纯粹的【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。把数据序列化之后生成一个文件的buffe【本文受版权保护】本文作者:唐霜,转载请注明出处。r,而是有多个层面的架构设计,最终文件系本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net统里面的文件,也不是纯粹的序列化buff【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.neter而已。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】

正如其名,leveldb的特征正在于它的本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。分层设计,更细节的可以阅读其他博主的介绍未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】,我可能不能讲的很详细,总之,基于它的分【原创内容,转载请注明出处】原创内容,盗版必究。层设计,leveldb在读写上有 不错的【作者:唐霜】本文作者:唐霜,转载请注明出处。表现。把它作为我们应用的数据存储工具,是【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】一个不错的选择。

【本文首发于唐霜的博客】未经授权,禁止复制转载。【原创内容,转载请注明出处】

同时,leveldb提供了nodejs的【转载请注明来源】未经授权,禁止复制转载。封装,在它的封装中,包括leveldow【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】n、levelup、和其他封装。其中,我【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】们常用的是levelup,它提供了统一的原创内容,盗版必究。转载请注明出处:www.tangshuang.net抽象接口,这些统一抽象接口即是我们更换底本文作者:唐霜,转载请注明出处。原创内容,盗版必究。层的存储引擎,在其他包中导出时,也是拥有【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net同样的API。用这些nodejs的包,我【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】们可以做出不错的技术选型,然而,要真正构【本文受版权保护】【本文首发于唐霜的博客】建起数据库,还是不大够。

著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

用NodeJS写一个数据库本文版权归作者所有,未经授权不得转载。

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】

LevelDB提供了最简单的封装,包含了【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】基础的kv存储、锁,并且levelup实【转载请注明来源】【作者:唐霜】现了类似事务的封装,不需要开发者主动去调转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。用存储的open和close。但是,一个【未经授权禁止转载】【版权所有,侵权必究】LevelDB实例,只提供一个kv的st【作者:唐霜】转载请注明出处:www.tangshuang.netore,且只能存储字符串或buffer类【版权所有,侵权必究】转载请注明出处:www.tangshuang.net型的值。我们需要一层一层的封装出自己的数著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】据库。

本文作者:唐霜,转载请注明出处。【作者:唐霜】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

引擎接口封装【原创不易,请尊重版权】

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

在引擎层,我们需要做两件事,一是支持传入【未经授权禁止转载】【版权所有,侵权必究】普通的object,我们自己序列化之后再本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。存入到库中;二是需要支持索引。其中,索引未经授权,禁止复制转载。【未经授权禁止转载】部分,我们再创建一个store来存储索引【转载请注明来源】转载请注明出处:www.tangshuang.net。索引的算法和数据结构有很多种,我们从B【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】/B+树、二叉树、Hash表等算法中挑选【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】一个,既然leveldb本身就是kv,那原创内容,盗版必究。【原创不易,请尊重版权】么我们就用Hash表吧。

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。
class Store {
  constrcutor(options: { rootPath: string }) {
    this.options = options;
    
    // TODO 实例化LevelDB,创建一个用于存储数据,另外一个存储索引
  }
  
  query(params) {
    // 查询数据
  }

  put(data) {
    // 写入数据
  }
}

我们创建一个Store的概念,一个Sto【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】re里面就包含了存储的数据和索引,并且在【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】内部实现了索引的算法。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】

有了Store之后,多个Store放在一【作者:唐霜】原创内容,盗版必究。起,就是一个Database的概念了。稍未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。后,我们在服务端,可以实现创建和管理Da【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。tabase的能力。

原创内容,盗版必究。【本文受版权保护】【版权所有,侵权必究】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

服务端著作权归作者所有,禁止商业用途转载。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【作者:唐霜】【未经授权禁止转载】

实现C/S架构的S端,我们使用dgram【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net模块启用一个UDP来运行服务,监听来自客【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。户端的请求。同时,在服务端,我们要实现库本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】的创建和管理能力,日志、缓存和数据库管理【本文受版权保护】未经授权,禁止复制转载。都需要实现。

著作权归作者所有,禁止商业用途转载。【转载请注明来源】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

不过,我们为了让这个数据库轻便一些,我们【转载请注明来源】未经授权,禁止复制转载。并没有把它设计为多database的,而著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。是单database单store的,也就著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net是说,它就像localStorage一样【版权所有,侵权必究】原创内容,盗版必究。,整个应用只有一个kv模型。因此,我们不【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。需要完整实现库的创建和管理,只需要通过服转载请注明出处:www.tangshuang.net【版权所有,侵权必究】务,能让我们的库在server端拥有读写【未经授权禁止转载】【原创不易,请尊重版权】能力即可。

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net原创内容,盗版必究。【版权所有,侵权必究】
class Server {
  constrcutor(options: { db: Store, port: number, host: string }) {
  }

  start() {
    const socket = dgram.createSocket('udp4');
    socket.on('message', () => {
      // TODO
    });
    socket.bind(this.options.port, this.options.host);

    this.socket = socket;
  }

  stop() {
    this.socket.close();
    this.socket = null;
  }
}

使用UDP的好处,一方面可以拥有更好的性未经授权,禁止复制转载。【作者:唐霜】能,另一方面可以服用TCP的端口。

【未经授权禁止转载】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。

最后,我们写一个脚本,让服务跑起来:著作权归作者所有,禁止商业用途转载。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】原创内容,盗版必究。
const { port, ROOT } = require('./config');
const Server = require('./cs/server');
const Store = require('./db/store');
const path = require('path');

const rootPath = path.resolve(ROOT, 'db');
const db = new Store({ rootPath });

const server = new Server({
    port,
    db,
});

server.start();

接下来,我们用pm2将这个服务启动起来,【关注微信公众号:wwwtangshuangnet】【本文受版权保护】那么,一个正在运行的数据库服务端就跑起来【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。了。

【本文受版权保护】【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

客户端【版权所有】唐霜 www.tangshuang.net

【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】

既然服务端已经起来了,那么,接下来,我们【作者:唐霜】【原创不易,请尊重版权】就是连接到服务端,完成操作信息的发送和接原创内容,盗版必究。【转载请注明来源】收就可以了。基于dgram来访问UDP服【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。务也是非常方便的:

【未经授权禁止转载】【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。
class Client {
  constrcutor(options: { port: number, host: string }) {
     const socket = dgram.createSocket('udp4');
     socket.on('message', (e, address) => {
       // TODO 检查是否为对应port发来的消息
     });
  }

  // TODO
}

一旦我们有了客户端封装程序,我们就只需要本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】在我们的应用中,使用该封装,这样就可以连未经授权,禁止复制转载。原创内容,盗版必究。接到服务端,完成数据的操作了。而且,由于【本文首发于唐霜的博客】未经授权,禁止复制转载。我们在服务端实现了各种设计,可以保证高效【原创内容,转载请注明出处】未经授权,禁止复制转载。的请求吞吐和数据的准确读写。

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【原创内容,转载请注明出处】【未经授权禁止转载】

结语【原创不易,请尊重版权】

【未经授权禁止转载】【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

本文的重点在于梳理一个数据库系统的常见架【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net构,再基于这个架构,用nodejs和le【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】veldb实现一个我们自己的数据库。当然著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】,要让数据库稳定运行,且能够支撑庞大的用【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。户请求,还需要应用层面的架构,例如做一些【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】主从设计,甚至分布式集群设计等等。虽然本【本文受版权保护】【关注微信公众号:wwwtangshuangnet】文的内容非常简单,但是通过这一介绍,让我【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net们也能在数据库的设计中,有了一定的基础了【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】解。

【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

2023-07-02 4591

为价值买单,打赏一杯咖啡

本文价值45.91RMB