2

Ruby on Rails アプリケーションでRedisを使用しています。redis-objectsdm-core、およびdm-redis-adapterを使用して Ruby オブジェクトを Redis にマップします。以下はコードの抜粋です

Gemfile

gem 'redis-objects'
gem "dm-core", "~> 1.2.1"
gem "dm-redis-adapter"

/config/initializers/redis.rb

// LOCAL REDIS SERVER
Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)
// REMOTE REDIS SERVER
#Redis.current = Redis.new(:host => '<VM IP>', :port => <VM PORT>, :password => '<PASSWORD>')

Model.rb

DataMapper.setup(:default, {:adapter  => "redis"})

class User
  include Redis::Objects
  include DataMapper::Resource

  include ActiveModel::Validations  
  include ActiveModel::Conversion  

  # datamapper fields, just used for .create
  property :id, Serial
  property :name, String
  property :email, String
  property :des, Text

  def id
    1
  end

end

User.finalize

ローカルの redis サーバーでは問題なく動作しています。リモートホストとポートを提供している場合でも、アプリが常にローカル redis を指すのはなぜですか?

解決済み:私の答えをチェックしてください。

4

2 に答える 2

5

質問ごとに:

// LOCAL REDIS SERVER
Redis.current = Redis.new(:host => '127.0.0.1', :port => 6379)
// REMOTE REDIS SERVER
#Redis.current = Redis.new(:host => '<VM IP>', :port => <VM PORT>, :password => '<PASSWORD>')

Model.rb

 DataMapper.setup(:default, {:adapter  => "redis"})

上記のコードでは、User モデルで Redis 構成をオーバーロードしています。その場合、モデルにもリモート構成を記述する必要があります。

DataMapper.setup(:default, {:adapter  => "redis", :host => '<VM IP>', :port => <VM PORT>, :password => '<PASSWORD>'})
于 2014-01-09T10:39:37.877 に答える
1

Redis.current は、インスタンス変数 @current が空の場合、常に新しい接続を提供するメソッドです。https://github.com/redis/redis-rb/blob/master/lib/redis.rb#L19を参照してください。

  def self.current
    @current ||= Redis.new
  end

Redis.new を $redis などの他のグローバルに割り当ててみてください。これで問題はほとんど解決するはずです。

于 2014-01-08T13:21:29.560 に答える