2012-12-11 8 views
9

Obserwatorzy i zamiatacze są usuwani z szyn 4. Cool. Ale w jaki sposób buforować i czyścić pamięć podręczną?Jaki jest właściwy sposób czyszczenia pamięci podręcznej w Railsach bez zamiatarek

Przeczytałem o buforowaniu rosyjskiej lalki. To fajne i wszystko, ale dotyczy tylko pamięci podręcznej renderowania widoku. Nie zapobiega to trafianiu bazy danych.

Na przykład:

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

Trzeba jeszcze dostać @product z db aby uzyskać jego cache_key. Więc buforowanie strony lub działania może być nadal przydatne, aby zapobiec niepotrzebnemu obciążeniu.

Mogę użyć timeouta, aby wyczyścić pamięć podręczną, ale co się stanie, jeśli rekordy nie ulegną zmianie?

Przynajmniej z zamiatarkami masz kontrolę nad tym aspektem. Jaki jest/będzie jakiś sposób na zrobienie pamięci podręcznej i jej wyczyszczenie?

Dzięki! :)

Odpowiedz

8

Witamy w jednym z dwóch trudnych problemów w informatyce, cache unieważnianie :)

Ty musiałby poradzić ręcznie od logiki, kiedy buforowane obiekt, w przeciwieństwie do pamięci podręcznej widzenia, który może być po prostu wyprowadzone z obiektów, które wyświetla, powinny być unieważnione zależą od aplikacji i sytuacji.

You goto metoda jest to metoda Rails.cache.fetch. Rails.cache.fetch przyjmuje 3 argumenty; klucz pamięci podręcznej, skrót mieszania opcji i blok. Najpierw próbuje odczytać prawidłowy rekord pamięci podręcznej na podstawie klucza; jeśli klucz istnieje i nie wygasł, zwróci wartość z pamięci podręcznej. Jeśli nie może znaleźć prawidłowego rekordu, pobiera wartość zwracaną z bloku i zapisuje ją w pamięci podręcznej z określonym kluczem.

Na przykład:

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

Będzie to blok pamięci podręcznej i ponowne wynik aż coś (tm) unieważnia klucz, zmuszając blok zostać ponownie. Zwróć także uwagę na .all na końcu łańcucha metod. Normalnie Railsy zwrócą obiekt relacji ActiveRecord, który zostanie zbuforowany, a następnie zostanie oceniony, gdy spróbujesz po raz pierwszy użyć @models, starannie omijając pamięć podręczną. Wywołanie .all zmusza Railsy do szybkiego ładowania rekordów i zapewnienia, że ​​to wynik, że buforujemy, a nie pytanie.

Teraz, gdy masz już całą pamięć podręczną i nigdy więcej nie rozmawiasz z bazą danych, musimy upewnić się, że pokrywamy drugi koniec, unieważniając pamięć podręczną. Odbywa się to za pomocą metody Rails.cache.delete, która pobiera klucz pamięci podręcznej i usuwa go, powodując pominięcie przy następnej próbie pobrania. Możesz także użyć opcji force: true z pobieraniem, aby wymusić ponowną ocenę bloku. Cokolwiek ci odpowiada.

Nauka o tym wszystkim jest nazywać się Rails.cache.delete, w przypadku naiwnym jest to aktualizacja i usunięcie dla pojedynczej instancji oraz aktualizacja, usuwanie, tworzenie na dowolnym elemencie dla kolekcji. Zawsze będą przypadki narożników i będą one zawsze specyficzne dla aplikacji, więc nie mogę ci w tym pomóc.

Zakładam w tej odpowiedzi, że skonfigurujesz jakiś rozsądny sklep cache, taki jak memcached lub Redis.

Należy również pamiętać, aby dodać do config/środowiskach/development.rb:

config.cache_store = :null_store 

lub środowisko programistyczne będzie buforować i skończy się bezwłosy z frustracji.

Dalsze odczytu odniesienia: Everyone should be using low level caching in Rails i The rails API docs

Warto również zauważyć, że funkcjonalność nie jest usuwany z szyn 4, jedynie ekstrahowano gem. Jeśli potrzebujesz lub chcesz mieć wszystkie funkcje zamiatarki, po prostu dodaj ją do swojej aplikacji za pomocą linii gem 'rails-observers' w swoim Gemfile. Ten klejnot zawiera zarówno zamiatarki, jak i obserwatorów, które usunięto z Rails 4 core.

Mam nadzieję, że pomogę Ci zacząć.

+0

O unieważnieniu pamięci podręcznej Myślę, że to zabiera nas z powrotem do roli zamiatarki. Zamiast wywoływać 'Rails.cache.delete' w moim kontrolerze, mógłbym użyć zamiatarek z zewnętrznego klejnotu. Myślę, że w tym przypadku ma to sens, prawda? Dziękuję za odpowiedź :) – Happynoff

+0

Tak, rola zamiatarki jest trudna do wydostania, ponieważ jest to jeden z warunków wstępnych dla działającej strategii pamięci podręcznej;) Zwykle mam klasę cyklu życia na takie rzeczy jak unieważnianie pamięci podręcznej, przesyłanie wiadomości i interakcje z modelami zewnętrznymi. W ten sposób masz czysty kontroler, małą klasę jądrową i przyklejasz swoje zewnętrzne zachowanie w innej klasie, która słucha klasy bazowej. Zasadniczo zamiatarka jest tylko specjalistycznym przypadkiem jednej z tych klas cyklu życia i nie ma w niej nic z natury nie tak z punktu widzenia strategii. –

+0

Dlatego czuję się dziwny w usuwaniu zamiatarek z Rails 4. Rozumiem, że buforowanie stron/akcji jest złe, ale ponieważ buforowanie na niskim poziomie nadal wymaga zamiatania lub działania podobnego do zamiatania, nie widzę sensu ich usuwania :( – Happynoff

Powiązane problemy