Redis的过期策略主要是通过定时任务和惰性删除相结合的方式来管理键的生命周期。
- 定时任务:Redis 会定期遍历一部分键,检查其是否过期,并删除过期键。
- 惰性删除:当一个键被访问(GET/SET)时,Redis 会检查它是否过期,如果过期就删除它。
// 伪代码示例:Redis 过期策略的核心函数
// 定时任务处理函数
void activeExpireCycle(void) {
// 遍历数据库中的键,检查是否过期
for (int i = 0; i < db->dict->size; i++) {
dictEntry *de = dictGetRandomKey(db->dict);
if (de) {
dictEntry *expired = dbExpireIfNeeded(de);
if (expired) {
// 删除过期键
deleteExpired(expired);
}
}
}
}
// 检查键是否过期,如果过期返回1,否则返回0
int checkIfExpired(dictEntry *de) {
// 检查键的过期时间
if (de->expire) {
if (mstime() > de->expire) {
return 1;
}
}
return 0;
}
// 惰性删除
void lazyExpire(dictEntry *de) {
if (checkIfExpired(de)) {
// 键过期,从数据库中删除
deleteKey(db, de);
}
}
注意:以上代码仅为示例,实际的 Redis 代码实现会更加复杂,包括对时间和资源的精细管理。