Sinatra가 Rails가 작성한 캐시 된 데이터를 올바르게 처리하도록 할 수있는 방법이 있습니까? 예를 들어 Rails가 데이터를 저장할 때 사용하는 ActiveSupport 클래스를 암시 적으로 처리하도록 할 수 있습니까?
Heroku에서 호스팅하는 Rails 4 앱과 Sinatra 앱은 공유 Memcachier 스토어를 사용하여 특정 임시 데이터를 공유했습니다.
Sinatra에서 키 / 값이 생성되면 모든 것이 정상적으로 작동합니다.
# on Sinatra:
session.cache.set("foo", "from sinatra", 100)
Sinatra 앱 또는 Rails 앱이 읽을 수있는 키를 설정하며, 두 앱 모두 nil
100 초 내에 만료되면 자동으로 읽습니다 . 그리고 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/set
Dalli :: Client.new를 사용하여 구성 할 때 사용되는 방법).
추가 편집 :
모델 내에서 캐시를 사용할 때 settings.cache에 직접 액세스 할 수 없으며 Sinatra :: Application.settings.cache.read ()를 사용해야합니다.
저는 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 를 사용하고있는 DalliStore
것 MemCacheStore
같습니다. 아래처럼 대신 사용할 수도 있습니다 .
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] 삭제
몇 마디 만하겠습니다