Przeczytałem wiele informacji o buforowaniu stron i częściowym buforowaniu stron w aplikacji MVC. Chciałbym jednak wiedzieć, w jaki sposób można buforować dane.
W moim scenariuszu będę używać LINQ do encji (struktura encji). Przy pierwszym wywołaniu GetNames (lub jakiejkolwiek innej metody) chcę pobrać dane z bazy danych. Chcę zapisać wyniki w pamięci podręcznej i przy drugim wywołaniu, aby użyć wersji buforowanej, jeśli istnieje.
Czy ktoś może pokazać przykład, jak to by działało, gdzie to powinno zostać zaimplementowane (model?) I czy to by działało.
Widziałem to w tradycyjnych aplikacjach ASP.NET, zwykle dla bardzo statycznych danych.
asp.net-mvc
database
caching
Coolcoder
źródło
źródło
Odpowiedzi:
Odwołaj się do biblioteki DLL System.Web w swoim modelu i użyj System.Web.Caching.Cache
Trochę uproszczone, ale myślę, że to zadziała. Nie jest to specyficzne dla MVC i zawsze używałem tej metody do buforowania danych.
źródło
DB.GetNames().AsQueryable
metodą opóźniania zapytania?Oto miła i prosta klasa / usługa pomocnika pamięci podręcznej, z której korzystam:
Stosowanie:
Dostawca pamięci podręcznej sprawdzi, czy w pamięci podręcznej jest coś o nazwie „identyfikator pamięci podręcznej”, a jeśli nie, wywoła metodę delegowania w celu pobrania danych i zapisania ich w pamięci podręcznej.
Przykład:
źródło
Odnoszę się do postu TT i sugeruję następujące podejście:
Odwołaj się do biblioteki DLL System.Web w swoim modelu i użyj System.Web.Caching.Cache
Nie powinieneś zwracać wartości ponownie odczytanej z pamięci podręcznej, ponieważ nigdy nie dowiesz się, czy w danym momencie nadal znajduje się w pamięci podręcznej. Nawet jeśli wstawiłeś go wcześniej do instrukcji, być może już go nie ma lub nigdy nie został dodany do pamięci podręcznej - po prostu nie wiesz.
Więc dodajesz dane odczytane z bazy danych i zwracasz je bezpośrednio, a nie ponowne czytanie z pamięci podręcznej.
źródło
Cache["names"] = noms;
umieszczana w pamięci podręcznej?Dla platformy .NET 4.5+
dodaj referencję:
System.Runtime.Caching
dodaj za pomocą instrukcji:
using System.Runtime.Caching;
Więcej informacji:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
https://docs.microsoft.com/en-us/dotnet/framework/performance/caching-in-net-framework-applications
źródło
Db.GerNames()
pochodzi?Steve Smith napisał dwa świetne posty na blogu, które pokazują, jak używać wzorca CachedRepository w ASP.NET MVC. Efektywnie wykorzystuje wzorzec repozytorium i pozwala uzyskać buforowanie bez konieczności zmiany istniejącego kodu.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
W tych dwóch postach pokazuje, jak skonfigurować ten wzór, a także wyjaśnia, dlaczego jest on użyteczny. Korzystając z tego wzorca, uzyskujesz buforowanie, a istniejący kod nie widzi logiki buforowania. Zasadniczo używasz buforowanego repozytorium tak, jakby to było inne repozytorium.
źródło
AppFabric Caching jest rozproszone i technika buforowania w pamięci, która przechowuje dane w parach klucz-wartość za pomocą pamięci fizycznej na wielu serwerach. AppFabric zapewnia ulepszenia wydajności i skalowalności aplikacji .NET Framework. Koncepcje i architektura
źródło
Rozszerzając odpowiedź @Hrvoje Hudo ...
Kod:
Przykłady
Buforowanie pojedynczego elementu (gdy każdy element jest buforowany na podstawie jego identyfikatora, ponieważ buforowanie całego katalogu dla typu elementu byłoby zbyt intensywne).
Buforowanie wszystkiego
Dlaczego TId
Drugi pomocnik jest szczególnie miły, ponieważ większość kluczy danych nie jest złożona. Dodatkowe metody można dodać, jeśli często używasz kluczy kompozytowych. W ten sposób unikasz wykonywania wszelkiego rodzaju konkatenacji łańcuchów lub łańcuchów. Formaty, aby uzyskać klucz do przekazania do pomocnika pamięci podręcznej. Ułatwia także przekazywanie metody dostępu do danych, ponieważ nie trzeba przekazywać identyfikatora do metody otoki ... całość staje się bardzo zwięzła i spójna w większości przypadków użycia.
źródło
Oto poprawka do odpowiedzi Hrvoje Hudo. Ta implementacja ma kilka kluczowych ulepszeń:
Zauważ, że jest to zależne od Newtonsoft.Json do serializacji obiektu dependOn, ale można to łatwo wymienić na dowolną inną metodę serializacji.
ICache.cs
InMemoryCache.cs
Stosowanie:
źródło
if (item == null)
Powinny być wewnątrz zamka. Teraz, gdyif
jest to przed śluzą, mogą wystąpić warunki wyścigu. Lub jeszcze lepiej, powinieneś trzymaćif
przed blokadą, ale sprawdź ponownie, czy pamięć podręczna jest nadal pusta jako pierwsza linia w zamku. Ponieważ jeśli dwa wątki pojawią się w tym samym czasie, oba zaktualizują pamięć podręczną. Twoja obecna blokada nie jest pomocna.źródło
Użyłem go w ten sposób i działa dla mnie. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx informacje o parametrach dla system.web.caching.cache.add.
źródło
Używam dwóch klas. Najpierw obiekt rdzenia pamięci podręcznej:
Drugi to lista obiektów pamięci podręcznej:
źródło
Powiem, że wdrożenie Singleton w tym utrzymującym się problemie z danymi może być rozwiązaniem tego problemu, na wypadek gdyby poprzednie rozwiązania były bardzo skomplikowane
źródło
źródło
Możesz także spróbować użyć buforowania wbudowanego w ASP MVC:
Dodaj następujący atrybut do metody kontrolera, którą chcesz buforować:
W takim przypadku ActionResult będzie buforowany przez 10 sekund.
Więcej na ten temat tutaj
źródło