Nouvelles Du Monde

Nouveau dans .NET 7.0 [19]: Statistiques pour le cache mémoire

Nouveau dans .NET 7.0 [19]: Statistiques pour le cache mémoire

2023-06-23 18:57:00

La classe MemoryCache dans l’espace de noms Microsoft.Extensions.Caching.Memory est assez ancien. Dans le .NET Framework classique, il existe depuis .NET Framework 4.0, dans le .NET moderne depuis .NET Core 2.1. Nouveau dans .NET 7.0 est la méthode GetCurrentStatistics()qui est un objet de type MemoryCacheStatistics avec quatre propriétés explicites :

Publicité


docteur Holger Schwichtenberg est expert en technologie en chef chez MAXIMAGO, qui propose un développement de logiciels axé sur l’innovation et l’expérience, y compris dans des domaines hautement critiques liés à la sécurité. Il est également à la tête du réseau d’experts www.IT-Visions.de, qui soutient de nombreuses moyennes et grandes entreprises avec des conseils et une formation dans le développement et l’exploitation de logiciels avec 38 experts renommés.

  • CurrentEntryCount
  • CurrentEstimatedSize
  • TotalHits
  • TotalMisses

La condition préalable est que vous disposiez des statistiques dans le MemoryCache activé :

using System.Runtime.Serialization.Formatters.Binary;
using ITVisions;
using Microsoft.Extensions.Caching.Memory;
 
namespace NET7Console;
 
internal class FCL_Caching
{
 
 /// 
 /// Klasse für das Objekt, das in den Cache soll
 /// 
 [Serializable]
 class Developer
 {
  public long ID { get; set; }
  public string? Name { get; set; }
  public string? Company { get; set; }
  public override string ToString()
  {
   return $"Developer {Name} entwickelt bei {Company}.";
  }
 
 }
 
 /// 
 /// Hilfsfunktion: Ermittelt die ungefähre Größe eines
 /// beliebigen .NET-Objekts per binärer Serialisierung
 /// 
 private int GetObjectSize(object TestObject)
 {
#pragma warning disable SYSLIB0011
  BinaryFormatter bf = new BinaryFormatter();
  MemoryStream ms = new MemoryStream();
  byte[] Array;
  bf.Serialize(ms, TestObject);
  Array = ms.ToArray();
  return Array.Length;
#pragma warning restore SYSLIB0011
 }
 
 public void MemoryCacheDemo()
 {
  CUI.H1("MemoryCacheDemo mit .NET 7.0" +  
         "(C) Dr. Holger Schwichtenberg 2022");
 
  var co = new MemoryCacheOptions();
  co.TrackStatistics = true;
  co.SizeLimit = 1024; // hier Einheit Bytes
  MemoryCache cache = new MemoryCache(co);
 
  CUI.PrintStep("Ein Objekt wird für fünf Sekunden" +
                "in den Zwischenspeicher gelegt");
  var d = new Developer() {
    ID = 123,
    Name = "Dr. Holger Schwichtenberg",
    Company = "MAXIMAGO GmbH" };
  Console.WriteLine(d);
  var g = GetObjectSize(d);
  Console.WriteLine("Größe des Objekts: " + g);
 
  var ceo = new MemoryCacheEntryOptions();
  ceo.Size = g;
  ceo.AbsoluteExpiration = DateTime.Now.AddSeconds(5);
  cache.Set("CurrentDeveloper", d, ceo);
 
  CUI.PrintStep("nNun wird in einer Schleife der " + 
                "Zwischenspeicher zehnmal im Abstand von " + 
                "einer Sekunde nach dem Wert gefragt und "+ 
                "die Statistik ausgeben.");
  for (int i = 0; i < 10; i++)
  {
   Object result;
   bool found = cache.TryGetValue("CurrentDeveloper", out result);
   if (result is not null) CUI.Success(result);
   else CUI.Warning("Cache ist leer!");
 
   MemoryCacheStatistics stats = cache.GetCurrentStatistics();
   Console.WriteLine(DateTime.Now);
   Console.WriteLine(stats.ToNameValueString());
   Console.WriteLine();
   System.Threading.Thread.Sleep(1000);
 
   var e = new FCL_MinimalEventCounterSource();
   e.Write("x");
  }
 }
}

Dans la sortie de la liste ci-dessus, vous pouvez voir que le cache renvoie l'objet développeur stocké et le nombre pendant les cinq premières secondes TotalHits compte plus. Après cela, il n'y a plus d'objet développeur et TotalMisses sera relevé.



TotalHits et TotalMisses comptent respectivement les accès au cache et les échecs au cache.

Autre conseil : L'évaluation de la taille utilisée avec CurrentEstimatedSize ne fonctionne que si je suis MemoryCache-Objet de la propriété SizeLimit est occupé et lors du stockage d'un objet dans le cache sa taille par propriété Size (ou méthode SetSize()) est spécifié. CurrentEstimatedSize et Size n'ont pas d'unité de mesure fixe. Vous devez déterminer vous-même l'unité de mesure. L'exemple ci-dessus suppose des octets.

Publicité


(rme)

Vers la page d'accueil



#Nouveau #dans #.NET #Statistiques #pour #cache #mémoire
1687610175

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT