简体   繁体   中英

Sinatra Synchrony with Redis connection pooling

Is this the correct way of handling Redis connection pooling with Sinatra Synchrony ?

My gemfile looks like this:

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

The sinatra server files use the classic style approach, and generally look like so:

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

I then launch multiple instances of the same server application, each under a different port, and use nginx to load balance between them.

Is this the proper solution for connection pooling Redis with Sinatra servers?

Here is a working example, I removed sinatra/sinatra because I don't feel it is needed and I couldn't make it works:

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

And run it with (in the same folder):

bundle
bundle exec thin start

In a real application you would remove the application code from the config.ru file and add a require but at least it gives you a start :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM