2013-03-12 17 views
5
select * from Foo where id = 200 

Belirli bir kimlikte her zaman yapılan bir seçili çağrıyı gözlemlediğimizden, nesneyi kimliğe göre bulma önbelleği nasıl bulunur. Nasıl (memcached demek ya REDIS) gelecekte herhangi önbellek deposunda arasında geçiş böylece biz olmayan bir rahatsızlık verici şekilde raylar bu imkan vermelidirÖnbellek bulma nesnesi, kimliğe göre nasıl olur

DÜZENLEME:

benzer Much tabanlı önbelleğe alma stratejisini org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE Hazırda hangi Java EE'deki tüm Varlık sınıflarına uygulanır.

+2

Rayların önbelleklemeye yaklaşımı, Hibernate'in biraz farklı. Http://guides.rubyonrails.org/caching_with_rails.html ve http://broadcastingadam.com/2012/07/advanced_caching_revised/ adresinde, her şeyin nasıl çalıştığına dair iyi incelemeler için bir göz atmak isteyebilirsiniz. Sorunuzu anlamanız, her istekte veritabanından bir nesneyi almak zorunda kalmamanız gerektiğidir - doğru mu? Daha fazla kod gönderirseniz yardımcı olabilir. –

+0

Alex'in dediği gibi, burada yeterince bilgi yok. Bu, seçerek kimliği nedir? Nereden geliyor? Hibernate get/load çağrısından mı? Bu hazırda bekar mı? Ya da ruby-on-raylar? –

+0

@AlexGhiculescu Aynı kimlikten her istekte veritabanından bir nesne almak istemiyorum. – Joe

cevap

2

istediğiniz ve tercihlerinize son kullanım tarihi belirlemeli ne olursa olsun yapabilirsiniz basit kullanım raylar dahili önbelleğe alma

Rails.cache.fetch :cache_id_here, :expires_in => 1.days do 
    Model.find(id) 
end 

Değişim :cache_id_here destekleyip desteklemediğini ben bilmiyorum. Bu önbellek, istediğiniz memcached veya başka bir önbellek deposu ile kullanabilirsiniz. Bunu uygulama yapılandırmanızda ayarlamanız yeterlidir.

GÜNCELLEME

Ben Rail .find ve .save yöntemleri ve önbelleğe alma sonuçlarını genişleterek bu sorunu çözen bir mücevher üzerinde çalışıyorum. Bu süper beta ve henüz üretimde test edilmedi, ancak denemek istiyorsanız, repo: https://github.com/johnkoht/cache-money-millionaire bir göz atın ve düşüncelerinizi bana bildirin.

Temelde Post.find(3)'u ararsanız, otomatik olarak kaydedilen veya dokunarak otomatik olarak güncelleştirilecek olan Post 3 önbelleği olan bir önbelleğe alınmış sürümü bulur ve oluşturur. Dediğim gibi, bu beta ama sorunu çözüyor. Foo modelinde

+0

Mücevher, yazı tipi senaryolarını nasıl ele alıyor? Ayrıca, geminiz https://github.com/orslumen/record-cache adresinden nasıl farklı? –

+0

@johnkoht geminizi bir süre sonra tekrar deneyecek – Joe

1

ardından taşlar yazma aracılığıyla önbelleği özellikleri sağlar:

record-cache

Raylar 3. Aktif olarak geliştirilen destekler. Twitter tarafından inşa edilen

cache_money, şimdi toplum tarafından sürdürdü. o Rails 3.

3

muhtemelen örneğin, config/application.rb dosyası içinde config.cache_store= arayarak uygulamanızın varsayılan önbellek deposu kurma bu

class Foo < ActiveRecord::Base 

    def self.find_some_foo(foo_id) 
    Rails.cache.fetch("foo_#{foo_id}", expires_in: 7.days) do 
     begin 
     self.where(:id => foo_id) 
     rescue Exception => e 
     logger.info "Exception fetching Foo ID: #{e.to_s}" 
     nil 
     end 
    end 
    end 

end 

gibi bir şey, config.cache_store = :memory_storelink Alex Ghiculescu bağlantı içinde faydalı bilgiler var sağlanan istiyorum bölüm 2.1.

cache_store'da bulunmayan bir anahtarı almaya çalıştığınızda, raylar önbellek deposu otomatik olarak doldurulur. Bu nedenle, anahtarlarınız için iyi bir adlandırma kuralı gelmek önemlidir. Temelleri oluşturduktan sonra, config/application.rb'da uygun değişikliği yaparak farklı önbellek depoları arasında geçiş yapmak kolaydır. Bazı seçenekler memory store, file store, memcache veya herhangi bir önbellek deposu kombinasyonudur.

Rayları bellek içi önbelleğini temizlemek için raylar sunucunuzu yeniden başlatın. Dosya önbelleğini temizlemek için rake tmp:clear yazın.Memcache'yi temizlemek için, bu link'a bakın. Beta tho hala http://api.rubyonrails.org/classes/ActiveRecord/IdentityMap.html

Onun, bu yüzden dikkatli kullanın:

+0

İpucu: # bir ilişkiyle değil gerçek bir nesne ile döner. Üstünde #first çağırmalısın. –

0

Kimlik Harita yardımcı olabilir. Ayrıca dernekleri takip etmeyecek.

İlgili konular