Предлагаемый драйвер Redis для использования в Голиаф? - PullRequest
3 голосов
/ 11 ноября 2011

Кажется, есть несколько вариантов установки соединений Redis для использования в EventMachine, и мне трудно понять основные различия между ними.

Моя цель - внедрить Redis в Голиаф

Теперь я могу установить соединение через em-synchrony :

require 'em-synchrony'
require 'em-synchrony/em-redis'

config['redis'] = EventMachine::Synchrony::ConnectionPool.new(:size => 20) do 
  EventMachine::Protocols::Redis.connect(:host => 'localhost', :port => 6379)
end 

В чем разница между приведенным выше и использованием чего-то вроде em-hiredis ?

Если я использую Redis для наборов и базовый ключ: хранение значений, является ли em-redis лучшим решением для моего сценария?

Ответы [ 2 ]

2 голосов
/ 18 мая 2012

Мы очень успешно используем em-hiredis внутри Голиафа. Вот пример того, как мы кодировали публикацию:

конфиг / example_api.rb

# These give us direct access to the redis connection from within the API
config['redisUri'] = 'redis://localhost:6379/0'
config['redisPub'] ||= EM::Hiredis.connect('')

example_api.rb

class ExampleApi < Goliath::API

  use Goliath::Rack::Params             # parse & merge query and body parameters
  use Goliath::Rack::Formatters::JSON   # JSON output formatter
  use Goliath::Rack::Render             # auto-negotiate response format

  def response(env)
    env.logger.debug "\n\n\nENV: #{env['PATH_INFO']}"
    env.logger.debug "REQUEST: Received"
    env.logger.debug "POST Action received: #{env.params} "

    #processing of requests from browser goes here

    resp =
      case env.params["action"]
      when 'SOME_ACTION'        then process_action(env)
      when 'ANOTHER_ACTION'     then process_another_action(env)
      else
        # skip
      end

    env.logger.debug "REQUEST: About to respond with: #{resp}"

    [200, {'Content-Type' => 'application/json', 'Access-Control-Allow-Origin' => "*"}, resp]
  end

  # process an action
  def process_action(env)
    # extract message data
    data = Hash.new
    data["user_id"], data["object_id"] = env.params['user_id'], env.params['object_id']

        publishData = { "action"   => 'SOME_ACTION_RECEIVED',
                        "data" => data }

        redisPub.publish("Channel_1", Yajl::Encoder.encode(publishData))

      end 
    end 
    return data
  end

  # process anothr action
  def process_another_action(env)
    # extract message data
    data = Hash.new
    data["user_id"], data["widget_id"] = env.params['user_id'], env.params['widget_id']

        publishData = { "action"   => 'SOME_OTHER_ACTION_RECEIVED',
                        "data" => data }
        redisPub.publish("Channel_1", Yajl::Encoder.encode(publishData))

      end 
    end 
    return data
  end
end

Обработка подписок оставлена ​​в качестве упражнения для читателя.

1 голос
/ 06 декабря 2011

em-синхрония исправляет гем em-redis, позволяя использовать его с волокнами, что эффективно позволяет ему работать в голиафах.

Вот проект, использующий Goliath + Redis, который может помочь вам понять, как все это работает: https://github.com/igrigorik/mneme

Пример с em-hiredis, что делает Голиаф, заключает ваш запрос в волокно, поэтому способ его проверки:

require 'rubygems'
require 'bundler/setup'

require 'em-hiredis'
require 'em-synchrony'

EM::run do
  Fiber.new do
    ## this is what you can use in goliath
    redis = EM::Hiredis.connect
    p EM::Synchrony.sync redis.keys('*')
    ## end of goliath block
  end.resume

end

и Gemfile, который я использовал:

source :rubygems

gem 'em-hiredis'
gem 'em-synchrony'

Если вы запустите этот пример, вы получите список определенных ключей в базе данных Redis, напечатанный на экране. Без вызова EM :: Synchrony.sync вы получили бы отсрочку, но здесь оптоволокно приостанавливается до тех пор, пока вызовы не вернутся и вы не получите результат.

...