我用两行代码实现了一个数据库!

Posted herongweiV

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我用两行代码实现了一个数据库!相关的知识,希望对你有一定的参考价值。

大家好,我是小贺。

今天给大家来看一个「骚操作 」

你知道最简单的数据库只需要几行代码吗?

只需要两行,一行读取,一行写入。

不信?

「Talk is cheap. Show me the code」

运行结果如下:

那么,这区区看起来没几行的代码,为什么能实现一个简单数据库呢?

是不是很神奇,其实原理很简单:

db_set 的操作是将数据追加到文件末尾,

db_get 的操作是先 grep 找到所有 key 的数据,然后再取最后一条数据(tail -n 1)作为结果。

顺便普及一波 shell 小知识

其中,grep “^$1” 表示匹配开头为 $1 的字符串,在 shell 脚本里里面 $+ 数字代码输入的参数占位符。

sed 是一个常见的处理文本文件的命令,可依照脚本的指令来处理、编辑文本文件。

其中 -e  选项 表示着以选项中指定的 script 来处理输入的文本文件。

sed -e "s/^$1,//" 表示着开启 s 匹配模式,也就是首行匹配,并且也是匹配开头 为$1且加逗号分割的 key,因为 db_set 存入的时候是按照逗号分割的。

扩展:其实呢,我们常用的 sed 匹配,是习惯于最后加一个 g;

+g:匹配每一行有行首到行尾的所有字符;

而不加 g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行。

因为我们这里只要匹配到每一行的 key 输出其对应的 value 就可以了,所以不用加 g。

再普及一波数据库的小知识

仔细思考一下,这个数据库逻辑是正确的,而且还是持久化的。

这个数据库原理虽然简单,但是其中 db_set 使用日志追加的方式写入数据。

的确,这种方式是很多数据库的常用方式,因为日志追加性能非常好。

相对的,db_get 的方式性能就比较差了,需要从头到尾扫描整个文件,查询的开销是 O(n)。

那为了提高读取的性能,我们需要用到索引,那么索引的原理是干嘛的呢?

其实索引的特点其实就是为了加快寻找数据的速度。

基本的原理就是通过保存额外的元数据,根据这些元数据作为路标来快速定位到想要的数据。

但是天下没有免费的午餐,维护索引需要在写入的时候额外写入其他数据,而这会影响写入的性能。

涉及到存储系统中重要的权衡设计:适当的索引可以加速读取,但是每个索引都会减慢写入的速度。

那数据库常见的索引类型你知道有几种吗?

那什么情况下该用什么模式的索引呢?

卖个关子,下次我们一起探讨吧。

好了,本周的唠嗑就到这里了。

今天,你学废了吗

我是小贺,每天进步一点点,我们下周见。

参考:

1、https://zhuanlan.zhihu.com/p/351897096 

2、《数据密集型应用系统设计》

·················END·················

你好,我是 herongwei,一个精神小伙&五道口程序猿,热爱编程,热爱生活,热爱分享,在平凡的人生中追求一点不平凡,欢迎关注,一起加油,点击下方名片,了解更多。

以上是关于我用两行代码实现了一个数据库!的主要内容,如果未能解决你的问题,请参考以下文章

教你用两行代码给PHP7添加一个“非空合并”语法糖

教你用两行代码给PHP7添加一个“非空合并”语法糖

用两行更改此自定义导航栏中的文本颜色?

太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!

太刺激了,面试官让我手写跳表,而我用两种实现方式吊打了TA!

树的各种遍历(c 语言实现)