2014-02-07 21 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

相關問題