Ищете очень простой пример кеша

Я ищу простой пример того, как добавить объект в кеш, вернуть его обратно и удалить его.

Второй ответ здесь - это тот пример, который мне бы хотелось увидеть...

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