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.
.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
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]);
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.
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
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