2015-09-13 56 views
2

因此,最近我將應用程序中的所有與會話相關的信息移至了redis。一切運行良好,現在我不面臨與cookie相關的問題(特別是來自IE)。使用全局資源連接到redis服務器的原因

在這樣做時,我讀了一些博客和所有的人都在配置中定義的Redis的連接器作爲一個全局變量像

$redis = Redis.new(:host => 'localhost', :port => 6379)

現在有一些竊聽我的幾件事情:

  1. 定義全局資源意味着我只有一個到redis的連接。當我必須提供多個請求時,它會在我的系統中造成瓶頸嗎?

  2. 同樣,當多個請求到達時,Rails會排隊請求redis,因爲連接是全局資源,萬一它已被使用?

  3. Redis支持多個實例。不會創建多個實例來提升性能?

+0

你解決了這個問題嗎? – Anatoly

回答

0

1)不,它不是一個瓶頸,爲每個查詢/請求打開TCP for Redis for perpomance。 3)是的,如果你有多個核心/線程。

+0

你能詳細說明泄漏嗎? – abhinavmsra

+0

首先你的系統需要打開TCP套接字,第二次連接並登錄到redis。而且foreach請求你應該反覆做這個。聽起來像是一大塊無用的工作。 –

1

Redis gem中沒有標準連接池。如果我們認爲Rails是一個單線程執行模型,那聽起來不會太麻煩。

在多線程環境中使用它可能是邪惡的(以背景作業爲例)。所以連接池一般來說是個好主意。

您可以使用connection_pool gem來實施Redis。

Sidekiq還使用此Gem連接到Redis。可以看到herehere。此外,sidekiq作者與connection_pool作者https://github.com/mperham是同一個人。

至於你的問題:

  1. 多個請求仍然不意味着多線程,所以這種方法可能使用線程之前正常工作;
  2. Rails不會爲您的數據庫發揮連接池的作用;
  3. 如果在多線程環境中使用,它將提高性能(並避免某些錯誤)。
+0

所以你同意連接池會有更好的性能? – abhinavmsra

+0

確定它會在某些情況下提高性能 – dimakura

0

只需測量Redis連接號,看看在處理每個Rails請求之前是否沒有實例化新連接。在應用程序加載過程中,在軌道處理器(Unicorn,Puma,Passenger等)上建立的連接端。

echo info | redis-cli | grep connected_clients 

嘗試在本地運行應用程序之前和期間運行bash命令。

相關問題