簡體   English   中英

$ redis全局變量,在Ruby上運行

[英]$redis global variable with ruby on rails

我正在使用redis作為讀取緩存。 我已經創建了一個初始化器

config / initializer / redis.rb

$redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])

每當創建新工作線程時,我都會在unicorn.rb中使用此全局變量來創建新連接。

before_fork do |server, worker|
  # clear redis connection
  $redis.quit unless $redis.blank?
end

# Give each child process its own Redis connection
after_fork do |server, worker|
  $redis = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
end

每當我需要訪問我的Redis服務器時,我也會使用此全局變量。 但是我不習慣使用這個全局變量。 有沒有比使用全局變量更好的選擇?

Redis.current ,您可以使用它來存儲一個唯一的Redis實例。

因此,您可以按以下方式分配實例,而不是使用$redis

Redis.current = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])

Redis.current 在2010引入到redis-rb中,作為獲取Redis連接的一種標准方法,所以令我驚訝的是,沒有其他答案提到它。

進一步擴展方法建議,如下所示在初始化器中命名模塊的間隔

config / initializers / redis.rb

module ReadCache
  class << self
    def redis
      @redis ||= Redis.new(:url => (ENV["REDIS_URL"] || 'redis://127.0.0.1:6379'))
    end
  end
end

然后在unicorn.rb中

 before_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.quit
   end
    ...
 end

 after_fork do |server, worker|
    ...
   if defined?(ReadCache.redis)
    ReadCache.redis.client.reconnect
   end
    ...
 end

如果您還沒有使用其他Rails.cache,我建議您僅在Redis中使用該機制。

gem redis-store使這一過程變得非常容易( https://github.com/redis-store/redis-store

這樣你就可以做Rails.cache.reconnect並且一切都很好

https://github.com/redis-store/redis-store/issues/21#issuecomment-948569

它還允許您使用令人敬畏的Rails.cache API,它具有一些簡潔的功能: http : //api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html

一個更命名空間的選項來替換您的全局變量,您可以在模塊中創建一個方法

module Caching
  def self.redis
    ... initialize/memoize/reconnect here...
  end
end

然后,您可以通過以下方式調用它:

Caching.redis

根據 Heroku的介紹,您無需在獨角獸中添加$redis

將Redis Cloud與Unicorn服務器一起使用時,不需要任何特殊設置。 在Unicorn上運行Rails應用程序的用戶應遵循“ 從Rails配置Redis”部分中的說明以及用戶...

這是Rails 4之前的所有“ 從Rails配置Redis的部分”(除了Gemfile和其他一些Rails 3之前的版本):

# config/initalizers/redis.rb

if ENV["REDISCLOUD_URL"]
  uri = URI.parse(ENV["REDISCLOUD_URL"])
  $redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end

它並沒有真正解釋為什么“不需要特殊設置”。

試試這個:

您可以使用constant而不是global variable例如在config / initializer / redis.rb中

REDIS = Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])

並在unicorn.rb中

before_fork do |server, worker|
  # clear redis connection
  REDIS.quit if defined?(REDIS)
end

#給每個子進程自己的Redis連接

after_fork do |server, worker|
  REDIS ||= Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
end

暫無
暫無

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

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