Redis中过期key触发机制研究(redis 过期触发)
Redis是一个基于内存的高效非关系型NoSQL数据库,具有高并发,可扩展,快速读写等优点,因此应用较广泛。Redis提供了key-value存储,当value为字符串类型时,可以设置key的过期时间,以实现缓存过期自动清理。但是,当多个key同时过期时,是如何触发各个key的过期事件的呢?
Redis过期Key触发机制主要是基于定时任务来实现的。Redis会定期检查key是否过期,并执行相应的动作。具体来说,Redis在启动的时候会开启定时任务,每隔指定的时间(缺省默认毫秒)检查数据库中的所有key过期时间,在key过期时执行过期回调函数,其中过期回调函数会执行以下内容:
1.根据定时任务结束时被检查的键数量,调整首个被检查的键的过期时间,这样可以尽可能的缩短两次触发的时间间隔;
2.检查键的过期时间是否超过当前定时任务的时间间隔,如果已过期,则调用“expiredKey()”函数;
3.删除当前检查的key,并执行回调函数的处理逻辑;
4.根据“expiredKey()”函数的返回值,确定是否需要继续检查其他过期键,如果有,则继续触发回调函数;
5.如果有过期键,则重复 2-4 步,直到结束定时任务。
代码示例:
/**
* key过期回调函数 */
void expiredKey(char *key){ //处理过期回调逻辑
//删除过期key deleteKey(key);
//做计数,是否还有要处理的key haveKey--;
//返回是否需要继续检查 return haveKey;
}
/** * 定时任务
*/static void timerTask(void){
//首先调整首个被检查的键的过期时间 check.cur_index = adjustExpiredTime();
//遍历检查过期key for (i = check.cur_index; i
if (isExpired(key[i])){ //如果有过期key,则调用回调函数
if(expiredKey(key[i]) == true){ //如果iconKey返回true,则已没有要检查的key,跳出循环
break; }
} }
}
以上是Redis中过期Key触发机制的实现原理,它能高效的处理多个key的定时触发操作,能有效的降低Redis的内存使用,提高Redis的使用效率。