복붙노트

[REDIS] 멀티 스레드 레일 환경에서 레디 스를 사용하는 가장 좋은 방법은 무엇입니까? (푸마 / Sidekiq)

REDIS

멀티 스레드 레일 환경에서 레디 스를 사용하는 가장 좋은 방법은 무엇입니까? (푸마 / Sidekiq)

난 둘 다 Sidekiq 대기열에 대한, 및 모델 캐싱, 내 응용 프로그램에서 레디 스를 사용하고 있습니다.

내 모델에 사용할 수있는 레디 스 연결을하는 가장 좋은 방법은 레디 스 타격 될 모델은 내 웹 응용 프로그램 (푸마를 통해 RAN)에서, 그리고 Sidekiq 내부 백그라운드 작업에서 모두 호출되는 점을 감안, 무엇입니까?

나는 현재 내 이니셜이하고 있어요 :

Redis.current = Redis.new(host: 'localhost', port: 6379)

그리고 단순히 코드를 통해 Redis.current.get / Redis.current.set (유사한)를 사용 ...

이것은 레디 스 클라이언트 만 모니터를 사용하여, 한 번에 하나 개의 명령을 실행하기 때문에 내가 이해까지로, 스레드 안전합니다.

이제 Sidekiq는 레디 스에 자신의 연결 풀을 가지고 있으며, 일을하는 것이 좋습니다

Sidekiq.redis do |conn|
   conn.get
   conn.set
end

내가 알기로 당신은 그들이 레디 스를 공격 하나의 연결에서 서로를 기다리는 여러 스레드에서 여러 직원이 없기 때문에,이 더 나은 단지 Redis.current를 사용하는 방법보다 것이다.

그러나, 어떻게 내가 내 모델 Sidekiq.redis에서 사용할 수 얻을이 연결을 만들 수 있습니까? (않고도 모든 메소드 호출의 매개 변수로 주위 통과)

그것은 글로벌 이후 나는 그 블록 내부에 Redis.current을 설정할 수 없습니다, 나는 (심지어 비 스레드 안전 수 있습니다 플러스 무작위로 그들 사이에서 전환) 모두 같은 연결을 사용하여에 돌아 왔어요

나는 스레드 로컬 변수로 Sidekiq.Redis에서 얻을 연결을 저장하고, 모든 곳에서 그 스레드 로컬 변수를 사용해야합니까?

이 경우, 나는 "푸마"상황에서 무엇을해야합니까? 어떻게 스레드 로컬 변수를 설정합니까?

여기에 대한 생각은 크게 감사하고 있습니다.

감사합니다!

해결법

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

    1.당신은 당신의 응용 프로그램 코드에 대해 별도의 글로벌 연결 풀을 사용합니다. 초기화하여 redis.rb이 뭔가를 넣어 :

    당신은 당신의 응용 프로그램 코드에 대해 별도의 글로벌 연결 풀을 사용합니다. 초기화하여 redis.rb이 뭔가를 넣어 :

    require 'connection_pool'
    REDIS = ConnectionPool.new(size: 10) { Redis.new }
    

    이제 응용 프로그램 코드의 어느 곳에서, 당신은이 작업을 수행 할 수 있습니다 :

    REDIS.with do |conn|
      # some redis operations
    end
    

    당신은 당신의 푸마 / sidekiq 근로자 사이에 공유에 대한 10 개의 연결을해야합니다. 이것은 당신이 올바르게 참고로, 단일 레디 스 연결을 통해 싸우는 모든 스레드가되지 않습니다, 이후 더 나은 성능으로 이어질 것입니다.

    이 모든 것은 여기에 설명되어 있습니다 : https://github.com/mperham/sidekiq/wiki/Advanced-Options#connection-pooling

  2. from https://stackoverflow.com/questions/28113940/what-is-the-best-way-to-use-redis-in-a-multi-threaded-rails-environment-puma by cc-by-sa and MIT license