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.
Ö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
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. –
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