过期数据结构
expires 指向一个dict, dict内部存放每个键的过期时间。
过期键删除策略
定时删除
每次 expire的时候创建一个定时器,通过定时器来删除
- 优点
- 键会尽可能快速的被回收,节省内存
- 缺点
- 优点
- 对cpu友好,不会花费额外的时间去处理过期键
- 缺点
- 对内存不友好,如果不被访问永远不会删除
定期删除
每过一段时间就对数据做一次删除,控制删除的量。
中和策略。但是不能准确的过期。
redis过期策略
惰性删除和定期删除
- 定时删除是由一个timer来执行12345678void aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;while (!eventLoop->stop) {if (eventLoop->beforesleep != NULL)eventLoop->beforesleep(eventLoop);aeProcessEvents(eventLoop, AE_ALL_EVENTS);}}
aof & rdb 复制功能对过期键的处理
- 从服务器一律不处理,主一律处理
- 从服务器不处理惰性过期,等待主服务器的过期信息(expiredIfNeeded 中的源代码)12345678/* If we are running in the context of a slave, return ASAP:* the slave key expiration is controlled by the master that will* send us synthesized DEL operations for expired keys.** Still we try to return the right information to the caller,* that is, 0 if we think the key should be still valid, 1 if* we think the key is expired at this time. */if (server.masterhost != NULL) return now > when;