这是使用Sinatra Synchrony处理Redis连接池的正确方法吗?
我的gemfile看起来像这样:
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服务器连接池的正确解决方案吗?
答案 0 :(得分:4)
这是一个工作示例,我删除了sinatra / sinatra因为我觉得不需要它而且我无法使它工作:
的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,但至少它会给您一个开始:)