Как использовать Redis с рельсами?


Мне нужно очень быстрое кэширование, и поэтому я использую redis. Я думаю, что делаю это неправильно и, следовательно, сталкиваюсь с проблемами.

Вот что я делаю каждый раз, когда использую redis. В моем файле контроллера, пользователь.rb
def online?
  !Redis.new.get("#{self.auth_token}").nil?
end

Тогда для проверки, находятся ли пользователи в сети или нет, я использую это,

@users_ol = User.where(:id => @id).select(&:online?)

Это возвращает мне список всех пользователей, находящихся в данный момент в сети. Это хорошо работает в localhost, но ломается при работе на сервере.

Мои вопросы

  • как отлаживать и знаете, вызвана ли эта проблема redis или нет?
  • Как правильно использовать Redis в Rails?
  • нужна ли redis дополнительная конфгурация для сервера (nginx), чтобы нормально работать в производстве?

Вы можете комментировать с помощью ссылки ответы на вопросы тезисов (хорошо со мной) Заранее спасибо

1 2

1 ответ:

Вы устанавливаете соединение redis для каждого запроса контроллера. Это будет катастрофа по своим масштабам. В идеале, вы должны открыть одно соединение для одного rails instnace. Для этого создайте config/initializers/redis.rb

redis_host = Rails.application.secrets.redis && Rails.application.secrets.redis['host'] || 'localhost'
redis_port = Rails.application.secrets.redis && Rails.application.secrets.redis['port'] || 6379

# The constant below will represent ONE connection, present globally in models, controllers, views etc for the instance. No need to do Redis.new everytime
REDIS = Redis.new(host: redis_host, port: redis_port.to_i)

Смотрите раздел секреты приложений, там я указываю конфигурацию, которую нужно использовать, и раскрываю host и port для производственных и других сред в их собственных секретах. Это позволяет мне иметь динамическое управление хостом и портом redis на основе среды, а также запасной вариант для localhost: 6379 (по умолчанию) на local.

def online?
  !Redis.new.get("#{self.auth_token}").nil?
end

Должно стать

def online?
  REDIS.get("#{self.auth_token}").present?
end

Как отладить и узнать, вызвана ли эта проблема redis или нет?

Смотрите журнал исключений сервера Rails, чтобы узнать, что ломается и почему. Используйте драгоценный камень, как exception_notification чтобы отправлять вам письма, когда исключение срабатывает на разных env.

Как правильно использовать Redis в Rails?

См. В первой части этого ответа. Сделайте одно соединение, используйте рельсы секреты или переменные среды для предоставления хоста, порта. Полностью зависит от того, как и где вы настроили экземпляр Redis.

Нужна ли redis дополнительная конфгурация для правильной работы сервера (nginx) в производстве?

Для nginx не нужно ничего особенного. Вам просто нужно настроить его в своем приложении и убедиться, что вы можете подключиться.