2012-01-13 74 views
3

這是處理Redis連接池與Sinatra Synchrony的正確方法嗎?Sinatra與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在它們之間進行負載平衡。

這是將Redis和Sinatra服務器連接在一起的合適解決方案嗎?

回答

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文件刪除應用程序代碼,並添加一個需要,但至少它給你一個開始:)

+0

感謝這一段代碼,但是它有很大的缺點 - 我不能理解@ redis.multi {...},它只是掛起。我認爲這是由於使用不同的連接來啓動端執行命令... – 2012-03-10 11:25:37

+0

我剛剛更新了示例以添加多個呼叫,它對我來說非常適合。你可能做錯了,你需要使用連接作爲參數傳遞給塊。 – Schmurfy 2012-03-12 15:14:08