问题 具有多个项目的开发机器上的Redis数据库


当一些项目使用Redis数据库时,如何管理开发和/或测试机器上的多个项目?

有两个主要问题:

  1. Redis没有命名数据库(仅限0-16)
  2. 测试很可能在每次运行时执行FLUSHDB

现在,我认为我们有三种选择:

  1. 为每个项目,每个开发和测试环境分配不同的数据库
  2. 带有项目名称的前缀键使用类似的东西 redis-namespace
  3. 只要在项目之间切换,就可以对数据库进行Nuke和种子化

如果多个项目为主要用途分配“0”而对于测试等分配“1”则第一个是有问题的。即使项目B决定改为“2”和“3”,项目中的另一名成员也可能在另一个项目中与他发生冲突。换句话说,这种方法不是SCM友好的。

对于第二个,这只是一个坏主意,因为它在运行时性能和内存效率上增加了不必要的开销。无论你做什么,当你加入这个项目时,另一个项目可能已经巧合地使用了相同的密钥。

第三种选择是妥协的产物,但有时我希望在为其他项目部署小补丁时保持本地数据不变。

我知道这可能是Redis的功能请求,但我现在需要一个解决方案。

任何想法,做法?


7329
2018-02-28 22:35


起源



答案:


如果项目是独立的,因此不需要共享数据,那么使用多个redis实例要好得多 - 每个项目配置都有一个端口号而不是数据库名/ id。为每个创建一个适当命名的配置文件和启动脚本,这样您只需单击一下即可获得所需的任何实例。

确保更新每个配置文件中的保存设置以及设置端口 - 使用相同dump.rdb文件的多个实例将起作用,但会导致一些相当混乱的错误。

我还使用单独的实例进行开发和测试,以便测试实例永远不会将任何内容写入磁盘,并且可以在每次测试开始时刷新。


15
2018-03-01 02:31





Redis正在远离多个数据库,因此我建议您尽快开始迁移该机制。这意味着每个db一个实例。鉴于运行Redis的开销非常低,从资源的角度来看,这不是问题。

也就是说,您可以指定数据库的数量,并提供A命名标准。例如,将redis配置为60 DBS,并为测试数据库添加10。例如,db3使用db13进行测试。

听起来你的开发,测试和产品环境非常紧密。如果是这样,我建议远离那个。使用单独的实例是最简单的方法,并提供针对交叉污染的保护。在这个和未来的redis之间是每个实例的单数据库,单独的实例是最佳路由。


0
2018-05-31 05:21



我不同意多个实例的开销很低。端口号是开发机器上最有限的资源之一,可用性取决于环境,因此无法修复并为团队中的其他人放入git。这意味着即使设计师也必须了解环境变量的工作原理。 - kenn
例如,我有像库 github.com/kenn/redis-mutex 在那里,它使用db15进行测试,这样它就不会意外地踩到贡献者的真实数据。 - kenn
当然,技术上有可用的端口数量有限。但是你真的认为你将在一个开发系统上拥有大约64,000个实例吗?实际上,如果每个实例使用1Mb内存,则需要在具有64Gb RAM的系统上。我也会担心开发人员不了解环境变量。您在github上的示例项目会丢弃我的几个数据库。您根本无法假设给定的数据库编号是“您的”,并且开发人员将不会使用您选择的数据库编号。 - The Real Bill
如果您确实希望实际达到端口限制,请记住仅适用于系统使用的每个IP地址。您可以使用多个IP地址和多个端口。实际情况是可用端口在CPU,内存和I / O之后会很好地耗尽。也就是说,我建议您重新审视一些基本假设。期望开发人员知道redis服务器的名称,但不能期望理解环境变量或端口号?我敢打赌你的开发者比那更聪明。 - The Real Bill
我在谈论认知开销,而不是物理可用性。除6379以外选择哪个端口号?除此之外的任何事情都过于武断,并且需要知道什么堆栈使用什么数字等。相比之下,看看config / database.yml,git中的硬编码“my_project_development”已被证明对任何人来说都不那么矛盾和容易。 - kenn


答案:


如果项目是独立的,因此不需要共享数据,那么使用多个redis实例要好得多 - 每个项目配置都有一个端口号而不是数据库名/ id。为每个创建一个适当命名的配置文件和启动脚本,这样您只需单击一下即可获得所需的任何实例。

确保更新每个配置文件中的保存设置以及设置端口 - 使用相同dump.rdb文件的多个实例将起作用,但会导致一些相当混乱的错误。

我还使用单独的实例进行开发和测试,以便测试实例永远不会将任何内容写入磁盘,并且可以在每次测试开始时刷新。


15
2018-03-01 02:31





Redis正在远离多个数据库,因此我建议您尽快开始迁移该机制。这意味着每个db一个实例。鉴于运行Redis的开销非常低,从资源的角度来看,这不是问题。

也就是说,您可以指定数据库的数量,并提供A命名标准。例如,将redis配置为60 DBS,并为测试数据库添加10。例如,db3使用db13进行测试。

听起来你的开发,测试和产品环境非常紧密。如果是这样,我建议远离那个。使用单独的实例是最简单的方法,并提供针对交叉污染的保护。在这个和未来的redis之间是每个实例的单数据库,单独的实例是最佳路由。


0
2018-05-31 05:21



我不同意多个实例的开销很低。端口号是开发机器上最有限的资源之一,可用性取决于环境,因此无法修复并为团队中的其他人放入git。这意味着即使设计师也必须了解环境变量的工作原理。 - kenn
例如,我有像库 github.com/kenn/redis-mutex 在那里,它使用db15进行测试,这样它就不会意外地踩到贡献者的真实数据。 - kenn
当然,技术上有可用的端口数量有限。但是你真的认为你将在一个开发系统上拥有大约64,000个实例吗?实际上,如果每个实例使用1Mb内存,则需要在具有64Gb RAM的系统上。我也会担心开发人员不了解环境变量。您在github上的示例项目会丢弃我的几个数据库。您根本无法假设给定的数据库编号是“您的”,并且开发人员将不会使用您选择的数据库编号。 - The Real Bill
如果您确实希望实际达到端口限制,请记住仅适用于系统使用的每个IP地址。您可以使用多个IP地址和多个端口。实际情况是可用端口在CPU,内存和I / O之后会很好地耗尽。也就是说,我建议您重新审视一些基本假设。期望开发人员知道redis服务器的名称,但不能期望理解环境变量或端口号?我敢打赌你的开发者比那更聪明。 - The Real Bill
我在谈论认知开销,而不是物理可用性。除6379以外选择哪个端口号?除此之外的任何事情都过于武断,并且需要知道什么堆栈使用什么数字等。相比之下,看看config / database.yml,git中的硬编码“my_project_development”已被证明对任何人来说都不那么矛盾和容易。 - kenn