web-dev-qa-db-fra.com

Vous cherchez un exemple de cache très simple

Je cherche un exemple simple et concret sur la manière d’ajouter un objet au cache, de le récupérer et de le supprimer.

La deuxième réponse ici est le genre d’exemple que j'aimerais voir ...

List<object> list = new List<Object>();

Cache["ObjectList"] = list;                 // add
list = ( List<object>) Cache["ObjectList"]; // retrieve
Cache.Remove("ObjectList");                 // remove

Mais quand j'essaye cela, sur la première ligne, je reçois:

'Cache' est un type qui n'est pas valide dans le contexte donné. 

Et à la troisième ligne, je reçois:

Une méthode objet est requise pour le champ non statique bla bla bla

Alors, disons que j'ai un List<T>...

var myList = GetListFromDB()

Et maintenant, je veux juste ajouter myList à la mémoire cache, la récupérer et la supprimer.

13
Casey Crookston

.NET fournit quelques classes de cache

  • System.Web.Caching.Cache - mechanizm de mise en cache par défaut dans ASP.NET. Vous pouvez obtenir une instance de cette classe via la propriété Controller.HttpContext.Cache et vous pouvez l'obtenir via singleton HttpContext.Current.Cache. Cette classe n'est pas censée être créée explicitement car elle utilise sous le capot un autre moteur de mise en cache, attribué en interne. 

    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 - cette classe peut être construite en code utilisateur. Il possède une interface différente et plusieurs fonctionnalités telles que update\remove, les rappels, les régions, les moniteurs, etc. Pour l'utiliser, vous devez importer la bibliothèque System.Runtime.Caching. Il peut également être utilisé dans une application ASP.net, mais vous devrez gérer sa durée de vie par vous-même.

    var cache = new System.Runtime.Caching.MemoryCache("MyTestCache");
    cache["ObjectList"] = list;                 // add
    list = (List<object>)cache["ObjectList"]; // retrieve
    cache.Remove("ObjectList");                 // remove
    
14
Yuri Tceretian

Si vous utilisez MemoryCache, voici un exemple très simple:

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]);
8
Kelly

Voici comment je l'ai fait par le passé:

     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)
        };

       _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>;
    }

EDIT: Formatage.

BTW, vous pouvez le faire avec n'importe quoi. J'ai utilisé cette option conjointement avec la sérialisation pour stocker et récupérer une liste d'objets de 150 Ko.

7
Matthew Alltop

J'ai écrit LazyCache pour rendre cela aussi simple et facile que possible, tout en veillant à n'exécuter que vos appels de fonction pouvant être mis en cache, même si deux threads tentent de les mettre en cache en même temps.

Exécutez la commande suivante dans la console du gestionnaire de packages

PM> Install-Package LazyCache

Ajoutez l'espace de noms en haut de votre classe

using LazyCache;

et maintenant cache des choses:

// 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");

En savoir plus sur le modèle cache-cache ou dans le les documents LazyCache

3
alastairtree

Essayez ce cache tiers: CacheCrow , c’est un cache simple basé sur LFU.

Installer à l'aide de la commande powershell dans Visual Studio: Install-Package CacheCrow

Extrait de code: 

 // 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");

Pour plus d'informations, vous pouvez visiter: https://github.com/RishabKumar/CacheCrow

1
Rishabh Kumar