Подтвердить что ты не робот

$ redis глобальная переменная с рубином на рельсах

Я использую redis как кэш чтения. Я создал инициализатор

конфигурации/инициализатор/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. Но мне не нравится использовать эту глобальную переменную. Есть ли лучшие варианты, чем использование глобальной переменной?

4b9b3361

Ответ 1

расширяется дальше по предложению mestachs, namespacing модуля в вашем инициализаторе, как показано ниже

конфигурации/Инициализаторы/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

Ответ 2

Существует Redis.current, который вы можете использовать для хранения своего экземпляра Redis.

Поэтому вместо использования $redis вы можете назначить свой экземпляр следующим образом:

Redis.current = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])

Redis.current был представленный redis-rb в 2010 году в качестве стандартного способа захвата соединения redis, поэтому я был удивлен, что никакой другой ответ упомянул об этом.

Ответ 3

Если вы еще не используете другой Rails.cache, я советую вам просто использовать этот механизм с redis.

Хранилище redis-store делает это очень просто (https://github.com/redis-store/redis-store)

Таким образом вы можете просто сделать Rails.cache.reconnect, и все это dandy

https://github.com/redis-store/redis-store/issues/21#issuecomment-948569

Он также позволяет использовать удивительный API Rails.cache, который имеет некоторые опрятные функции: http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html

Ответ 4

Опция с именами заменяет вашу глобальную переменную, вы можете создать метод в модуле

module Caching
  def self.redis
    ... initialize/memoize/reconnect here...
  end
end

Вы, а затем вызываете его с помощью:

Caching.redis

Ответ 5

Согласно this Heroku, вам не нужно добавлять $redis к своему Единорогу:

При использовании Redis Cloud с сервером Unicorn никакой специальной настройки не требуется. Пользователи, запускающие приложения Rails в Unicorn, должны следовать инструкциям в разделе Настройка Redis from Rails и пользователей...

Здесь все "" Настройка Redis from Rails" имеет значение перед 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

На самом деле это не дает объяснения, почему "никакой специальной установки не требуется".

Ответ 6

попробуйте это: -

вы можете использовать constant вместо global variable.like в   конфиг/инициализатор/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 if defined?(REDIS)
end

# Дайте каждому дочернему процессу свое собственное соединение Redis

after_fork do |server, worker|
  REDIS ||= Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
end