2011-11-11 5 views
3

EventMachineで使用するためにRedis接続を確立するためのいくつかのオプションがあるようですが、私はそれらの間のコアの違いを理解するのに苦労しています。Goliathで使用するRedisドライバの提案?

私の目標はGoliath

内のRedisを実装するために、私は今、私の接続を確立する方法は、EM-同期を介して行われている。

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私のシナリオの最適な解決方法はありますか?

答えて

1

em-synchronyとは、効果的にゴリアートを走らせるファイバーで使用するem-redis gemをパッチすることです。 https://github.com/igrigorik/mneme

例をEM-hiredisで、どのようなゴリアテんがそう繊維でテストする方法をあなたの要求をラップである:ここでは

は、すべてのこの作品にする方法にあなたを導くことができるゴリアテ+ Redisのを使用してプロジェクトがありますそれは次のとおりです。

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呼び出しがなければ、延期できますが、ここでは、呼び出しが戻るまでファイバーが中断され、結果が得られます。

+0

em-hiredisはどうですか? – Marco

+0

em-synchronyにem-hiredisアダプタがありますが、動作させることはできません(em-synchronyのmasterブランチを使用する必要があります)、em-hiredisをgoliathで使用する方法の例を追加しました。 – Schmurfy

2

私たちはem-hiredisをGoliath内で非常にうまく使用しています。ここでは、公開をコード化する方法のサンプルです:サブスクリプションの処理

のconfig/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 

は、読者の練習として残しています。

関連する問題