方式一:懒惰删除(Lazy Deletion)
思路:
只有在读缓存(Get)或写缓存(Set)时,才检查这个 key 是否过期,如果过期就直接删除并返回“miss”。
优点:
简单,不需要额外的后台任务。
适合低访问量或访问频率不高的场景。
缺点:
可能导致过期数据长期占用内存(除非访问它)。
方式二:定时任务(Periodic Cleanup)
思路:
定期(比如每 1 分钟)扫描所有缓存项,删除已过期的项。
优点:
过期数据可以被及时清理,避免占用内存。
适合数据量大但访问不均匀的场景。
缺点:
需要额外的线程或定时器。
如果数据量非常大,可能造成一次性 CPU 峰值。
方式三:基于最小堆(Heap)或优先队列
思路:
将所有缓存项按照过期时间排序(通常用最小堆),堆顶永远是最近要过期的 key。然后启动一个定时器等到最近的过期时间到期,再批量删除。
优点:
实时性高,过期数据可以准时清理。
适合对过期严格要求的场景(例如 API Token、短周期任务)。
缺点:
实现复杂,需要并发安全的优先队列。
对于大量数据,维护堆的开销比较大。
大部分生产环境(如 Redis)其实是 TTL + 懒惰删除 + 定时清理的组合。
|