Redis是一款高效的K-V数据库,本文主要是对redis中淘汰数据的机制进行一个简单的介绍。在redis中淘汰数据有俩种,一种是过期淘汰,另外一种是基于LRU淘汰算法的数据淘汰。
因为最近项目需要,打算实现一个简单的LRU算法缓存,来用作服务器中缓存最新访问的图片。初期想造轮子的时候感觉还是挺简单的,但是后来细想发现需要考虑的东西还是很多的:
不知如何实现,那就看已有轮子是如何造的,所以抽时间看了一下redis中lru。下面就给一个简单的记录。在讲解redis的缓存淘汰之前,先简单提一下redis的事件库—ae。
ae一个非常小巧而又精巧的事件库,它可以处理文件、定时俩种事件。细节和原理就不说了,发现km上有很多介绍的。
ae事件库是在main函数的最后进入,当然在进入ae事件库之前很多初始化工作已经做好。比如读取配置文件、创建定时事件、创建文件事件、初始化系统等。进入事件库即调用aeMain方法之后,就在该方法中一直循环处理各种事件,直到退出。在aeMain方法中可以看到每次循环会首先执行beforeSleep方法,然后调用aeProcessEvents处理定时事件和文件事件。
如下代码:
int main(int argc, char **argv)
{
//other code
//init all kinds of things
aeSetBeforeSleepProc(server.el,beforeSleep);
aeMain(server.el);
aeDeleteEventLoop(server.el);
return 0;
}
void aeMain(aeEventLoop *eventLoop)
{
eventLoop->stop = 0;
while (!eventLoop->stop)
{
if (eventLoop->beforesleep != NULL)
eventLoop->beforesleep(eventLoop);
aeProcessEvents(eventLoop, AE_ALL_EVENTS);
}
}
如上代码所示,每次循环都会调用beforesleep,该方法会执行下面几个操作
淘汰过期数据的触发除此之外还在定时事件中会被触发,定时事件的回调方法serverCron->databasesCron。该方法会被定期调用,主要执行了以下几个操作
俩个入口都会调用同样一个方法activeExpireCycle(int type),根据type来决定是快速执行还是慢速执行淘汰。在beforesleep方法中是快速的执行淘汰数据,而在databasesCron是慢速执行。快速简单理解就是需要快速执行完还要考虑上次执行的情况,来决定方法是否要直接返回。
LRU会在每次执行命令的时候进行检查,当发现超过了最大可用内存的时候就会执行释放内存的操作。
processCommond->freeMemoryIfNeeded
下一篇文章《Redis 缓存淘汰机制 -LRU 淘汰》就对过期淘汰数据和基于lru的淘汰机制进行详细的介绍。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。