読み取りキャッシュとしてredisを使用しています。イニシャライザを作成しました
config/initializer/redis.rb
$redis = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])
新しいワーカーが作成されるたびに、Unicorn.rbでこのグローバルを使用して新しい接続を作成しています。
before_fork do |server, worker|
# clear redis connection
$redis.quit unless $redis.blank?
end
# Give each child process its own Redis connection
after_fork do |server, worker|
$redis = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])
end
また、redisサーバーにアクセスする必要があるときはいつでも、このグローバル変数を使用しています。しかし、私はこのグローバル変数の使用に慣れていません。グローバル変数を使用するよりも良いオプションはありますか?
メスタッハの提案をさらに拡張し、イニシャライザのモジュールを以下のようにネームスペース
config/initializers/redis.rb
module ReadCache
class << self
def redis
@redis ||= Redis.new(:url => (ENV["REDIS_URL"] || 'redis://127.0.0.1:6379'))
end
end
end
その後、Unicorn.rb
before_fork do |server, worker|
...
if defined?(ReadCache.redis)
ReadCache.redis.quit
end
...
end
after_fork do |server, worker|
...
if defined?(ReadCache.redis)
ReadCache.redis.client.reconnect
end
...
end
Redis.current
があり、これを使用して、唯一のRedis
インスタンスを格納できます。
したがって、$redis
を使用する代わりに、次のようにインスタンスを割り当てることができます。
Redis.current = Redis.new(:Host => ENV["REDIS_Host"], :port => ENV["REDIS_PORT"])
Redis.current
は 2010年にredis-rbに導入 であり、redis接続を取得する標準的な方法であるため、他の回答で言及されていないことに驚きました。
まだ別のRails.cacheを使用していない場合は、そのメカニズムをredisで使用することをお勧めします。
Gem redis-storeはこれを本当に簡単にします( https://github.com/redis-store/redis-store )
このようにして、Rails.cache.reconnect
そしてすべてはダンディです
https://github.com/redis-store/redis-store/issues/21#issuecomment-948569
また、素晴らしいRails.cache APIを使用することもできます。これには、いくつかの優れた機能があります。 http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html
グローバル変数を置き換えるmore namespacedオプション。モジュールにメソッドを作成できます
モジュールキャッシュ def self.redis ...ここで初期化/メモ化/再接続... 終了 終了
次に、次のように呼び出します。
Caching.redis
this Herokuによると、ユニコーンに$redis
を追加する必要はありません。
UnicornサーバーでRedis Cloudを使用する場合、特別な設定は必要ありません。 Rails Unicornのアプリを実行しているユーザーは RailsからのRedisの設定 セクションの指示に従う必要があります。
「 RailsからRedisを構成する セクション」の前のすべてのRails 4(Gemfileと他のいくつかのRails 3以前のもの)以外):
# config/initalizers/redis.rb
if ENV["REDISCLOUD_URL"]
uri = URI.parse(ENV["REDISCLOUD_URL"])
$redis = Redis.new(:Host => uri.Host, :port => uri.port, :password => uri.password)
end
「特別な設定が必要ない」理由についての説明はありません。