我正在开展一个包含5个子项目的大型企业项目 - 被认为是一个单独的应用程序。简单来说,两个是提供数据的API,另外三个使用它们并与用户交互。它们不共享相同的缓存。 API主要是缓存查询和解析/转换的XML,而消费者主要缓存API调用和用户相关数据。
每个API项目都有5个环境,每个消费者有4个环境。 2 * 5 + 3 * 4 = 22个环境。
目前所有这些服务都使用单独的memcached服务(所以22)。
我们考虑/计划迁移到Redis作为缓存平台,我们正在考虑Redis Cluster,但我们也希望有一个良好的数据分离。对于每个项目/环境,拥有22个集群似乎不是正确的选择。
有哪些替代方案?
答案 0 :(得分:3)
您只能设置一个redis群集,并使用不同的密钥前缀来隔离不同项目的密钥,即。为每个项目创建一个名称空间。
例如,第一个API项目的第一个环境的所有键都有一个键前缀:api1:env1:
(例如api1:env1:key1
,api1:env1:key2
);第二个API项目的第二个环境的所有键都有一个键前缀:api2:env2:
(例如api2:env2:key1
,api2:env2:key2
);对于第一个消费者的第一个环境的所有密钥都有一个密钥前缀:con1:env1:
,依此类推。
通过这种方式,不同项目的不同环境的所有数据都可以保存在一个redis集群中。
答案 1 :(得分:1)
如果您需要数据隔离并希望单个实例来处理它,那么Redis对您来说不是一个可行的解决方案。
Redis"数据库"之间没有强制隔离。因为任何应用程序都可以使用select
命令切换到另一个。此外,所有持久性都保存在同一个文件中,因此您将失去有限的命名空间和持久性。
除了数据隔离之外,还无法确保应用A无法影响应用B.任何数据库上发布flushall
都会破坏服务器上的所有数据。相反,一个应用程序可能会消耗所有可用内存,导致其他应用程序失去写入能力。更进一步,任何一个应用程序都可以锁定整个Redis服务器。
如果你有多个应用程序没有他们意外相互影响的风险,并且想要使用Redis,你将需要专用的实例,最好每个都有不同的密码。
这种类型的设置并不复杂,并且不需要群集,但对于SO来说却是偏离主题的。与基本上编写大量中间件来尝试在应用程序和Redis之间创建所有各种各样的微不足道的内容相比,这将要少得多。