当我们将redis与rails / ruby​​一起使用时,Nest和redis-namespace gems之间的平均差异是什么

有两个流行的gem用于向redis添加命名空间: redis-namespaceNest ,如果我真的理解我们需要命名空间,当我们使用相同的redis实例服务器和不同的项目时,如果我是对的,这意味着:如果我有项目 – 1和项目-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' 

对于第二个项目(项目-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之间究竟有什么区别?

免责声明:我是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提供的不同DB轻松解决)。 其他方面(持久性策略,连接和内存限制,关键驱逐等)通常根据项目的性质进行微调。

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

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