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ąć.
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
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. –
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