如何设计架构以在Redis中实现正确的数据分离,而不是生成数十个Redis实例并且能够扩展

时间:2016-10-18 13:51:58

标签: architecture redis

我正在开展一个包含5个子项目的大型企业项目 - 被认为是一个单独的应用程序。简单来说,两个是提供数据的API,另外三个使用它们并与用户交互。它们不共享相同的缓存。 API主要是缓存查询和解析/转换的XML,而消费者主要缓存API调用和用户相关数据。

每个API项目都有5个环境,每个消费者有4个环境。 2 * 5 + 3 * 4 = 22个环境。

目前所有这些服务都使用单独的memcached服务(所以22)。

我们考虑/计划迁移到Redis作为缓存平台,我们正在考虑Redis Cluster,但我们也希望有一个良好的数据分离。对于每个项目/环境,拥有22个集群似乎不是正确的选择。

有哪些替代方案?

2 个答案:

答案 0 :(得分:3)

您只能设置一个redis群集,并使用不同的密钥前缀来隔离不同项目的密钥,即。为每个项目创建一个名称空间。

例如,第一个API项目的第一个环境的所有键都有一个键前缀:api1:env1:(例如api1:env1:key1api1:env1:key2);第二个API项目的第二个环境的所有键都有一个键前缀:api2:env2:(例如api2:env2:key1api2:env2:key2);对于第一个消费者的第一个环境的所有密钥都有一个密钥前缀:con1:env1:,依此类推。

通过这种方式,不同项目的不同环境的所有数据都可以保存在一个redis集群中。

答案 1 :(得分:1)

如果您需要数据隔离并希望单个实例来处理它,那么Redis对您来说不是一个可行的解决方案。

Redis"数据库"之间没有强制隔离。因为任何应用程序都可以使用select命令切换到另一个。此外,所有持久性都保存在同一个文件中,因此您将失去有限的命名空间和持久性。

除了数据隔离之外,还无法确保应用A无法影响应用B.任何数据库上发布flushall都会破坏服务器上的所有数据。相反,一个应用程序可能会消耗所有可用内存,导致其他应用程序失去写入能力。更进一步,任何一个应用程序都可以锁定整个Redis服务器。

如果你有多个应用程序没有他们意外相互影响的风险,并且想要使用Redis,你将需要专用的实例,最好每个都有不同的密码。

这种类型的设置并不复杂,并且不需要群集,但对于SO来说却是偏离主题的。与基本上编写大量中间件来尝试在应用程序和Redis之间创建所有各种各样的微不足道的内容相比,这将要少得多。