2011-11-11 2 views
3

EventMachine에서 사용할 수 있도록 Redis 연결을 설정하는 데는 여러 가지 옵션이있는 것 같아요. 그 중 핵심 차이점을 이해하는 데 어려움을 겪고 있습니다. 위의 차이이며, 같은 것을 사용하여 무엇골리앗에서 사용할 수있는 Redis 드라이버를 제안 했습니까?

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 

:

내 목표는 내 연결을 설정 Goliath

방법에서 지금 EM-동시성 통해 레디 스를 구현하는 것입니다 em-hiredis?

세트 및 기본 키 : 값 저장에 Redis를 사용하는 경우 em-redis 내 시나리오에 가장 적합한 솔루션은 무엇입니까?

답변

1

em-synchrony가 패치하는 것은 em-redis 보석을 사용하여 섬유가 골리앗에서 효과적으로 작동하도록 허용하는 것입니다. 여기

는 만드는 방법에 당신을 안내 할 수 골리앗 + 레디 스를 사용하여 프로젝트 모든이 작동합니다 EM-hiredis와 https://github.com/igrigorik/mneme

예, 무엇 골리앗 할 테스트 섬유의 요청 그렇게하는 방법을 포장입니다

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' 

당신이 당신의 레디 스 데이터베이스에 정의 된 키 목록을 얻을 것이다 화면에 인쇄됩니다. EM :: Synchrony.sync 호출이 없으면 연기 할 수 있지만 여기에서는 호출이 반환 될 때까지 광섬유가 일시 중단되고 결과를 얻습니다.

+0

em-hiredis는 어떻습니까? – Marco

+0

em-synchrony에 em-hiredis 어댑터가 있지만 작동하도록 만들 수 없습니다 (em-synchrony의 master 브랜치를 사용해야합니다), 골리앗과 함께 em-hiredis를 사용하는 한 가지 예가 추가되었습니다. – Schmurfy

2

우리는 Goliath 내부에서 매우 성공적으로 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 

취급 구독은 독자들에게 연습으로 남아 있습니다 : 여기에 우리가 출판 코딩 방법의 샘플입니다.

관련 문제