怎样自己实现一个数据库?

题叶
  • 17.3k

如果自己用 C, Go 之类静态语言实现一个数据库, 类似 MongoDB, Redis, 应该怎样做?
具体要考虑哪些问题, 需要用到哪些算法?

作为一个前端弱弱问一下...

回复
阅读 9.3k
9 个回答

你可以关注一下SSDB作者的博客:
http://www.ideawu.net/blog/ssdb
SSDB是一个比Redis存储能力更强的高性能多线程NoSQL数据库。

网络IO模型对比(转):
Memcached(libevent):多线程,epoll事件驱动.
Redis(aeEvent):单线程,epoll事件驱动.
SSDB(LevelDB引擎,epoll网络):多线程,epoll事件驱动.

SSDB新版本采用了多线程模型,避免写操作阻塞读操作:
1个主线程,负责网络IO.
10个读线程,负责像scan复杂操作读.
1个写线程,负责写操作磁盘IO.
1个leveldb的compact线程.
也就是set写操作时,一个主线程负责网络,一个写线程负责leveldb操作;而get读操作时只有主线程在工作.

文件读写+缓存+命中率+效率+安全

欢迎造轮子

Mongodb为例:

然后,你需要一个

  • 符合条件的IDE
  • 熟悉GIT

接着,可以开始造了

  • 简化第一次commit
  • 一步步往下走

当然,还需要有相应的数据库知识。。

可以先自己实现一个B+树...我觉得这就很够写了

内存管理。
键的查找的话,那就要好好先补树结构了。

熟悉编译原理。熟悉指针。比如词法分析器。语法分析。自动机等。简单的其实并不太难。数据结构要有些了解。

先留个问题反问你,为什么想起问这个问题?

开始… 想实现一套高性能的数据库系统,需要掌握的知识点基本是『操作系统』这门课的大部分章节+『数据结构』部分内容+『编译原理』部分内容。
具体如下:
『操作系统』
1 io处理及磁盘调度:高性能数据库往往不用操作系统自带的文件系统,而直接使用裸设备,采用aio.kio等方式提高读写性能。并且通过日志模式实现事务(实际上模仿现代日志型文件系统)
2 内存管理 为提高性能,数据库系统不能完全依赖宿主操作系统的内存管理能力。可能自己实现内存段页交换,及虚拟内存的实现
3 进程线程调度 高性能的重要因素之一,优良的进线程调度算法是数据库并发情况下性能的决定因素。
『数据结构』
主要涉及了 平衡二叉树,b树b+树方面内容。用于索引结构的维护。
『编译原理』涉及sql脚本语言解释器的编写

随手一些,估计有漏。

宣传栏