Кэширование в С#/. Net
Я хотел спросить вас, какой лучший подход к реализации кеша в С#? Есть ли возможность, используя данные .Net-классы или что-то в этом роде? Возможно, что-то вроде словаря, который удалит некоторые записи, если он станет слишком большим, но чьи записи не будут удалены сборщиком мусора?
Заранее спасибо
Себастьян
Ответы
Ответ 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.
Ответ 3
Вы можете использовать ObjectCache.
См. http://msdn.microsoft.com/en-us/library/system.runtime.caching.objectcache.aspx
Ответ 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)
Ответ 6
Для локальных магазинов
Ответ 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
он имеет очень быстрый поиск, никаких коллизий ключей и ваши данные не будут собирать мусор.