我们有一个多租户NodeJS应用程序,现在我们正在为我们的一些数据添加缓存层。
我们的目标是在redis package使用Redis缓存,我们正在尝试检查支持多租户的选项,并考虑两个要点:
到目前为止,我们的调查结果是我们可以为每个租户使用单独的Redis实例 - 这对我们来说不是一个好的解决方案。
我们发现的另一个选项是使用" tenant_id命名我们的键:"字首。 此选项解决了第一点 - 数据现在已得到保护,但我们仍有第二点需要解决。
我们在这一点上的用例是,一个租户可以提供大量数据来填充缓存并推出其他租户。数据。我们希望在租户级别定义LRU,即 - 当新数据添加到缓存时,它将仅驱逐相同租户的最近最近使用的数据。
有什么建议吗?
答案 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。
保持健康,最好!