Как использовать Redis с рельсами?
Мне нужно очень быстрое кэширование, и поэтому я использую redis. Я думаю, что делаю это неправильно и, следовательно, сталкиваюсь с проблемами.
Вот что я делаю каждый раз, когда использую redis. В моем файле контроллера, пользователь.rbdef online?
!Redis.new.get("#{self.auth_token}").nil?
end
Тогда для проверки, находятся ли пользователи в сети или нет, я использую это,
@users_ol = User.where(:id => @id).select(&:online?)
Это возвращает мне список всех пользователей, находящихся в данный момент в сети. Это хорошо работает в localhost, но ломается при работе на сервере.
Мои вопросы
- как отлаживать и знаете, вызвана ли эта проблема redis или нет?
- Как правильно использовать Redis в Rails?
- нужна ли redis дополнительная конфгурация для сервера (nginx), чтобы нормально работать в производстве?
Вы можете комментировать с помощью ссылки ответы на вопросы тезисов (хорошо со мной) Заранее спасибо
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 не нужно ничего особенного. Вам просто нужно настроить его в своем приложении и убедиться, что вы можете подключиться.