Redis设置键的生存时间使用EXPIRE命令,例如EXPIRE key seconds,单位是秒,还可以用PX key milliseconds毫秒,或者SET key value EX seconds直接设置带过期时间的值。过期删除有三种策略:删除定时删除、惰性删除和定期删除。定时删除每个键设置定时器,到期立即删除,消耗CPU但内存及时释放;惰性删除访问时检查过期再删除,节省CPU但可能内存浪费;定期删除默认每100ms随机采样检查过期键删除,平衡CPU和内存。
应用场景
缓存数据有过期时间,比如验证码、会话token、热点数据缓存,防止无限增长占用内存。购物车临时数据、活动限时商品信息等场景,确保数据自动清理。
实现机制详解
Redis键的TTL信息存储在键的元数据中,每个键都有一个expire字段记录绝对过期时间戳。EXPIRE key 3600设置键在3600秒后过期,内部转换为Unix时间戳。查询TTL用TTL key返回剩余秒数,-1表示无过期,-2表示已过期。
过期删除原理
定期删除:redisTimer线程每100ms执行activeExpireCycle函数,随机采样20个键,如果超过25%过期则继续采样最多16轮,否则睡眠50ms。惰性删除:在db.c的dbExpireIfNeeded函数中,GET/SET等命令访问键时先检查是否过期,如果过期调用propagateExpire并删除键。内存不足时主动触发删除。
设置生存时间示例
127.0.0.1:6379> SET key value OK 127.0.0.1:6379> EXPIRE key 60 (integer) 1 127.0.0.1:6379> TTL key (integer) 58 127.0.0.1:6379> SETEX key 60 newvalue OK 设置时直接带过期时间。
策略优缺点
定时删除:内存及时释放,但对定时器维护开销大,海量键时CPU负载高,不适合Redis。惰性删除:CPU友好,但大量过期键不访问会导致内存溢出。定期删除:综合方案,通过hz配置调整频率,Redis默认采用。
注意事项
过期键删除后不会立即释放内存,需要内存碎片整理。List、Set等数据结构元素不支持单独过期,只有整个键过期。持久化时过期键默认不保存,可用CONFIG SET save ''调整。
FAQ
Q: Redis如何查看键是否设置了过期时间?
A: 用TTL key,-1无过期,-2已过期,正数剩余秒。
Q: 定期删除频率怎么调整?
A: 通过CONFIG SET hz 10调整,值越大检查越频繁,CPU越高。
Q: 惰性删除什么时候触发?
A: 读写命令如GET、SET、HGET等访问键时检查。
Q: 大量过期键不访问怎么办?
A: 定期删除会采样清理,内存紧张时主动删除。