Ruby Sinatra与Redis连接池的同步

Ruby Sinatra与Redis连接池的同步,ruby,sinatra,redis,connection-pooling,eventmachine,Ruby,Sinatra,Redis,Connection Pooling,Eventmachine,这是处理Redis连接池的正确方法吗 我的文件如下所示: gem 'sinatra-synchrony' gem 'hiredis' gem 'redis' sinatra服务器文件使用经典风格的方法,通常如下所示: require 'sinatra' require 'sinatra/synchrony' require 'redis/connection/hiredis' require 'redis/connection/synchrony' require 'redis' redis

这是处理Redis连接池的正确方法吗

我的文件如下所示:

gem 'sinatra-synchrony'
gem 'hiredis'
gem 'redis'
sinatra服务器文件使用经典风格的方法,通常如下所示:

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服务器的正确解决方案吗?

下面是一个工作示例,我删除了Sinatra/Sinatra,因为我觉得不需要它,也无法使它工作:

档案:

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

在实际的应用程序中,您可以从config.ru文件中删除应用程序代码并添加require,但至少它给了您一个开始:)

感谢这段代码,但它有一个主要缺陷-我不能muse@redis.multi{…},它只是挂起了。我认为这是因为对start-end-exec命令使用了不同的连接……我刚刚更新了示例,添加了一个multi-call,它对我来说非常适合。您可能做错了,您需要使用作为块参数传递的连接。
bundle
bundle exec thin start