1

有两个流行的 gem 可以将命名空间添加到 redis:redis-namespaceNest,如果我真的理解当我们将相同的 redis 实例服务器与不同的项目一起使用时我们需要命名空间,如果我是对的,这意味着:如果我有项目- 1和project-2以及这些项目中的每一个都使用我的本地redis存储,那么也许这两个项目有一个代表我的应用程序用户的用户密钥,所以为了防止冲突我需要使用类似项目名称的名称命名用户密钥

对于项目 1:

project-1:users

对于项目 1

project-2:users

如果我上面的理解没有错,我们可以redis-namespace gem这样解决:

r = Redis::Namespace.new(:project-1, :redis => @r)
r['users']['joe']['email'] = 'joe@example.com'

而对于第二个项目(project-2),只需在实例化新的 Redis::Namespace 时将 project-1 更改为 project-2 :

 r = Redis::Namespace.new(:project-2, :redis => @r)
 r['users']['joe']['email'] = 'joe@example.com'

请告诉我,如果我在上述所有这些解释中没有错!

我们现在可以继续 Nest :

文档中我们有这个例子:

Nest 通过提供已连接到 Redis 的可链接命名空间来帮助您生成密钥:

>> event = Nest.new("event")
>> event[3][:attendees].sadd("Albert")
>> event[3][:attendees].smembers
=> ["Albert"]

但在这里我不确定 Nest 是否帮助我们做与 redis-namespace 相同的事情,或者帮助我们生成一个可链接的键???

redis-namespace 和 Nest 之间到底有什么区别?

4

2 回答 2

1

免责声明:我是 Nest 的作者。

您可以使用这两个库完成相同的操作,我认为这些工具之间的主要区别在于它们的内部复杂性。虽然 Nest 仅帮助您使用平面键表示结构,但 Redis::Namespace 为每个命令都有一个转换表,因此它更脆弱且 CPU 密集型。

查看这两个工具的源代码以了解我的意思:

https://github.com/soveran/nest/blob/master/lib/nest.rb

https://github.com/resque/redis-namespace/blob/master/lib/redis/namespace.rb

也就是说,您描述的问题的正确解决方案是为不同的项目使用单独的 Redis 实例。考虑到键空间只是要考虑的一个方面(这也可以通过 Redis 提供的不同数据库轻松解决)。其他方面(持久性策略、连接和内存限制、密钥驱逐等)通常根据项目的性质进行微调。

另一个重要的事实是 Redis 是单线程的,许多应用程序都在使用它,你需要为所有请求共享同一个核心。考虑到这一点,拥有不同的 Redis 实例可以帮助您并行化工作。

于 2013-09-02T11:18:51.643 回答
0

您知道http://redis.io/commands/select在一台服务器上并行运行多个数据库吗?在这里,您没有密钥冲突,并且数据库是分开的。仅当您一次访问所有数据库中的密钥时,这是不可能的。

于 2013-09-01T18:19:56.027 回答