Redis中针对node.js的多租户

时间:2017-07-12 09:11:38

标签: node.js caching redis multi-tenant

我们有一个多租户NodeJS应用程序,现在我们正在为我们的一些数据添加缓存层。

我们的目标是在redis package使用Redis缓存,我们正在尝试检查支持多租户的选项,并考虑两个要点:

  1. 保护数据。
  2. 清除租户级别的旧数据。
  3. 到目前为止,我们的调查结果是我们可以为每个租户使用单独的Redis实例 - 这对我们来说不是一个好的解决方案。

    我们发现的另一个选项是使用" tenant_id命名我们的键:"字首。 此选项解决了第一点 - 数据现在已得到保护,但我们仍有第二点需要解决。

    我们在这一点上的用例是,一个租户可以提供大量数据来填充缓存并推出其他租户。数据。我们希望在租户级别定义LRU,即 - 当新数据添加到缓存时,它将仅驱逐相同租户的最近最近使用的数据。

    有什么建议吗?

3 个答案:

答案 0 :(得分:4)

虽然确实存在使用逻辑/编号/共享数据库的选项,但您应该避免这样做。您的数据库不仅会共享相同的配置,因为Redis是单线程的,每个租户都会(可能)干扰其他人的操作,并且(最坏的情况)会阻止他们。

您应该为每个租户使用专用 Redis流程。好消息是Redis非常轻量级,因此每个实例在资源方面的开销非常小。稍微不那么好的消息是,这种方法会使管理变得更加复杂。

如果您希望避免管理员痛苦,我建议您研究使用托管Redis产品的选项。根据您的提供商,有些允许创建多个专用实例,无需额外费用。

免责声明:我在Redis实验室工作,这是Redis的所在地和解决方案提供商,其中包括一个主管Redis,其行为与我上面描述的一样(为了这个目的)。

答案 1 :(得分:0)

您是否已调查为每个租户使用单独的Redis逻辑数据库?

您可以使用SELECT命令切换活动数据库,或者在连接到Redis实例时选择要使用的数据库(database-id):

redis://user:password@host:port/database-id

例如:

redis://user:password@localhost:6379/1

连接到逻辑数据库1。

答案 2 :(得分:0)

我偶然发现了一个相同的问题,并找到了一个很好的解决方案。 查看KeyDB(https://keydb.dev/),它是Redis分支,现在支持多线程。它与Redis完全兼容,后者是Redis的直接替代品。因此您无需更改任何代码。

在多租户方案中,我将其用作全文搜索提供程序。我的数据存储是MongoDB(对fts的支持较少);每个租户在KeyDB中都有一个哈希列表,用于存储所有关键字。然后,使用HSCAN来查询KeyDB(速度非常快)。然后,结果可以由MongoDB解决。由于KeyDB是非阻塞和多线程的,因此不需要复杂的部署解决方案。

是的,您可以使用Redis的现有nodejs库来访问KeyDB。

保持健康,最好!