如何在Rails中使用Redis?

时间:2018-06-22 10:16:56

标签: ruby-on-rails redis ruby-on-rails-5

我想要非常快速的缓存,因此我正在使用Redis。我认为我做错了,因此遇到了问题。

这是我每次使用redis时正在做的事情。在我的控制器文件中 user.rb

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

然后检查用户是否在线,我正在使用它

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

这会获取我当前在线的所有用户的列表。这在localhost中运行良好,但是在服务器上运行时会中断。

我的问题是

  • 如何调试并知道此问题是否是由redis引起的?
  • 在Rails中使用Redis的正确方法是什么?
  • redis是否需要额外配置以使服务器(nginx)在生产中正常工作?

您可以通过回答这些问题的链接发表评论(对我来说很好) 预先感谢

2 个答案:

答案 0 :(得分:5)

您正在为每个控制器请求建立Redis连接。这将是一场大规模的灾难。理想情况下,您应该为一个滑轨实例打开一个连接。为此,请创建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)

请参阅“应用程序秘密”部分,我在其中指定要使用的配置,并以自己的秘密公开用于生产和其他环境的hostport。这使我能够根据环境动态控制Redis主机和端口,并在本地回退到localhost:6379(默认)。

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

应该成为

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

如何调试并知道此问题是否是由Redis引起的?

请参阅Rails服务器异常日志,以了解中断和原因。当在不同的环境中触发异常时,请使用exception_notification之类的gem向您发送邮件。

  

在Rails中使用Redis的正确方法是什么?

请参阅此答案的初始部分。建立一个连接,使用Rails机密或环境变量公开主机,端口。完全取决于设置Redis实例的方式和位置。

  

redis是否需要额外配置才能使服务器(nginx)正常工作   在生产中?

nginx不需要任何特殊的东西。您只需在应用程序中对其进行配置,并确保您能够连接。

答案 1 :(得分:1)

在生产中,我使用的Redis URL为redis://redis:6379/0的Kubernetes。

在我的Rails开发人员环境中,在Docker中,Redis URL也如上所述,但是在我的Docker之外的localhost上的Rails中,Redis URL为redis://localhost:6379

他接受的答案很好地说明了在初始化程序中设置Redis.new来建立单个连接。

如果您在本地以及开发环境中的Docker中使用Rails,则已接受答案中的解决方案将不起作用。对我来说,解决方案是在config / initializers / redis.rb文件中使用以下代码:

redis_url = ENV.fetch("REDIS_URL")

REDIS = Redis.new(url: redis_url)

然后在我的控制器中,使用以下代码:

REDIS.incr "page hits"
@page_hits = REDIS.get "page hits"

我使用.env_file在Docker中设置REDIS_URL,在我的Rails应用程序的父目录中设置.rbenv-vars,以设置REDIS_URL在本地运行Rails。

对于Kubernetes,我在REDIS_URL文件的环境部分中设置了rails_deploy.yaml