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é.
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)
#Nouveau #dans #.NET #Statistiques #pour #cache #mémoire
1687610175