int expireIfNeeded(redisDb *db, robj *key) {// 判断键是否过期if (!keyIsExpired(db,key)) return 0;if (server.masterhost !&#61; NULL) return 1;/* 删除过期键 */// 增加过期键个数server.stat_expiredkeys&#43;&#43;;// 传播键过期的消息propagateExpire(db,key,server.lazyfree_lazy_expire);notifyKeyspaceEvent(NOTIFY_EXPIRED,"expired",key,db->id);// server.lazyfree_lazy_expire 为 1 表示异步删除&#xff08;懒空间释放&#xff09;&#xff0c;反之同步删除return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :dbSyncDelete(db,key); } // 判断键是否过期 int keyIsExpired(redisDb *db, robj *key) {mstime_t when &#61; getExpire(db,key);if (when <0) return 0; /* No expire for this key *//* Don&#39;t expire anything while loading. It will be done later. */if (server.loading) return 0;mstime_t now &#61; server.lua_caller ? server.lua_time_start : mstime();return now > when; } // 获取键的过期时间 long long getExpire(redisDb *db, robj *key) {dictEntry *de;/* No expire? return ASAP */if (dictSize(db->expires) &#61;&#61; 0 ||(de &#61; dictFind(db->expires,key->ptr)) &#61;&#61; NULL) return -1;/* The entry was found in the expire dict, this means it should also* be present in the main dict (safety check). */serverAssertWithInfo(NULL,key,dictFind(db->dict,key->ptr) !&#61; NULL);return dictGetSignedIntegerVal(de); }