Redis 性能比较:使用 TTL 与 allkeys-lru 策略

Redis performance comparison: using TTL vs allkeys-lru policy

在 Redis 中,使用 allkeys-lru 删除键,无论它是否是过期设置键。

使用 TTL,为密钥设置过期时间,占用内存。

引用自Redis.io

It is also worth noting that setting an expire to a key costs memory, so using a policy like allkeys-lru is more memory efficient since there is no need to set an expire for the key to be evicted under memory pressure.

  1. 整体上不是真的更有效率在钥匙上放一个TTL然后让allkeys-lru政策处理了吗?
  2. 在这种情况下没有任何权衡吗?例如,allkeys-lru 是否会阻止写操作 直到它完成到期?如果这个过期要持续很长时间,那会让我使用 TTL。

我很乐意讨论这个问题。感谢大家的参与!

allkeys-lru 由 Redis 分配的内存限制触发。这是避免 Redis 完全崩溃的一项安全功能。 如果你只依赖 allkeys-lru 来清理你的数据,那么你的 Redis 将 运行 变慢,因为任何操作都必须应用于更大的数据库。并且您的 Redis 数据库将始终处于最大大小。

此外,这也会让您在业务增长过程中更难监控您的资源。

在您的值上使用 TTL 更像是一个基于您的用例的技术决定。它使您可以更好地控制不再需要的事件。 TTL 使用更多内存,因为它必须为每条记录存储 TTL 值,这是有道理的。

对于 Redis-Streams,您可以使用 MAXLEN 属性 来避免流过大,特别是当您不需要旧数据时。此 属性 是针对每个流的,因此它不会增加 Redis 内存那么多。 Redis-streams 是按流(按键)而不是按记录过期的。因此,如果您不断收到新数据,则不可能基于 TTL/record 使来自 Streams 的旧记录过期。

主要结论:尽可能使用 TTL 和 MAXLEN 来更快地清理不必要的数据,这样 Redis 就不需要一次完成所有操作,您将可以更好地控制数据和资源。