2012-01-13 52 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