簡體   English   中英

如何使用Redis與Rails?

[英]How to use Redis with Rails?

我想要快速緩存,因此我使用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)才能在生產中正常工作?

您可以通過回答這些問題的鏈接發表評論(對我很好)在此先感謝您

您正在為每個控制器請求進行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)

請參閱應用程序機密部分,我在那里指定要使用的配置,並在其自己的機密中公開生產和其他環境的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服務器異常的日志以查看有哪些中斷和原因。 在不同的envs上觸發exception_notification ,使用gem like exception_notification向您發送郵件。

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

請參閱此答案的初始部分。 建立一個連接,使用Rails秘密或環境變量來公開主機,端口。 完全取決於您設置Redis實例的方式和位置。

redis是否需要額外的配置服務器(nginx)才能在生產中正常工作?

對於nginx不需要任何特殊的東西。 您只需在應用程序中配置它,並確保您能夠連接。

在生產中,我使用的是Kubernetes,其中Redis URL是redis://redis:6379/0

在我的Rails開發人員環境中,在Docker中,Redis URL也如上所述,但在我的Rails on localhost上,在Docker之外,Redis url是redis://localhost:6379

他接受了答案,提出了在初始化程序中設置Redis.new以建立單一連接的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應用程序的父目錄中設置REDIS_URL .rbenv-vars ,將REDIS_URL設置為在localhost上運行Rails。

對於Kubernetes,我在rails_deploy.yaml文件的環境部分設置了REDIS_URL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM