2012-01-13 15 views
3

これは、Redis接続プールをSinatra Synchronyで処理する正しい方法ですか?Sinatra Synchrony with Redis接続プール

マイgemfileは次のようになります。

gem 'sinatra-synchrony' 
gem 'hiredis' 
gem 'redis' 

シナトラサーバファイルは、古典的なスタイルのアプローチを使用し、一般的にそのように見える:

require 'sinatra' 
require 'sinatra/synchrony' 
require 'redis/connection/hiredis' 
require 'redis/connection/synchrony' 
require 'redis' 

redis = EventMachine::Synchrony::ConnectionPool.new(size: 5) do 
    Redis.new(path: '/tmp/redis.sock') 
end 

get/do 
    # lots of redis reads and writes 
end 

私は、同じサーバーアプリケーションの複数のインスタンスを起動しますそれぞれ別のポートの下にあり、nginxを使ってそれらの間の負荷を分散します。

これは、Sinatraサーバーとの接続プールRedisの適切なソリューションですか?ここで

答えて

4

は実施例である、私はそれが必要とされる感じていないと私はそれが動作させることができなかったので、私はシナトラ/シナトラを削除:

Gemfile:

source :rubygems 

gem 'thin' 
gem 'rack-fiber_pool' 
gem 'hiredis' 
gem 'sinatra' 
gem 'em-synchrony' 
gem 'redis' 

config.ru:

require 'rubygems' 
require 'bundler/setup' 
require 'sinatra/base' 
require 'redis/connection/synchrony' 
require 'redis' 
require 'rack/fiber_pool' 

class App < Sinatra::Base 

    set :template_path, '/tmp' 

    def initialize 
    super 
    @redis = EventMachine::Synchrony::ConnectionPool.new(size: 2) do 
     Redis.new 
    end 
    end 

    get '/' do 
    @redis.multi do |r| 
     r.set('v', "value2") 
     r.set('v2', '43') 
    end 

    @redis.get('v') 
    end 
end 

use Rack::FiberPool 
use Rack::CommonLogger 
run App 

と(同じフォルダ内)でそれを実行します。

bundle 
bundle exec thin start 

実際のアプリケーションでは、config.ruファイルからアプリケーションコードを削除してrequireを追加しますが、少なくとも起動すればよいでしょう:)

+0

このコードをお寄せいただきありがとうございます。 @ redis.multi {...}を熟読することはできませんが、それはちょうどハングアップします。私はそれが開始エンドのexecコマンドのための別の接続を使用するためだと思う... –

+0

私はマルチコールを追加するための例を更新したばかり、それは私のために完全に動作します。あなたが間違っていたのは、ブロックへの引数として渡された接続を使う必要があるということです。 – Schmurfy