如果自己用 C, Go 之类静态语言实现一个数据库, 类似 MongoDB, Redis, 应该怎样做?
具体要考虑哪些问题, 需要用到哪些算法?
作为一个前端弱弱问一下...
熟悉编译原理。熟悉指针。比如词法分析器。语法分析。自动机等。简单的其实并不太难。数据结构要有些了解。
知道一个大神写的blog提到了部分
http://lifegoo.pluskid.org/?p=137
http://lifegoo.pluskid.org/?p=128
http://lifegoo.pluskid.org/?p=117
可以先自己实现一个B+树...我觉得这就很够写了
欢迎造轮子
。
以Mongodb
为例:
- 找到最开始的commit,即https://github.com/mongodb/mongo/commits/master?page=855
- 然后试着看看下面的代码https://github.com/mongodb/mongo/tree/e73188b5512c82290a4070af4afddac2...
- 在第二次commit中,你可以看到兼容linux: https://github.com/mongodb/mongo/tree/9e1541367984bcc5fd9a8c709b311ef3...
- 。。。
然后,你需要一个
- 符合条件的IDE
- 熟悉GIT
接着,可以开始造了
- 简化第一次commit
- 一步步往下走
当然,还需要有相应的数据库知识。。
内存管理。
键的查找的话,那就要好好先补树结构了。
你可以关注一下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读操作时只有主线程在工作.
文件读写+缓存+命中率+效率+安全
从实现哈希表或者b+树开始吧,我的shmdb就是实现了哈希表数据结构,https://github.com/yunnysunny/shmdb/wiki/struct
先留个问题反问你,为什么想起问这个问题?
开始… 想实现一套高性能的数据库系统,需要掌握的知识点基本是『操作系统』这门课的大部分章节+『数据结构』部分内容+『编译原理』部分内容。
具体如下:
『操作系统』
1 io处理及磁盘调度:高性能数据库往往不用操作系统自带的文件系统,而直接使用裸设备,采用aio.kio等方式提高读写性能。并且通过日志模式实现事务(实际上模仿现代日志型文件系统)
2 内存管理 为提高性能,数据库系统不能完全依赖宿主操作系统的内存管理能力。可能自己实现内存段页交换,及虚拟内存的实现
3 进程线程调度 高性能的重要因素之一,优良的进线程调度算法是数据库并发情况下性能的决定因素。
『数据结构』
主要涉及了 平衡二叉树,b树b+树方面内容。用于索引结构的维护。
『编译原理』涉及sql脚本语言解释器的编写
随手一些,估计有漏。