Redis 提供了多种删除策略(也称为过期策略),用于管理存储在内存中的键值对。这些策略主要涉及如何处理设置了过期时间的键。以下是 Redis 中常见的几种删除策略:
1. 惰性删除(Lazy Deletion)
- 在访问某个键时,Redis 会检查该键是否已经过期。如果过期,则删除该键并返回
nil
。 - 优点:不会频繁遍历所有键,仅在实际访问时进行检查和删除。
- 缺点:可能导致一些过期的键长期存在于数据库中,如果不被访问,无法及时释放内存。
2. 定期删除(Periodic Deletion)
- Redis 定时执行任务,每隔一定时间(通常是 100 毫秒)随机抽取一部分设置了过期时间的键进行检查,并删除那些已过期的键。
- 优点:可以在一定程度上清理未被访问但已经过期的键,有效降低内存使用率。
- 缺点:这种方式无法保证完全清理所有过期数据,可能会有少量的“幽灵”数据存在。
3. 主动删除(Active Expiration)
- Redis 的每个数据库都维护一个定时器,这个定时器周期性地扫描数据库中的一些随机样本以查找并移除已过期的元素。
- 和定期删除相似,但强调的是 Redis 对每个数据库实施独立管理。
4. 最大内存限制与逐出策略
当 Redis 达到设定的最大内存限制时,可以采用不同的逐出策略来决定哪些数据会被移除。这包括:
- noeviction: 不再接受写入请求,直到有足够空间可用;只有读取请求能够正常返回。
- allkeys-lru: 从所有 key 中选择最近最少使用 (LRU) 的 key 删除,以腾出空间。
- volatile-lru: 从设置了过期时间(volatile)的 key 中选择最近最少使用 (LRU) 的 key 删除,以腾出空间。
- allkeys-random: 随机选择一个 key 删除,从所有 key 中移除,适用于需要高可用性的场景。
- volatile-random: 随机选择一个设置了 TTL 的 key 删除,仅从带有有效期限的数据中选择。
总结
Redis 提供了一系列灵活且高效的数据清理策略,使开发者能够根据需求合理管理内存和性能。在使用过程中,应根据具体业务场景和资源约束,选用合适的清理和淘汰策略,以确保应用性能与用户体验之间的平衡。
内容由零声教学AI助手提供,问题来源于学员提问