Подтвердить что ты не робот

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

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

Заранее спасибо

Себастьян

4b9b3361

Ответ 1

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

Вот хороший класс-помощник: c-cache-helper-class

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

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

Однако вы также можете посмотреть блок приложения кэширования. (Смотрите здесь)
Что входит в состав Enterprise Library для .NET Framework 2.0.

Ответ 2

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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<ComplexObjects> 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)

Ответ 7

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

Ответ 8

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

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

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

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

Ответ 9

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

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