Redis 缓存淘汰机制

导语

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

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

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

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

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,该方法会执行下面几个操作

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

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

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

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

LRU淘汰入口

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

processCommond->freeMemoryIfNeeded

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

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

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

编辑于

我来说两句

3 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

每天必用的几个小命令

4047
来自专栏解Bug之路

MySql协议详解-HandShake握手篇

各位有没有对Cobar、MyCat这些MySqlProxy感到新奇。反正笔者在遇到这些proxy时,感受到其对代码的无侵入兴感到大为惊奇。于是走上了研究MySq...

582
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Iptables实现基本防火墙模板

实施防火墙是保护服务器的重要一步。其中很大一部分是在于对您的网络实施流量限制有决定性作用的个别规则和政策。防火墙iptables也允许您对应用规则的结构框架有发...

390
来自专栏运维小白

10.13 netfilter5表5链介绍

Linux防火墙—netfilter netfilter的5个表 filter表用于过滤包,最常用的表,有INPUT、FORWARD、OUTPUT三个链 nat...

1836
来自专栏技巅

Glusterfs之nfs模块源码分析(上)之nfs原理和协议

2016
来自专栏容器云生态

Linux安全之iptables详解

基本上,依据防火墙管理的范围,我们可以将防火墙区分为网域型与单一主机型的控管。在单一主机型的控管方面, 主要的防火墙有封包过滤型的 Netfilter 与依据...

2435
来自专栏北京马哥教育

sysctl.conf学习和调优

? 前言 记得第一次接触/etc/security/limits.conf和/etc/sysctl.conf时 是因为部署Oracle时要按需修改内核参数。l...

3897
来自专栏运维技术迷

Veeam Backup & Replication(二):添加虚拟化主机和配置备份存储

一、添加虚拟化主机 veeam可以添加单个ESXi主机,也可以添加vCenter服务器,因为做实验,就添加一台ESXI主机为例吧。 1.1 选择 Virtual...

38712
来自专栏bboysoul

AMH面板安装记录

AMH 是国内首个开源的主机面板,使用APL开源软件协议。 AMH5.3版本是收费的,4.2版本是免费的,所以今天我装的是免费的4.2

682
来自专栏乐沙弥的世界

基于Innobackupex的完全恢复

    对于MySQL的完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到故障点。这里的完全恢复是相对于时点恢复(也叫...

662

扫码关注云+社区