[英]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 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(默認)。
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.