Ищете очень простой пример кеша
Я ищу простой пример того, как добавить объект в кеш, вернуть его обратно и удалить его.
Второй ответ здесь - это тот пример, который мне бы хотелось увидеть...
List<object> list = new List<Object>();
Cache["ObjectList"] = list; // add
list = ( List<object>) Cache["ObjectList"]; // retrieve
Cache.Remove("ObjectList"); // remove
Но когда я пробую это, в первой строке я получаю:
"Кэш" - это тип, который недопустим в данном контексте.
И на третьей строке я получаю:
Объектный метод необходим для нестатического поля blah blah blah
Итак, скажем, у меня есть List<T>
...
var myList = GetListFromDB()
И теперь я просто хочу добавить myList
в кеш, вернуть его и удалить.
Ответы
Ответ 1
.NET предоставляет несколько классов кэша
-
System.Web.Caching.Cache - механизм кэширования по умолчанию в ASP.NET. Вы можете получить экземпляр этого класса через свойство Controller.HttpContext.Cache
, и вы можете получить его через singleton HttpContext.Current.Cache
. Этот класс, как ожидается, не будет создан явно, потому что под капотом он использует другой механизм кэширования, который назначается внутренне.
Чтобы сделать ваш код более простым, нужно сделать следующее:
public class AccountController : System.Web.Mvc.Controller{
public System.Web.Mvc.ActionResult Index(){
List<object> list = new List<Object>();
HttpContext.Cache["ObjectList"] = list; // add
list = (List<object>)HttpContext.Cache["ObjectList"]; // retrieve
HttpContext.Cache.Remove("ObjectList"); // remove
return new System.Web.Mvc.EmptyResult();
}
}
-
System.Runtime.Caching.MemoryCache - этот класс может быть сконструирован в коде пользователя. Он имеет различный интерфейс и дополнительные функции, такие как update\remove callbacks, регионы, мониторы и т.д. Чтобы использовать его, вам нужно импортировать библиотеку System.Runtime.Caching
. Он также может использоваться в приложении ASP.net, но вам придется самому управлять своей жизнью.
var cache = new System.Runtime.Caching.MemoryCache("MyTestCache");
cache["ObjectList"] = list; // add
list = (List<object>)cache["ObjectList"]; // retrieve
cache.Remove("ObjectList"); // remove
Ответ 2
Вот способ, которым я делал это в прошлом:
private static string _key = "foo";
private static readonly MemoryCache _cache = MemoryCache.Default;
//Store Stuff in the cache
public static void StoreItemsInCache()
{
List<string> itemsToAdd = new List<string>();
//Do what you need to do here. Database Interaction, Serialization,etc.
var cacheItemPolicy = new CacheItemPolicy()
{
//Set your Cache expiration.
AbsoluteExpiration = DateTime.Now.AddDays(1)
};
//remember to use the above created object as third parameter.
_cache.Add(_key, itemsToAdd, cacheItemPolicy);
}
//Get stuff from the cache
public static List<string> GetItemsFromCache()
{
if (!_cache.Contains(_key))
StoreItemsInCache();
return _cache.Get(_key) as List<string>;
}
//Remove stuff from the cache. If no key supplied, all data will be erased.
public static void RemoveItemsFromCache(_key)
{
if (string.IsNullOrEmpty(_key))
{
_cache.Dispose();
}
else
{
_cache.Remove(_key);
}
}
РЕДАКТИРОВАТЬ: форматирование.
Кстати, вы можете сделать это с чем угодно. Я использовал это в сочетании с сериализацией для хранения и извлечения списка объектов размером 150КБ.
Ответ 3
Если вы используете MemoryCache здесь, это очень простой пример:
var cache = MemoryCache.Default;
var key = "myKey";
var value = "my value";
var policy = new CacheItemPolicy { SlidingExpiration = new TimeSpan(2, 0, 0) };
cache.Add(key, value, policy);
Console.Write(cache[key]);
Ответ 4
Я написал LazyCache, чтобы сделать это максимально простым и безболезненным, а также удостовериться, что вы выполняете только свои функции кешируемой функции один раз, даже если два потока пытаются одновременно кэшировать их.
Выполните следующую команду в консоли диспетчера пакетов
PM> Install-Package LazyCache
Добавьте пространство имен в верхней части класса
using LazyCache;
и теперь материал кеша:
// Create the cache - (in constructor or using dependency injection)
IAppCache cache = new CachingService();
// Get products from the cache, or if they are not
// cached then get from db and cache them, in one line
var products = cache.GetOrAdd("get-products", () => dbContext.Products.ToList());
// later if you want to remove them
cache.Remove("get-products");
Подробнее о кеше в сторону шаблона или в Документы LazyCache
Ответ 5
Попробуйте использовать сторонний кеш: CacheCrow, это простой кеш на основе LFU.
Установить с помощью команды powershell в visual studio: Install-Package CacheCrow
Фрагмент кода:
// initialization of singleton class
ICacheCrow<string, string> cache = CacheCrow<string, string>.Initialize(1000);
// adding value to cache
cache.Add("#12","Jack");
// searching value in cache
var flag = cache.LookUp("#12");
if(flag)
{
Console.WriteLine("Found");
}
// removing value
var value = cache.Remove("#12");
Дополнительную информацию вы можете найти: https://github.com/RishabKumar/CacheCrow