Rails와 Sinatra간에 memcached를 통해 데이터를 공유 할 때 Sinatra가 ActiveSupport를 처리하지 않는 문제를 해결하는 방법

jpw

Sinatra가 Rails가 작성한 캐시 된 데이터를 올바르게 처리하도록 할 수있는 방법이 있습니까? 예를 들어 Rails가 데이터를 저장할 때 사용하는 ActiveSupport 클래스를 암시 적으로 처리하도록 할 수 있습니까?

Heroku에서 호스팅하는 Rails 4 앱과 Sinatra 앱은 공유 Memcachier 스토어를 사용하여 특정 임시 데이터를 공유했습니다.

Sinatra에서 키 / 값이 생성되면 모든 것이 정상적으로 작동합니다.

# on Sinatra:
session.cache.set("foo", "from sinatra", 100)

Sinatra 앱 또는 Rails 앱이 읽을 수있는 키를 설정하며, 두 앱 모두 nil100 초 내에 만료되면 자동으로 읽습니다 . 그리고 Rails와 Sinatra는 데이터 값의 클래스를 String으로보고합니다.

그러나 데이터가 Rails 앱에 의해 설정된 경우 :

# on Rails:
Rails.cache.write("foo", "from rails", expires_in: 100)

Rails 앱 read은 (예상대로) 문자열을 반환 하지만 Sinatra 앱 get은 ActiveSupport :: Cache :: Entry 클래스를 반환합니다.

# on Sinatra
d = settings.cache.get("foo")
=> #<ActiveSupport::Cache::Entry:0x7f7ea70 @value="from rails", @created_at=1598330468.8312092, @expires_in=100.0>

Sinatra 앱 이 만료 동일한 키를 가져 오면 동일한 데이터가 반환됩니다 (nil이 아님).

그것은 확실히 할 수 있는 새로운 방법으로 무차별를에시나 응용 프로그램에 get'데이터를 S 및 수동으로 아래에 설명 된대로 ActiveSupport :: 캐시 : 입력 방법을 사용하여 만료 및 데이터 문제를 처리합니다.

그러나 거기는시나가 ActiveSupport :: 캐시를 사용하도록 말해서 그 자세한 내용은 자동으로 ActiveSupport :: 캐시 :: 항목 코드 핸들을 몇 가지 방법이 될한다고 것 같아 모두 설정 및 데이터를 가져?

# pseudo code for Sinatra app
 def new_get(key)
   x = settings.cache.get(key)
   if x.class == ActiveSupport::Cache::Entry
      if x.expired?
         x.delete
         return nil 
      else return x.value
   else return x
 end

현재 memcache 저장소는 Heroku 온라인 설명서에 따라 구성됩니다.

require 'dalli'
set :cache, Dalli::Client.new(
 (ENV["MEMCACHIER_SERVERS"] || "").split(","),
 {:username => ENV["MEMCACHIER_USERNAME"],
  :password => ENV["MEMCACHIER_PASSWORD"],
  :failover => true, # default is true
  :socket_timeout => 1.5, # default is 0.5
  :socket_failure_delay => 0.2, # default is 0.01
  :down_retry_delay => 60 # default is 60
 })

편집-해결 Sinatra / Rails 데이터 상호 운용성의 핵심은 캐시 저장소가 ActiveSupport를 사용하도록 명시 적으로 구성하는 것이 었습니다. 여전히 자동으로 Dalli gem을 사용하여 memcachier 서비스에 대한 연결을 관리합니다.

set :cache, ActiveSupport::Cache::MemCacheStore.new(
... # init parameters
)}

이는 또한 방법을 사용하는 것을 의미 settings.cache.read/write합니다 ( settings.cache.get/setDalli :: Client.new를 사용하여 구성 할 때 사용되는 방법).

추가 편집 :

모델 내에서 캐시를 사용할 때 settings.cache에 직접 액세스 할 수 없으며 Sinatra :: Application.settings.cache.read ()를 사용해야합니다.

사용자 11350468

저는 Sinatra 사용자가 아닙니다. Rails에서 아래와 같은 것을 사용했습니다.

cache_store = ActiveSupport::Cache::MemCacheStore.new('localhost')

# For writing the keys:
cache_store.write("foo", "from rails", expires_in: 100)

# For reading the keys
cache_store.read("foo")

편집하다

gem dalli 를 사용하고있는 DalliStoreMemCacheStore같습니다. 아래처럼 대신 사용할 수도 있습니다 .

cache_store = ActiveSupport::Cache::DalliStore.new('localhost')
# For writing the keys:
cache_store.write("foo", "from rails", expires_in: 100)
    
# For reading the keys
cache_store.read("foo")

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관