.NET 7.0’daki yenilikler [19]: Bellek önbelleği için istatistikler

Womanne

Member
Sınıf MemoryCache ad alanında Microsoft.Extensions.Caching.Memory oldukça eski. Klasik .NET Framework’te .NET Framework 4.0’dan beri, modern .NET’te .NET Core 2.1’den beri mevcuttur. .NET 7.0’da yeni olan yöntem GetCurrentStatistics()türde bir nesne olan MemoryCacheStatistics kendini açıklayan dört özellikle:

Duyuru








Dr Holger Schwichtenberg, MAXIMAGO’da Güvenlikle ilgili son derece kritik alanlarda bile yenilik ve deneyime dayalı yazılım geliştirme sunan Baş Teknoloji Uzmanıdır. Aynı zamanda, çok sayıda orta ölçekli ve büyük şirketi yazılım geliştirme ve işletim konusunda 38 tanınmış uzmanla danışmanlık ve eğitimle destekleyen uzman ağı www.IT-Visions.de’nin başkanıdır.







  • CurrentEntryCount
  • CurrentEstimatedSize
  • TotalHits
  • TotalMisses
Önkoşul, dosyada istatistiklere sahip olmanızdır. MemoryCache Aktif:


using System.Runtime.Serialization.Formatters.Binary;
using ITVisions;
using Microsoft.Extensions.Caching.Memory;

namespace NET7Console;

internal class FCL_Caching
{

/// <summary>
/// Klasse für das Objekt, das in den Cache soll
/// </summary>
[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}.";
}

}

/// <summary>
/// Hilfsfunktion: Ermittelt die ungefähre Größe eines
/// beliebigen .NET-Objekts per binärer Serialisierung
/// </summary>
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");
}
}
}



Yukarıdaki listenin çıktısında, önbelleğin ilk beş saniye için arşivlenen geliştirici nesnesini ve numarasını döndürdüğünü görebilirsiniz. TotalHits daha yüksek sayın. Bundan sonra başka geliştirici nesnesi yoktur ve TotalMisses kaldırılacak.







TotalHits ve TotalMisses, sırasıyla önbellek isabetlerini ve önbellek kayıplarını sayar.



Başka bir ipucu: kullanılan boyutun derecelendirmesi CurrentEstimatedSize sadece im varsa çalışır MemoryCache-Mülkiyete tabi SizeLimit meşgul ve bir nesneyi önbelleğe alırken özelliğine göre boyutu Size (veya yöntem SetSize()) belirtilir. CurrentEstimatedSize VE Size sabit ölçü birimleri yoktur. Ölçü birimini kendiniz belirlemelisiniz. Yukarıdaki örnek bayt varsayar.

Duyuru


(rm)



Haberin Sonu
 
Üst