2014-02-07 20 views
2

我有一个Rails应用程序,我想连接到Redis数据结构服务器。我想知道我应该如何继续。我使用位于config/initializers/redis.rb的全局变量$redis在整个应用程序中进行查询。如何正确使用/插入Redis的Rails?

我相信这种方法不适用于具有80多个并发连接的应用程序,因为它使用一个全局变量来处理Redis连接。

我该怎么做才能解决这个问题?我错过了关于Rails内部的东西吗?

教程中,我下面 http://jimneath.org/2011/03/24/using-redis-with-ruby-on-rails.html

回答

3

这取决于你将使用应用程序服务器上。如果你使用的是Unicorn这是一个流行的选择,你应该没问题。

独角兽分叉它的工人,每个人将建立它自己的数据库连接。而且由于每个工作人员一次只能处理一个请求,所以一次只需要一个连接。添加更多连接不会提高性能,它只会打开更多(无用的)连接。

ActiveRecord(它是Rails的数据库部分)或DataMapper支持connection pooling这是解决您提到的问题的常见解决方案。在线程环境中连接池但是only make sense。最重要的是,Redis主要是单线程的(搜索“Redis的单线程性质”),因此无论如何可能没有任何优势。有an request to add connection pooling但它关闭了,你可能会从那里得到更多的信息。

+0

谢谢你的回答,我能够做一些研究并最终使用独角兽。尽管现在我与Unicorn有内存问题,但我知道Ruby不会将内存释放回操作系统,而是重新使用它,这对我来说是个大问题,因为每个叉Unicorn都会创建内存,因此消耗的内存与父级处理。上次我检查了我的应用程序的一个进程消耗+ 90mb,将该数乘以进程分叉的数量,并成为相当大的内存,同时,我在每次fork之后执行'GC.start'。 – yeyo

+0

@Kira你使用Ruby 2吗?如果不是[你应该(参见关于写复制的部分)](http://patshaughnessy.net/2012/3/23/why-you-should-be-excited-about-garbage-collection-in-ruby -2-0),我认为分叉后GC.start并不是很有用,但[独角兽的带外GC](http://blog.newrelic.com/2013/05/28/unicorn-rawk- kick-gc-out-of-the-band /)可能是。 –

+0

是的,我使用Ruby 2的原因与你说的相同,牛。虽然我并不知道“带外GC”,并且“GC.start”可能不是个好主意,这是你提供的一个美妙的链接。非常感谢,2个叫混乱。 – yeyo

相关问题