《Redis源码学习笔记》键过期
《Redis源码学习笔记》文章列表
Redis可以为数据库中的每一个键关联一个过期时间,当到达指定时间后Redis就会把该键从数据库中删除,eg:
redis 127.0.0.1:6379> setex name 5 diaocow # 为键name设置5秒的过期时间OKredis 127.0.0.1:6379> 5 秒后...redis 127.0.0.1:6379> get name # 键过期被删除,返回nil(nil)
def expireIfNeeded(key)# 获取该键的过期时间 when_msec = redisDb.expires.get(key) # 该键没有关联任何过期时间 if when_msec is None: return False # 未过期 if now_msec < when_msec: return False # 已经过期 redisDb.data.del(key) # 从数据库中删除该键 redisDb.expires.del(key) propagateExpire(key) # 把键过期消息同步给所有的slave节点(如果有必要) return True
def activeExpireCycle()# activeExpireCycle函数能够运行的时间限制 timelimit = THIS_FUNCTION_CAN_RUN_MS start_time = time.now() for dbnum in redisServer.dbs: # 随机从标号为dbnum的数据库中取出MAX_EXPIRELOOKUPS_PER_CRON个键,检测是否过期 for (i = 1; i < MAX_EXPIRELOOKUPS_PER_CRON; i++): if isKeyExpired(redisDbs[dbnum].expires.getRandomKey()): # 若过期,清理键 redisDbs[dbnum].data.del(key) redisDbs[dbnum].expires.del(key) propagateExpire(key) # 检测目前运行时间,若超过timelimit,则推出 if(time.now() - start_time >= timelimit): return