2012-12-11 28 views
9

Gözlemciler ve Süpürücüler Raylar 4'ten çıkarılır. Ancak önbelleği önbelleğe almanın ve temizlemenin yolu nedir?Süpürücüler olmadan önbellekleri temizlemenin doğru yolu nedir?

Ben rusça bebek önbellekleme hakkında okurum. Güzel ve hepsi ama sadece görüntüleme önbelleği ile ilgilidir. Veritabanının vurulmasını engellemez. Örneğin

:

<% cache @product do %> 
    Some HTML code here 
<% end %> 

Hala onun cache_key almak için db @product almak gerekir. Dolayısıyla sayfa veya eylem önbelleğe alma, gereksiz yükleri önlemek için hala yararlı olabilir.

Bazen önbelleği temizlemek için biraz zaman aşımı kullanabilirdim, ancak kayıtlar değişmediyse?

En azından süpürücülerle bu yönde kontrolünüz vardır. Önbellek yapmak ve temizlemek için sağ yol nedir/olacak?

Teşekkürler! :) bilgisayar bilimi iki sert sorunlardan birine

cevap

8

Hoşgeldin önbellekte geçersiz kılma :)

Bir önbelleğe alınmış olan görüşün aksine önbelleğe alınmış nesne, sadece olabilen zaman için mantık beri elle idare etmesi gerekir görüntülediği nesnelerden türetilmiş, geçersiz kılınmış uygulama ve duruma bağımlıdır. Bu bir Rails.cache.fetch yöntemidir. Rails.cache.fetch 3 argüman alır; önbellek tuşu, bir seçenek hash ve bir blok. İlk önce, anahtar temelinde geçerli bir önbellek kaydını okumaya çalışır; Bu anahtar varsa ve süresi dolmamışsa, değeri önbellekten geri döndürür. Geçerli bir kayıt bulamazsa, bunun yerine dönüş değerini bloktan alır ve belirtilen anahtarla önbelleğe kaydeder. Örneğin

:

@models = Rails.cache.fetch my_cache_key do 
    Model.where(condition: true).all 
end 

Bu bloğu önbelleğe ve bir şey (tm) yeniden değerlendirilmeye bloğu zorlayarak, anahtarın geçersiz kılınmasına kadar sonuç yeniden kullanılacaktır. Ayrıca, yöntem zincirinin sonunda .all'a dikkat edin. Normalde Rails, önbelleğe alınacak bir ActiveRecord ilişki nesnesini döndürür ve bu, ilk kez @models kullanmayı denediğinizde, önbelleği düzgün bir şekilde işaretleyerek değerlendirilir. .all numaralı çağrı, Rails'i kayıtlara istekli olarak yüklemeye zorlar ve bunun sonucu olarak önbelleğe aldığımızdan emin olun.

Şimdi tüm önbelleğinizi alıp veritabanınızla hiç bir zaman konuşmayacağınız için önbelleği geçersiz kıldığımızdan emin olmalıyız. Bu, yalnızca bir önbellek anahtarını alıp kaldırdığı ve bir dahaki sefere onu almaya çalışırken bir özneye neden olan Rails.cache.delete yöntemiyle yapılır. Bloğun yeniden değerlendirilmesini zorlamak için force: true seçeneğini de getirerek kullanabilirsiniz. Hangisi size uygunsa

Tüm bunların bilimi, Rails.cache.delete numaralı telefonu aramaktır. Bu durumda, tek bir örnek için bu güncelleme ve silme işlemi yapılır ve bir koleksiyon için herhangi bir üyede güncelleme, silme, oluşturma. Her zaman arı köşesi vakaları olacak ve her zaman uygulamaya özeldir, bu yüzden size orada yardım edemem.

Bu yanıtta, memcached veya Redis gibi bazı önbellek depolarını kuracağınızı kabul ediyorum.

config.cache_store = :null_store 

veya geliştirme ortamı önbelleğe alır ve hayal kırıklığından tüysüz sona erecek:

Ayrıca config/ortamlar/development.rb bu eklemeyi unutmayın. ayrıca referans okuma için

: Everyone should be using low level caching in Rails ve The rails API docs

Ayrıca bu işlevselliği kayda değerdir Raylar 4 kaldırılmaz, sadece bir mücevher içine ekstre edildi. Süpürücünün tüm özelliklerine ihtiyacınız varsa veya isterseniz, Gemfile öğenizdeki bir gem 'rails-observers' satırı ile uygulamanıza tekrar ekleyin. Bu mücevher, Rails 4 çekirdeğinden kaldırılan süpürücüleri ve gözlemcileri içerir.

Umarım başlamışsınızdır.

+0

Önbellek geçersizliği hakkında bence bu, süpürücüler rolüne geri dönüyor. Denetleyicimde 'Rails.cache.delete' yerine arama yapmak için dıştan takılmış taşlardan süpürücüler kullanabilirdim. Sanırım bu durumda mantıklı değil mi? Cevabınız için teşekkür ederiz :) – Happynoff

+0

Evet, süpürgenin rolü, çalışma önbelleği stratejisinin önkoşullarından biri olduğundan çıkması zordur;) Genellikle önbellek geçersiz kılma, mesajlaşma gibi şeyler için bir yaşam döngüsü sınıfına sahibim dış modellerle etkileşimler. Böylelikle temiz bir kontrolörünüz, küçük çekirdek sınıfınız var ve yabancı davranışlarınızı temel sınıfa dinleyen başka bir sınıfa yapıştırın. Özünde, süpürge, bu yaşam döngüsü sınıflarının sadece bir özel durumudur ve bunlarla doğal olarak yanlış bir strateji yoktur. –

+0

Bu yüzden, Rails 4'ten süpürücüleri kaldırma konusunda garip hissediyorum. Sayfayı/eylem önbelleğini kötü anlıyorum ama düşük düzeyde önbellekleme hala süpürücülere veya süpürücüye benzer davranışlara ihtiyaç duyduğundan, onları kaldırma noktasını göremiyorum :( – Happynoff

İlgili konular