Я прочитал много информации о кэшировании страниц и частичном кэшировании страниц в приложении MVC. Тем не менее, я хотел бы знать, как вы будете кэшировать данные.
В моем сценарии я буду использовать LINQ to Entities (Entity Framework). При первом обращении к GetNames (или какому-либо методу) я хочу получить данные из базы данных. Я хочу сохранить результаты в кеше и при втором вызове использовать кэшированную версию, если она существует.
Может кто-нибудь показать пример того, как это будет работать, где это должно быть реализовано (модель?) И будет ли это работать.
Я видел это в традиционных приложениях ASP.NET, обычно для очень статичных данных.
asp.net-mvc
database
caching
Coolcoder
источник
источник
Ответы:
Ссылайтесь на dll System.Web в вашей модели и используйте System.Web.Caching.Cache
Немного упрощенно, но я думаю, это сработает. Это не специфично для MVC, и я всегда использовал этот метод для кэширования данных.
источник
DB.GetNames().AsQueryable
методом задержки запроса?Вот хороший и простой кеш-класс / сервис, который я использую:
Использование:
Поставщик кэша проверит, есть ли что-нибудь под именем «id кэша» в кэше, а если нет, то вызовет метод делегата для извлечения данных и сохранения их в кэше.
Пример:
источник
Я имею в виду пост ТТ и предлагаю следующий подход:
Ссылайтесь на dll System.Web в вашей модели и используйте System.Web.Caching.Cache
Вы не должны возвращать значение, перечитанное из кэша, поскольку вы никогда не узнаете, находится ли оно в данный момент в кэше. Даже если вы вставили его в оператор раньше, он может быть уже удален или никогда не был добавлен в кеш - вы просто не знаете.
Таким образом, вы добавляете данные, считанные из базы данных, и возвращаете их напрямую, а не перечитываете из кеша.
источник
Cache["names"] = noms;
помещается в кеш?Для .NET 4.5+ Framework
добавить ссылку:
System.Runtime.Caching
добавить использование оператора:
using System.Runtime.Caching;
Больше информации:
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
источник
Db.GerNames()
идет?Стив Смит сделал два отличных поста в блоге, которые демонстрируют, как использовать его шаблон CachedRepository в ASP.NET MVC. Он эффективно использует шаблон репозитория и позволяет вам получать кэширование без необходимости изменять существующий код.
http://ardalis.com/Introducing-the-CachedRepository-Pattern
http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
В этих двух постах он показывает, как настроить этот шаблон, а также объясняет, почему он полезен. Используя этот шаблон, вы получаете кеширование, при котором существующий код не видит никакой логики кеширования. По сути, вы используете кэшированный репозиторий, как если бы это был любой другой репозиторий.
источник
Кэширование AppFabric - это распределенная технология кэширования в памяти, которая хранит данные в парах ключ-значение с использованием физической памяти на нескольких серверах. AppFabric обеспечивает улучшения производительности и масштабируемости для приложений .NET Framework. Концепции и архитектура
источник
Расширяя ответ @Hrvoje Hudo ...
Код:
Примеры
Кэширование отдельного элемента (когда каждый элемент кэшируется на основе его идентификатора, потому что кэширование всего каталога для типа элемента будет слишком интенсивным).
Кеширование всего чего-либо
Почему
Второй помощник особенно хорош, потому что большинство ключей данных не являются составными. Дополнительные методы могут быть добавлены, если вы часто используете составные ключи. Таким образом, вы избегаете всякой конкатенации строк или форматов строк. Чтобы получить ключ для передачи помощнику кеша. Это также облегчает передачу метода доступа к данным, потому что вам не нужно передавать идентификатор в метод-оболочку ... все становится очень кратким и последовательным для большинства случаев использования.
источник
Вот улучшение ответа Хрвое Худо. Эта реализация имеет несколько ключевых улучшений:
Обратите внимание, что это зависит от Newtonsoft.Json, чтобы сериализовать объект depenOn, но это может быть легко заменено для любого другого метода сериализации.
ICache.cs
InMemoryCache.cs
Использование:
источник
if (item == null)
Должен быть внутри замка. Теперь, когда этоif
до блокировки, может возникнуть состояние гонки. Или, что еще лучше, вы должны сохранитьif
перед блокировкой, но перепроверить, если кэш все еще пуст в качестве первой строки внутри блокировки. Потому что, если два потока приходят одновременно, они оба обновляют кеш. Ваша текущая блокировка не помогает.источник
Я использовал это таким образом, и это работает для меня. https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx информация о параметрах для system.web.caching.cache.add.
источник
Я использую два класса. Первый объект ядра кеша:
Второй - список объектов кеша:
источник
Я скажу, что реализация Singleton для решения этой постоянной проблемы с данными может быть решением в этом случае, если вы находите предыдущие решения намного сложнее
источник
источник
Вы также можете попробовать использовать кэширование, встроенное в ASP MVC:
Добавьте следующий атрибут в метод контроллера, который вы хотите кэшировать:
В этом случае ActionResult этого будет кэшироваться в течение 10 секунд.
Подробнее об этом здесь
источник