Redis过期策略
Redis 提供了设置过期时间的机制,通过 EXPIRE
、EXPIREAT
、PERSIST
等命令控制键值对的生命周期。
过期时间设置后,Redis 会根据以下策略来删除过期的键:
1. 定期删除(Periodic Deletion)
Redis 默认每隔 100 毫秒就会随机检查一些设置了过期时间的键,并检查它们是否已过期。
如果某个键已经过期,Redis 会主动删除它。
定期删除有助于保证过期的键能及时被清理,但这也意味着 Redis 需要定期扫描一部分键,并消耗一定的 CPU 资源,可能影响性能。
2. 惰性删除(Lazy Deletion)
当客户端访问一个键时,Redis 会检查该键是否已过期。
如果已过期,Redis 会删除这个键并释放内存。
惰性删除节省了 CPU 资源,但可能会导致过期的键仍然占用内存,直到该键被访问为止。
3. 结合使用:
Redis 默认同时开启定期删除和惰性删除策略,以确保:
定期删除:主动清理过期键,减少过期键占用的内存。
惰性删除:避免不必要的计算和资源消耗,仅当过期键被访问时才进行删除。
内存回收:
Redis 不会立即释放内存,而是将过期键标记为“已过期”并将其放入专门的链表中。当内存使用率达到一定阈值时,Redis 会进行内存回收,实际释放占用的内存。
这些被删除的键的内存会被操作系统标记为“可重用的内存”,但并不意味着这些内存会立即归还给操作系统,可能会在未来的内存分配中被重用。
过期时间设置与命令
EXPIRE:设置某个键的过期时间(秒)。
EXPIREAT:设置某个键的过期时间,过期时间为指定的时间戳。
PERSIST:移除键的过期时间,使键永不过期。
Redis是否立即删除过期键
过期键 并不会立即删除,而是采取定期删除和惰性删除的策略。
具体而言:
如果过期键没有被访问,可能会等到 Redis 定期删除任务触发时才会被删除。
如果过期键被访问,Redis 会在惰性删除过程中清除它。
因此,过期键的删除过程是延迟的,并不是即时发生的。