缘起
临近毕业大部分事情处理的差不多,只想安静的看点东西,思考一下。找来了redis源码配合《Redis设计与实现》看了一下。大概浏览了一遍,看到main函数的最后其实就是aeMain()当中的一个大循环,对这个大循环有些兴趣。这不由得让我想起之前了一部分的Linux Kernel代码,Kernel源码最后其实也是一个大的循环,根据进程调度算法选择进程运行,模式还是比较相似。当然,Kernel源代码肯定要比这个复杂 ^_^
写下这篇博文也算是对学习过程的一个记录和思考。
对NoSQL的接触
在接触redis之前,最初接触到的比较成熟NoSQL是叫做Tokyo Cabinet的一套Key-Value存储(在这之前看过国人写的一个叫做Hash DB的Key-Value)。之前也看过它当中的hashdb的实现,Tokyo Cabinet与redis不同之处就是Tokyo Cabinet是一个持久化的Key-Value存储,每个db都会对应一个磁盘上持久化的文件。
继续本文正题。^_^
redis.c中的大循环
从下面的代码可以看到redis最后其实就是一个大的循环。只要redis服务不停止就不断调用beforeSleep()和aeProcessEvents()函数。
//redis.c
int main()
{
//................
aeSetBeforeSleepProc(server.el,beforeSleep);
aeMain(server.el);
aeDeleteEventLoop(server.el);
return 0;
}
//ae.c
void aeMain(aeEventLoop *eventLoop) {
eventLoop->stop = 0;
while (!eventLoop->stop) {
if (eventLoop->beforesleep != NULL)