【问题标题】:Redis: using two instances or just one (caching and storage)?Redis:使用两个实例还是只使用一个(缓存和存储)?
【发布时间】:2015-11-07 09:25:09
【问题描述】:

我们需要对API 的请求进行速率限制。我们有很多 Web 服务器,并且应该在所有服务器之间共享速率限制。此外,速率限制需要一定数量的临时存储(我们希望将用户配额存储一段时间)。

我们有一个很棒的速率限制实现,它通过使用SETEX 与 Redis 一起工作。在这个用例中,我们还需要将 Redis 用作存储(在短时间内,根据 SETEX 调用上设置的过期时间)。此外,缓存需要在所有服务器之间共享,我们无法在每个 Web 服务器上使用诸如内存缓存之类的东西来处理速率限制,因为速率限制是针对每个用户的 - 所以我们希望有为此目的消耗了大量内存。所以这个过程是 Redis 集群的一个很好的用例。

问题是 - 执行速率限制的同一台 Web 服务器也有一些其他缓存需求。它从DB 获取一些东西,然后将结果缓存在两层中:首先,在内存中LRU-cache(在实际服务器上),第二层再次是 Redis - 这次仅用作缓存(无存储)。如果该项目从内存中的LRU-cache 中被逐出,它会被传递并保存在 Redis 中(这样即使在内存中发生缓存未命中,由于 Redis 的存在,仍然会有缓存命中) .

我们是否应该为两种需求使用相同的 Redis 实例(一方面需要存储的速率限制器,另一方面不需要缓存层)?我想我们可以使用一个包含存储的 Redis 实例(不是仅缓存选项),然后将其用于两种需求?在性能方面,我们的每台服务器与两个 Redis 实例通信会更好吗?一个用作仅缓存,另一个还具有存储选项?

【问题讨论】:

  • 推荐分而治之 - 更好的性能和更容易扩展。
  • 由于任务完全不同,我会选择两个不同且独立的 redis 服务器/集群。
  • 您需要多大的缓存/存储空间?

标签: caching redis


【解决方案1】:

我始终建议将您的设置划分为不同的数据角色。将它们结合起来听起来很整洁,但在实践中可能会很痛苦。在您的情况下,您有两个不同的“数据角色”:缓存数据和存储数据。这是两个主要的区别类别,这意味着使用两个不同的实例。

在您的特定情况下,当出现问题或需要升级时,从操作的角度来看,将它们隔离会更容易。您将避免混合服务,以免缓存问题导致“存储”层出现问题 - 或反之亦然。

Redis 的使用趋向于扩展到更多领域。如果您现在养成使用专用 Redis 端点的习惯,那么将来您将能够更好地增加使用量,而不是在事情变得有点困难时不得不重构和重组。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2013-08-11
    • 2016-09-04
    • 2018-02-27
    • 2018-09-05
    • 2022-07-12
    相关资源
    最近更新 更多