Кэширование в C # /. Net

Я хотел спросить вас, что лучше всего подходит для реализации кеша на C #? Есть ли возможность с использованием заданных classов .NET или что-то в этом роде? Возможно, что-то вроде словаря, который удалит некоторые записи, если он станет слишком большим, но где чьи записи не будут удалены сборщиком мусора?

Если вы используете ASP.NET, вы можете использовать class Cache ( System.Web.Caching ).

Вот хороший вспомогательный class: c-cache-helper-class

Если вы имеете в виду кэширование в приложении Windows Form, это зависит от того, что вы пытаетесь сделать, и где вы пытаетесь кэшировать данные.

Мы реализовали кеш за Webservice для определенных методов
(используя объект System.Web.Caching .).

Однако вы также можете посмотреть блок приложения кэширования. ( См. Здесь), который является частью Enterprise Library для .NET Framework 2.0.

Если вы используете .NET 4 или выше, вы можете использовать class MemoryCache .

Вы можете использовать ObjectCache.

См. http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.aspx.

Классы кэша, поставляемые с .NET, удобны, но имеют серьезную проблему: они не могут хранить много данных (десятки миллионов +) объектов в течение длительного времени, не убивая ваш GC. Они отлично работают, если вы кэшируете несколько тысяч объектов, но в тот момент, когда вы переходите на миллионы и поддерживаете их до тех пор, пока они не будут распространяться в GEN2 – паузы GC в конечном итоге станут заметны, когда система достигнет порога низкой памяти, и GC необходимо подметать всех родов.

Практичность заключается в том, что если вам нужно хранить несколько сотен тысяч экземпляров, используйте кеш-память MS. Не имеет значения, являются ли ваши объекты 2-полевыми или 25 полями – это количество ссылок.

С другой стороны, есть случаи, когда необходимо использовать большие ОЗУ, которые являются общими в наши дни, то есть 64 ГБ. Для этого мы создали 100% управляемый менеджер памяти и кеш, который находится поверх него.

Наше решение может легко хранить 300 000 000 объектов в оперативной памяти без обхода GC вообще – это потому, что мы храним данные в больших (250 мб) байтах [] сегментах.

Вот код: NFX Pile (Apache 2.0)

И видео: NFX Pile Cache – Youtube

MemoryCache в каркасе – это хорошее место для начала, но вам также может понравиться библиотека с открытым исходным кодом LazyCache, поскольку она имеет более простой API, чем кеш памяти, и имеет встроенную блокировку, а также некоторые другие функции, поддерживающие разработчика. Он также доступен на nuget.

Чтобы привести пример:

 // Create our cache service using the defaults (Dependency injection ready). // Uses MemoryCache.Default as default so cache is shared between instances IAppCache cache = new CachingService(); // Declare (but don't execute) a func/delegate whose result we want to cache Func complexObjectFactory = () => methodThatTakesTimeOrResources(); // Get our ComplexObjects from the cache, or build them in the factory func // and cache the results for next time under the given key ComplexObject cachedResults = cache.GetOrAdd("uniqueKey", complexObjectFactory); 

Недавно я написал эту статью о начале работы с кешированием в dot net, что может оказаться полезным.

(Отказ от ответственности: я являюсь автором LazyCache)

Для местных магазинов

  • .NET MemoryCache
  • NCache Express
  • Кэширование AppFabric

Ваш вопрос нуждается в дополнительном разъяснении. C # – это язык, а не фреймворк. Вы должны указать, какую инфраструктуру вы хотите реализовать для кэширования. Если мы рассмотрим, что вы хотите реализовать его в ASP.NET, все равно полностью зависит от того, что вы хотите от Cache. Вы можете выбирать между кэшем в процессе (который будет хранить данные внутри кучи вашего приложения) и кэшем вне процесса (в этом случае вы можете хранить данные в другой памяти, чем куча, такая как Amazon Elastic cache server). И есть еще одно решение сделать, что происходит между кешированием клиентов или кешированием стороны стороны. Обычно в решении вам нужно разработать другое решение для кэширования разных данных. Поскольку база по четырем факторам (доступность, постоянство, размер, стоимость), вы должны принять решение, какое решение вам нужно.

Если вы ищете Cache что-то в ASP.Net, я бы посмотрел на class Cache. Например

 Hashtable menuTable = new Hashtable(); menuTable.add("Home","default.aspx"); Cache["menu"] = menuTable; 

Затем, чтобы восстановить его снова

 Hashtable menuTable = (Hashtable)Cache["menu"]; 

Вы можете использовать Hashtable

он имеет очень быстрый поиск, никаких ключевых столкновений и ваши данные не будут собирать мусор

  • Результаты кэширования запросов в django
  • Почему значения кеширования classа Integer в диапазоне от -128 до 127?
  • Борьба с кешированием на стороне клиента в Django
  • Что такое кеширование?
  • Каков наилучший метод для принудительного истечения кеша в ASP.NET?
  • Включение / выключение состояния сеанса для каждого controllerа / метода действий
  • Как хранить данные в кеше для повторного использования?
  • Как написать код, который лучше всего использует кеш процессора для повышения производительности?
  • Кэширование в asp.net-mvc
  • Как кэшировать данные в приложении MVC
  • Как предотвратить кэширование страницы html5?
  • Interesting Posts

    Отправка клавиши F1 – F12 с внешней клавиатурой с отсутствующими клавишами на iPad Pro с использованием программного обеспечения эмуляции SSH

    Как проверить статистику сообщений, отправленных на темы через FCM?

    Каков оптимальный способ хранения NSDate в NSUserDefaults?

    Время ожидания NSURLConnection?

    Samba Linux – Почему машины окон не отображаются и не следуют символическим ссылкам?

    Добавление сообщения лиц на перенаправленную страницу с помощью ExternalContext.redirect ()

    Восстановление потерянного раздела NTFS с поврежденным загрузочным сектором

    Критику моего неинтрузивного отладчика кучи

    Переключить Ctrl и Alt с помощью AutoHotKey без использования переключателя Alt-Tab?

    Как определить завершенный процесс Windows, если у меня все еще есть его PID?

    System.Windows.Threading.Dispatcher и WinForms?

    Найти 2 числа в несортированном массиве, равном заданной сумме

    Вызов псевдо-деструктора не уничтожает объект

    @autowired в статических classах

    Выбор размера экрана для Windows

    Давайте будем гением компьютера.