前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis 缓存淘汰机制

Redis 缓存淘汰机制

原创
作者头像
赵威
修改2017-06-19 18:58:32
2.8K3
修改2017-06-19 18:58:32
举报
文章被收录于专栏:赵威的专栏赵威的专栏

导语

Redis是一款高效的K-V数据库,本文主要是对redis中淘汰数据的机制进行一个简单的介绍。在redis中淘汰数据有俩种,一种是过期淘汰,另外一种是基于LRU淘汰算法的数据淘汰。

因为最近项目需要,打算实现一个简单的LRU算法缓存,来用作服务器中缓存最新访问的图片。初期想造轮子的时候感觉还是挺简单的,但是后来细想发现需要考虑的东西还是很多的:

  • 多线程访问
  • 淘汰时机
  • 淘汰机制

不知如何实现,那就看已有轮子是如何造的,所以抽时间看了一下redis中lru。下面就给一个简单的记录。在讲解redis的缓存淘汰之前,先简单提一下redis的事件库—ae。

ae事件库

ae一个非常小巧而又精巧的事件库,它可以处理文件、定时俩种事件。细节和原理就不说了,发现km上有很多介绍的。

ae事件库是在main函数的最后进入,当然在进入ae事件库之前很多初始化工作已经做好。比如读取配置文件、创建定时事件、创建文件事件、初始化系统等。进入事件库即调用aeMain方法之后,就在该方法中一直循环处理各种事件,直到退出。在aeMain方法中可以看到每次循环会首先执行beforeSleep方法,然后调用aeProcessEvents处理定时事件和文件事件。

如下代码:

代码语言:javascript
复制
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,该方法会执行下面几个操作

  • 触发淘汰过期数据
  • 处理一些和客户端相应的操作
  • 处理aof

淘汰过期数据的触发除此之外还在定时事件中会被触发,定时事件的回调方法serverCron->databasesCron。该方法会被定期调用,主要执行了以下几个操作

  • 触发淘汰过期数据
  • rehash redis数据库
  • resizing数据库

俩个入口都会调用同样一个方法activeExpireCycle(int type),根据type来决定是快速执行还是慢速执行淘汰。在beforesleep方法中是快速的执行淘汰数据,而在databasesCron是慢速执行。快速简单理解就是需要快速执行完还要考虑上次执行的情况,来决定方法是否要直接返回。

LRU淘汰入口

LRU会在每次执行命令的时候进行检查,当发现超过了最大可用内存的时候就会执行释放内存的操作。

processCommond->freeMemoryIfNeeded

下一篇文章《Redis 缓存淘汰机制 -LRU 淘汰》就对过期淘汰数据和基于lru的淘汰机制进行详细的介绍。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导语
  • ae事件库
  • 过期淘汰入口
  • LRU淘汰入口
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档