【问题标题】:Redis performance comparison: using TTL vs allkeys-lru policyRedis 性能比较:使用 TTL 与 allkeys-lru 策略
【发布时间】:2021-10-16 21:05:26
【问题描述】:

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

使用TTL,设置key的过期时间,会占用内存。

引用Redis.io:

还值得注意的是,为密钥设置过期时间会消耗内存, 所以使用像 allkeys-lru 这样的策略更节省内存,因为 无需为要驱逐的密钥设置过期时间 内存压力。

  1. TTL放在键上并让allkeys-lru策略处理真的是更有效吗?
  2. 在这种情况下没有任何权衡吗?例如,allkeys-lru 阻止写入操作直到它完成过期?如果此到期需要很长时间,那我就可以使用 TTL。

我很想讨论这个问题。感谢大家的意见!

【问题讨论】:

    标签: memory redis blocking ttl lru


    【解决方案1】:

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

    此外,在业务增长期间监控资源变得更加困难。

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

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

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

    【讨论】:

    • 此外,在 Redis-Streams 上,如果您每次收到新记录时都应用一个新的 EXPIRE 时间,这意味着您必须执行 2 个操作:XADD 和 EXPIRE。根据您的输入吞吐量,这可能会使您的持久化时间加倍。 (但 Redis 非常快,所以最好在决定之前做一些监控)
    • 感谢您的回答!作为优化,XADD 和 EXPIRE 可以在 1 个管道中完成,这将减少延迟。关于 LRU 很慢:您是说因为 LRU 策略会阻止写入,直到它为其内存驱逐足够的对象(因此您的写入操作需要更长的时间),而 EXPIRE 命令使其更快,因为 TTL 驱逐同时发生,导致您的写入操作需要更短的时间(但您为 TTL 花费了额外的内存)?我不明白 LRU 怎么这么慢。
    • 是的。与手动处理指针时 C++ 更快的原因相同。
    • 但同样,Redis 非常快。但是,执行多个命令涉及多个网络调用,这因项目而异。最好监控这是否对您的系统有影响。
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2023-03-14
    • 2020-11-08
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多