복붙노트

[REDIS] $ 레일에 루비와 전역 변수를 레디 스

REDIS

$ 레일에 루비와 전역 변수를 레디 스

나는 읽기 캐시로 레디 스를 사용하고 있습니다. 나는 초기화를 만들었습니다

설정 / 초기화 / 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

내 레디 스 서버에 액세스해야 할 때마다 나는이 전역 변수를 사용하고 있습니다. 그러나 나는이 전역 변수를 사용하여 편안하지 않다. 전역 변수를 사용하는 것보다 더 좋은 옵션이 있습니까?

해결법

  1. ==============================

    1.아래로 초기화에 모듈의 네임, mestachs 제안에 더 확대

    아래로 초기화에 모듈의 네임, mestachs 제안에 더 확대

    설정 / 초기화 / 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
    
  2. ==============================

    2.당신이 당신의 하나와 전용 레디 스 인스턴스를 저장하는 데 사용할 수있는 Redis.current가있다.

    당신이 당신의 하나와 전용 레디 스 인스턴스를 저장하는 데 사용할 수있는 Redis.current가있다.

    그래서 그 대신 $의 레디 스를 사용하는 다음과 같이 인스턴스를 할당 할 수 있습니다 :

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

    내가 다른 대답을 언급 없음을 놀라게 그래서 Redis.current는 레디 스 연결을 잡기 위해 표준 방법으로 2010 년 레디 스-RB에 소개되었다.

  3. ==============================

    3.이미 다른 Rails.cache I 조언을 사용하지 않는 경우 당신은 레디 스과 그 메커니즘을 사용합니다.

    이미 다른 Rails.cache I 조언을 사용하지 않는 경우 당신은 레디 스과 그 메커니즘을 사용합니다.

    보석의 레디 스 매장은 정말 쉽게 (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

  4. ==============================

    4.글로벌 변수를 대체 할 더 네임 스페이스 옵션, 당신은 모듈의 방법을 만들 수 있습니다

    글로벌 변수를 대체 할 더 네임 스페이스 옵션, 당신은 모듈의 방법을 만들 수 있습니다

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

    그런 다음 그것을 콜보다 :

    Caching.redis

  5. ==============================

    5.이에게 Heroku에 따르면, 당신은 당신의 유니콘에 $ 레디 스를 추가 할 필요가 없습니다 :

    이에게 Heroku에 따르면, 당신은 당신의 유니콘에 $ 레디 스를 추가 할 필요가 없습니다 :

    여기에 "구성 레디 스 레일에서 섹션"에 대한이 전부합니다 (Gemfile 및 다른 사전 레일 3 물건 이외의) 레일 4 전 :

    # 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
    

    정말 "특별한 설정이 필요하지 않습니다"이유에 대한 설명을 제공하지 않습니다.

  6. ==============================

    6.이 밖으로 시도 : -

    이 밖으로 시도 : -

    당신은 대신 글로벌 variable.like의 상수를 사용할 수 있습니다     설정 / 초기화 / 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
    

    # 각 자식 프로세스에게 자신의 레디 스 연결주세요

    after_fork do |server, worker|
      REDIS ||= Redis.new(:host => ENV["REDIS_HOST"], :port => ENV["REDIS_PORT"])
    end
    
  7. from https://stackoverflow.com/questions/21075781/redis-global-variable-with-ruby-on-rails by cc-by-sa and MIT license