Redis 的懒惰删除(lazy deletion)策略是一种内存管理技术,用于处理那些已经过期但还没有被客户端访问的数据。当 Redis 中的键设置了过期时间,并且这个时间已经过去时,键并不会立即从内存中移除。相反,Redis 会在下次尝试读取或写入该键时检查其是否已过期,如果已过期,则在实际执行命令前将其删除。
以下是懒惰删除策略的工作机制:
-
过期时间设置:
当你使用EXPIRE
或PEXPIRE
命令为一个键设置过期时间时,Redis 会将这个过期时间存储在一个单独的数据结构中。 -
定期删除:
尽管称为“懒惰”删除,Redis 还是有一个后台任务来主动清理过期键。这个过程被称为“定期删除”(active expiration)。它不是实时的,而是在每秒随机选择一定数量的数据库进行扫描,然后从中随机选取一定数量的键进行检查。如果发现有键过期了,就会立即将它们删除。这种做法可以减少 CPU 的负担,避免因大量过期键而导致性能下降。 -
惰性删除:
惰性删除发生在键被访问的时候。每当客户端试图对某个键执行操作时,Redis 都会先检查该键是否已经过期。如果过期了,那么 Redis 会删除这个键并返回空值或者错误信息给客户端,具体取决于执行的是什么类型的命令。 -
内存回收:
一旦键被确认过期并且被删除,Redis 会释放与该键相关的内存空间。这包括键名、键值以及相关联的所有数据结构所占用的空间。
懒惰删除的优点是减少了服务器的开销,因为不需要频繁地检查所有键的状态。但是,这也意味着过期键可能不会立刻从内存中清除,因此在某些情况下可能会导致内存使用量比预期要高一些。
为了进一步优化内存管理,Redis 还引入了其他机制,如 LRU(最近最少使用)淘汰算法和最大内存限制等,这些可以帮助 Redis 在面临内存压力时更有效地管理数据。