美文网首页我说技术程序员
Redis之key过期定时器实现

Redis之key过期定时器实现

作者: yongsean | 来源:发表于2016-05-22 15:58 被阅读3286次

用Redis时,有用到EXPIRE、PEXPIRE、SETEX之类命令去设置key的过期时间。从2.8版开始还可以去做简单的定时器服务。
原先也没太具体去了解Redis的过期实现方式,但心中总觉得有块石头没放下,于是乎开3.0的源码去翻看了。
过期策略有3种:立即过期、定时过期、访问过期(惰性过期)。但看了源码后,发现Redis并没采用立即过期的策略,而是采用 定时过期访问过期 混合方式。使用立即过期的话,Linux环境下在Redis进程里会有很多timerfd,在几十万个Key这种数量级开始,对cpu是很大的负担。

redis.h

在redis.h文件里有redisDb结构体

typedef struct redisDb {
  dict *dict;
  dict *expires;
  ......
}

expires这属性是存放当前db有过期时间的键,使用hash数据结构。

定期删除策略

代码在redis.c的activeExpireCycle函数,需要传个type参数,用以区分是用“快速模式”还是“正常模式”。
在“正常模式”下,会遍历每一个编号下的库,然后最多随机获取20个带过期时间的key(20是宏ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP的默认值),倘若key太多则直接return了。接着调用redis.c/activeExpireCycleTryExpire函数尝试去删除它,能删除成功则再发送expired的pub通知给订阅者即可。定期删除的定时时长是100ms。

惰性过期

代码分布在所有读写命令里,如SET、GET、TTL、SADD、HGET...等。每次调用这些命令的实际执行前,都会调用db.c/expireIfNeeded函数来删除过期键,在删除之前,也会发送expired的pub通知。

EXPIRE/PEXPIRE/SETEX的作用?

这几个命令的真正作用是设置过期时间,如EXPIRE命令的处理在db.c/expireCommand开始,然后将过期时间单位从秒转换成毫秒,接着判断是否存在从节点,最后传播删除了的expired key(pub del)。在主节点则设置过期时间,是在宏代码里去设置值(联合体结构),最后在pub expire的通知。

后记

redis是单线程的,但个人觉得在pub方面可以用另一条线程去处理。

相关文章

  • Redis之key过期定时器实现

    用Redis时,有用到EXPIRE、PEXPIRE、SETEX之类命令去设置key的过期时间。从2.8版开始还可以...

  • 2019-12-31

    如何去解决Redis过期以及策略? 定时删除 含义:在设置key的过期时间的同时,为该key创建一个定时器,让...

  • Redis的 过期策略 和 淘汰策略

    过期策略 定时过期(主动淘汰),Redis未使用每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清...

  • key的过期策略

    3种过期策略 定时删除含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临...

  • Redis的过期策略和内存淘汰机制

    定时删除 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key...

  • redis 分布式锁

    redis 分布式锁 实现命令是 setnx key true expire key 5 5秒后过期del k...

  • 过期机制

    一.定时删除含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对ke...

  • redis key过期策略和淘汰策略

    redis集群key分类 redis集群中的key统分为两类,分别是设置了过期时间的key和未设置过期时间的key...

  • redis系列之淘汰删除

    redis可以针对key设置过期时间,如果到了过期时间,redis是如何让其失效呢?redis提供了两种让key过...

  • Redis过期策略与超出物理内存淘汰策略

    Redis过期策略 概述 Redis所有的数据结构都可以设置过期时间。Redis会将每个设置了过期时间的key放入...

网友评论

    本文标题:Redis之key过期定时器实现

    本文链接:https://www.haomeiwen.com/subject/vpiorttx.html