Powiedzmy, że masz fragment strony wyświetlający najnowsze posty, a wygaśniesz go za 30 minut. Używam tutaj Railsów.Najlepszy sposób łączenia pamięci podręcznej fragmentów i obiektów dla memcached i Railsów
<% cache("recent_posts", :expires_in => 30.minutes) do %>
...
<% end %>
Oczywiście nie trzeba robić przeszukiwania bazy danych, aby uzyskać najnowsze wiadomości czy fragment istnieje, więc powinieneś być w stanie uniknąć tego napowietrznych zbyt.
Co robię teraz jest coś takiego w kontrolerze, który wydaje się działać:
unless Rails.cache.exist? "views/recent_posts"
@posts = Post.find(:all, :limit=>20, :order=>"updated_at DESC")
end
Jest to najlepszy sposób? Czy to jest bezpieczne?
Jedno nie rozumiem dlaczego jest kluczem jest „recent_posts
” dla fragmentu i „views/recent_posts
” podczas sprawdzania później, ale wpadłem na to po obejrzeniu memcached -vv
aby zobaczyć co to wykorzystywał. Ponadto nie podoba mi się powielanie ręcznego wprowadzania "recent_posts
", lepiej byłoby zachować to w jednym miejscu.
Pomysły?
Chociaż myślę, że odpowiedź Lar'a może być nieco bardziej przejrzysta i unika używania meta-programowania, twoja odpowiedź jest lepsza, ponieważ reklama lepiej słyszy MVC. Przegłosowałem oba z nich jako ważne, ale pozostawiam to społeczności do podjęcia decyzji (nie wybiorę jednego jako zaakceptowanego :) Dzięki! –
Zgadzam się i uważam to również za dobre rozwiązanie. Jeśli chodzi o ponowne wykorzystanie widoku, tak, ogólnie rzecz biorąc, jest to dobra zasada. Musiałbyś pozwolić kontrolerowi dostarczyć klucz pamięci podręcznej, żeby działał tutaj. BTW, co zabawne, dokumentacja API dotycząca buforowania fragmentów narusza zasadę MVC w pierwszym przykładzie: http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html –