我想要非常快速的缓存,因此我正在使用Redis。我认为我做错了,因此遇到了问题。
这是我每次使用redis时正在做的事情。在我的控制器文件中 user.rb
def online?
!Redis.new.get("#{self.auth_token}").nil?
end
然后检查用户是否在线,我正在使用它
@users_ol = User.where(:id => @id).select(&:online?)
这会获取我当前在线的所有用户的列表。这在localhost中运行良好,但是在服务器上运行时会中断。
我的问题是
您可以通过回答这些问题的链接发表评论(对我来说很好) 预先感谢
答案 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)
请参阅“应用程序秘密”部分,我在其中指定要使用的配置,并以自己的秘密公开用于生产和其他环境的host
和port
。这使我能够根据环境动态控制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
。