- Konu sahibi
- #1
Rails’te uygulama önbelleğini geliştirme ortamında etkinleştirmek için uygulamanızın kök dizininde
Uygulama dizinine geçtikten sonra şu komutu çalıştırın:
Komutun çıktısında geliştirme önbelleğinin etkinleştirildiğini belirten bir mesaj görürsünüz. Rails, bu işlem sırasında geliştirme ortamı için kullandığı önbellekleme durumunu ve genellikle
Bu komut yerine geliştirme ayar dosyanızda önbellekleme özelliğini elle de açabilirsiniz.
Elle değişiklik yaptıysanız Rails sunucusunu durdurup yeniden başlatın. Aksi hâlde çalışan süreç eski yapılandırmayı kullanmaya devam edebilir. Kapatmak için aynı komutu yeniden çalıştırabilir veya ayarı
Bu depo işlemi çalıştıran süreç içinde tutulur. Uygulama yeniden başlatıldığında veya birden fazla uygulama süreci kullanıldığında önbellek paylaşılmaz. Bu nedenle üretimde birden fazla sunucu ya da işlem varsa yalnızca bellek tabanlı depoya güvenmek yerine ortak bir önbellek deposu seçmeniz gerekir.
Üretimde kullanılacak depo, Rails sürümünüze ve altyapınıza göre yapılandırılmalıdır. Örneğin Redis kullanıyorsanız bağlantı bilgilerini doğrudan kaynak koda yazmak yerine ortam değişkeninden alın:
Bu örnekte
Aşağıdaki ayrım, hangi ayarın neyi etkilediğini gösterir:
Önbelleği açtıktan sonra yalnızca sunucunun hatasız başlamasını başarı ölçütü kabul etmeyin. Bir değeri
Çıktı
Örneğin görünüm parçası önbelleklemesi kullanıyorsanız ilgili görünümde
Ürün değiştiğinde anahtarın ürün bilgisiyle birlikte değişmesi, eski HTML parçasının süresiz kullanılmasını önlemeye yardımcı olur. Ancak önbellekleme; kullanıcıya özel içerik, yetki durumu veya sık değişen veriler için dikkatli tasarlanmalıdır. Kullanıcıya özel bir sonucu ortak bir anahtarla önbelleğe alırsanız bir kullanıcının içeriği başka bir kullanıcıya gösterilebilir.
Önbelleği açmanıza rağmen her istekte veri yeniden hesaplanıyorsa şu ayrımları kontrol edin:
bin/rails dev:cache komutunu çalıştırın. Bu komut geliştirme önbelleğini açar veya kapatır; açıldığında Rails, önbelleğe alınabilir yanıt ve görünüm parçalarını kullanır. Üretim ortamında ise önbellekleme ayarını çalıştırdığınız ortama göre config/environments/production.rb veya ilgili ortam yapılandırmasında açıkça tanımlamanız gerekir.Geliştirme ortamında önbelleği açma
Uygulama dizinine geçtikten sonra şu komutu çalıştırın:
Bash:
bin/rails dev:cache
Komutun çıktısında geliştirme önbelleğinin etkinleştirildiğini belirten bir mesaj görürsünüz. Rails, bu işlem sırasında geliştirme ortamı için kullandığı önbellekleme durumunu ve genellikle
tmp/caching-dev.txt dosyasını günceller. Dosyanın varlığı tek başına uygulamanızdaki bütün önbellek işlemlerinin başarıyla çalıştığını kanıtlamaz; asıl kontrol, önbelleğe alınan verinin ikinci istekte yeniden üretilip üretilmediğidir.Bu komut yerine geliştirme ayar dosyanızda önbellekleme özelliğini elle de açabilirsiniz.
config/environments/development.rb içinde aşağıdaki ayarın bulunduğundan emin olun:
Ruby:
config.action_controller.perform_caching = true
Elle değişiklik yaptıysanız Rails sunucusunu durdurup yeniden başlatın. Aksi hâlde çalışan süreç eski yapılandırmayı kullanmaya devam edebilir. Kapatmak için aynı komutu yeniden çalıştırabilir veya ayarı
false yapabilirsiniz:
Ruby:
config.action_controller.perform_caching = false
Önbellek deposunu seçme
perform_caching ayarı, Rails’in önbellekleme özelliklerini kullanmasına izin verir; önbelleğe alınan verinin nerede tutulacağını ise config.cache_store belirler. Küçük bir geliştirme uygulamasında bellek tabanlı depo yeterli olabilir:
Ruby:
config.cache_store = :memory_store
Bu depo işlemi çalıştıran süreç içinde tutulur. Uygulama yeniden başlatıldığında veya birden fazla uygulama süreci kullanıldığında önbellek paylaşılmaz. Bu nedenle üretimde birden fazla sunucu ya da işlem varsa yalnızca bellek tabanlı depoya güvenmek yerine ortak bir önbellek deposu seçmeniz gerekir.
Üretimde kullanılacak depo, Rails sürümünüze ve altyapınıza göre yapılandırılmalıdır. Örneğin Redis kullanıyorsanız bağlantı bilgilerini doğrudan kaynak koda yazmak yerine ortam değişkeninden alın:
Ruby:
config.cache_store = :redis_cache_store, {
url: ENV.fetch("REDIS_URL")
}
Bu örnekte
REDIS_URL tanımlı değilse uygulama başlatılırken hata oluşur. Bu davranış, eksik yapılandırmayı sessizce yok saymak yerine erken fark etmenizi sağlar. Redis’in erişilebilir olması da tek başına yeterli değildir; Rails uygulamasının kullandığı istemci geminin ve bağlantı ayarlarının projenizde doğru kurulmuş olması gerekir.Aşağıdaki ayrım, hangi ayarın neyi etkilediğini gösterir:
| Ayar veya komut | Etkisi | Sınırı |
|---|---|---|
bin/rails dev:cache | Geliştirme ortamında Rails önbelleklemesini açar veya kapatır. | Üretim ortamının yapılandırmasını değiştirmez. |
config.action_controller.perform_caching = true | Denetleyici ve görünüm önbellekleme özelliklerini etkinleştirir. | Verinin hangi depoda tutulacağını tek başına belirlemez. |
config.cache_store | Önbellek verisinin kullanılacağı depoyu belirler. | Depo bağlantısının ve gerekli gemilerin ayrıca çalışır olması gerekir. |
Önbelleklemenin gerçekten çalıştığını doğrulama
Önbelleği açtıktan sonra yalnızca sunucunun hatasız başlamasını başarı ölçütü kabul etmeyin. Bir değeri
Rails.cache ile yazıp okuyarak seçtiğiniz önbellek deposunu doğrudan test edebilirsiniz. Uygulama dizininde şu komutu çalıştırın:
Bash:
bin/rails runner 'Rails.cache.write("cache_test", "ok", expires_in: 5.minutes); puts Rails.cache.read("cache_test")'
Çıktı
ok ise Rails aynı işlem içinde değeri önbellek deposuna yazıp okuyabilmiştir. Bu kontrol, depo bağlantısının temel olarak çalıştığını gösterir; uygulamanızdaki her görünüm parçasının otomatik olarak önbelleğe alındığını göstermez.Örneğin görünüm parçası önbelleklemesi kullanıyorsanız ilgili görünümde
cache bloğu bulunmalıdır:
Kod:
<% cache ["product", @product] do %>
<%= render @product %>
<% end %>
Ürün değiştiğinde anahtarın ürün bilgisiyle birlikte değişmesi, eski HTML parçasının süresiz kullanılmasını önlemeye yardımcı olur. Ancak önbellekleme; kullanıcıya özel içerik, yetki durumu veya sık değişen veriler için dikkatli tasarlanmalıdır. Kullanıcıya özel bir sonucu ortak bir anahtarla önbelleğe alırsanız bir kullanıcının içeriği başka bir kullanıcıya gösterilebilir.
Komut çalışıyor ama sonuç değişmiyorsa
Önbelleği açmanıza rağmen her istekte veri yeniden hesaplanıyorsa şu ayrımları kontrol edin:
- İsteği gerçekten aynı Rails ortamına gönderdiğinizden emin olun. Geliştirmede açılan önbellek,
RAILS_ENV=productionile çalışan süreci etkilemez. config.action_controller.perform_cachingdeğerinin çalışan ortam yapılandırmasındatrueolduğunu kontrol edin.- Kodun
Rails.cacheyerine yalnızca bir Ruby değişkeni veya istek süresi boyunca yaşayan başka bir nesne kullanmadığını doğrulayın. - Önbellek anahtarının her istekte değişmediğini kontrol edin. Zaman damgası, rastgele değer veya değişen sorgu parametresi anahtara ekleniyorsa her istek yeni bir kayıt gibi davranabilir.
- Önbellek deposunun birden fazla işlem veya sunucu arasında paylaşılması gerekiyorsa
:memory_storekullanımının uygun olmadığını değerlendirin.
config.cache_store tanımını ve ilgili önbellek hizmetinin erişilebilirlik durumunu birlikte inceleyin. Üretime geçmeden önce test anahtarını silin veya kısa bir süre sonu belirleyin; gerçek uygulama verilerini deneme anahtarlarıyla karıştırmayın.