.NET Önbelleğe Alma de yeni bir

Bu makalede, çeşitli önbelleğe alma mekanizmaları hakkında bilgi bulabilirsiniz. Önbelleğe Alma, sonraki veri almalarını daha hızlı hale getirmenin bir ara katmanda depolanması işlemidir. Kavramsal olarak, önbelleğe alma bir performans iyileştirme stratejisi ve tasarım konularıdır. Önbelleğe Alma seyrek değişen (veya pahalıya alınan) verileri daha hazır hale yaparak uygulama performansını önemli ölçüde geliştirebilir. Bu makalede, iki birincil önbelleğe alma türü tanıtır ve her ikisi için de örnek kaynak kodu sağlar:

Önemli

MemoryCache.NET içinde biri ad alanlarında, diğeri ad alanı içinde olmak için iki sınıf System.Runtime.Caching Microsoft.Extensions.Caching vardır:

Bu makale önbelleğe alma üzerine odaklansa da, NuGet System.Runtime.Caching dahil değildir. için tüm MemoryCache başvurular ad alanı Microsoft.Extensions.Caching içindedir.

Tüm paketler Microsoft.Extensions.* bağımlılık eklemeye (DI) hazır hale gelir; hem hem de IMemoryCache IDistributedCache arabirimleri hizmet olarak kullanılabilir.

Bellek içi önbellek

Bu bölümde paket hakkında bilgi Microsoft.Extensions.Caching.Memory edinebilirsiniz. geçerli uygulaması, IMemoryCache zengin özellik API'sini ortaya çıkararak çevresinde ConcurrentDictionary<TKey,TValue> bir sarmalayıcıdır. Önbellek içindeki girişler ile temsil edilen ICacheEntry ve herhangi bir object olabilir. Bellek içinde önbellek çözümü, önbelleğe alınan tüm verilerin uygulamanın sürecinde bellek kiraya sahip olduğu tek bir sunucuda çalıştıran uygulamalar için harikadır.

İpucu

Çok sunuculu önbelleğe alma senaryolarında, Bellek içinde önbelleğe almaya alternatif olarak Dağıtılmış önbelleğe alma yaklaşımını göz önünde bulundurabilirsiniz.

Bellek içinde önbelleğe alma API'si

Önbelleğin tüketicisi hem kayan hem de mutlak süre sonu üzerinde denetime sahip olur:

Süre sonu ayarı, süre sonu süresinde erişilemediklerinde önbellekte bulunan girişlerin çıkarılamayacak olmasına neden olur. Tüketiciler, aracılığıyla önbellek girdilerini denetlemek için ek seçeneklere MemoryCacheEntryOptions sahiptir. Her biri ile eşleştirilmiştir; bu, ile süre sonu çıkarma işlevini, ICacheEntry ile öncelik ayarlarını gösterir ve MemoryCacheEntryOptions IChangeToken CacheItemPriority denetimine ICacheEntry.Size sahiptir. Aşağıdaki uzantı yöntemlerini göz önünde bulundurarak:

Bellek içinde önbellek örneği

Varsayılan uygulamasını kullanmak IMemoryCache için uzantı yöntemini AddMemoryCache çağırarak tüm gerekli hizmetleri DI'ye kaydetmeniz gerekir. Aşağıdaki kod örneğinde, işlevselliği ortaya çıkarmak için genel ana ConfigureServices bilgisayar kullanılır:

using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services => services.AddMemoryCache())
    .Build();

.NET iş yükünüze bağlı olarak, oluşturucu ekleme IMemoryCache gibi farklı şekilde erişebilirsiniz. Bu örnekte, üzerinde örneğini IServiceProvider kullanır ve genel uzantı yöntemini host GetRequiredService<T>(IServiceProvider) çağırarak:

IMemoryCache cache =
    host.Services.GetRequiredService<IMemoryCache>();

Bellek içinde önbelleğe alma hizmetleri kaydedildi ve DI aracılığıyla — çözümlendi. Önbelleğe almayı başlatmaya hazır oluruz. Bu örnek, 'A' ile 'Z' diline kadar İngilizce alfabesinde yer alan harflerde de aynı şekilde ilerler. Harf record başvurularını tutan ve bir ileti oluşturan bir vardır.

record AlphabetLetter(char Letter)
{
    internal string Message =>
        $"The '{Letter}' character is the {Letter - 64} letter in the English alphabet.";
}

Örnek, alfabetik harflerde geçen bir yardımcı işlev içerir:

static async ValueTask IterateAlphabetAsync(
    Func<char, Task> asyncFunc)
{
    for (char letter = 'A'; letter <= 'Z'; ++ letter)
    {
        await asyncFunc(letter);
    }

    Console.WriteLine();
}

Yukarıdaki C# kodunda:

  • Func<char, Task> asyncFuncher yinelemede beklir ve geçerli 'i letter iletir.
  • Tüm harfler işlendikten sonra konsola boş bir satır yazılır.

Önbelleğe öğe eklemek için , veya API'lerinden Create Set birini çağırabilirsiniz:

await IterateAlphabetAsync(letter =>
{
    MemoryCacheEntryOptions options = new()
    {
        AbsoluteExpirationRelativeToNow =
            TimeSpan.FromMilliseconds(MillisecondsAbsoluteExpiration)
    };

    _ = options.RegisterPostEvictionCallback(OnPostEviction);

    AlphabetLetter alphabetLetter =
        cache.Set(
            letter, new AlphabetLetter(letter), options);

    Console.WriteLine($"{alphabetLetter.Letter} was cached.");

    return Task.Delay(
        TimeSpan.FromMilliseconds(MillisecondsDelayAfterAdd));
});

Yukarıdaki C# kodunda:

  • çağrılma IterateAlphabetAsync bekleniyor.
  • Func<char, Task> asyncFuncbir lambda ile tartışıldı.
  • MemoryCacheEntryOptions, şu an için mutlak bir süre sonu ile örneklenmiş.
  • Çıkarma sonrası geri çağırma kaydedilir.
  • Bir AlphabetLetter nesne örneği haline geldi ve ve ile birlikte içine Set letter options geçirildi.
  • Harf önbelleğe alınmış olarak konsola yazılır.
  • Son olarak, Task.Delay döndürülür.

Alfabede yer alan her harf için, süre sonu ve çıkarma geri çağırma sonrası bir önbellek girişi yazılır.

Çıkarma sonrası geri çağırma, konsola çıkarıldığı değerin ayrıntılarını yazar:

static void OnPostEviction(
    object key, object letter, EvictionReason reason, object state)
{
    if (letter is AlphabetLetter alphabetLetter)
    {
        Console.WriteLine($"{alphabetLetter.Letter} was evicted for {reason}.");
    }
};

Artık önbellek doldurulduğundan, için başka bir çağrı IterateAlphabetAsync bekleniyor, ancak bu kez çağıracaksiniz: IMemoryCache.TryGetValue

await IterateAlphabetAsync(letter =>
{
    if (cache.TryGetValue(letter, out object? value) &&
        value is AlphabetLetter alphabetLetter)
    {
        Console.WriteLine($"{letter} is still in cache. {alphabetLetter.Message}");
    }

    return Task.CompletedTask;
});

anahtarı cache letter içeriyorsa ve value bir örneği ise AlphabetLetter konsola yazılır. Anahtar önbellekte yer almamışsa çıkarıldı ve çıkarma letter sonrası geri çağırma çağrıldı.

Ek uzantı yöntemleri

, zaman uyumsuz dahil olmak üzere birçok kolaylık IMemoryCache tabanlı genişletme yöntemiyle birlikte GetOrCreateAsync gelir:

Hepsini bir araya getirin

Örnek uygulama kaynak kodunun tamamı üst düzey bir programdır ve iki farklı NuGet gerektirir:

using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services => services.AddMemoryCache())
    .Build();

IMemoryCache cache =
    host.Services.GetRequiredService<IMemoryCache>();

const int MillisecondsDelayAfterAdd = 50;
const int MillisecondsAbsoluteExpiration = 750;

static void OnPostEviction(
    object key, object letter, EvictionReason reason, object state)
{
    if (letter is AlphabetLetter alphabetLetter)
    {
        Console.WriteLine($"{alphabetLetter.Letter} was evicted for {reason}.");
    }
};

static async ValueTask IterateAlphabetAsync(
    Func<char, Task> asyncFunc)
{
    for (char letter = 'A'; letter <= 'Z'; ++ letter)
    {
        await asyncFunc(letter);
    }

    Console.WriteLine();
}

await IterateAlphabetAsync(letter =>
{
    MemoryCacheEntryOptions options = new()
    {
        AbsoluteExpirationRelativeToNow =
            TimeSpan.FromMilliseconds(MillisecondsAbsoluteExpiration)
    };

    _ = options.RegisterPostEvictionCallback(OnPostEviction);

    AlphabetLetter alphabetLetter =
        cache.Set(
            letter, new AlphabetLetter(letter), options);

    Console.WriteLine($"{alphabetLetter.Letter} was cached.");

    return Task.Delay(
        TimeSpan.FromMilliseconds(MillisecondsDelayAfterAdd));
});

await IterateAlphabetAsync(letter =>
{
    if (cache.TryGetValue(letter, out object? value) &&
        value is AlphabetLetter alphabetLetter)
    {
        Console.WriteLine($"{letter} is still in cache. {alphabetLetter.Message}");
    }

    return Task.CompletedTask;
});

await host.RunAsync();

record AlphabetLetter(char Letter)
{
    internal string Message =>
        $"The '{Letter}' character is the {Letter - 64} letter in the English alphabet.";
}

Önbelleğe alınan girişlerin süre sonu ve çıkarma davranışında yapılan değişiklikleri gözlemlemek için ve MillisecondsDelayAfterAdd MillisecondsAbsoluteExpiration değerlerini ayarlayabilirsiniz. Aşağıda, bu kodu çalıştırmanın örnek çıktısı ve .NET olaylarının belirlenmci olmayan doğası nedeniyle çıkışının aynı olacağının — garantisi yoktur.

A was cached.
B was cached.
C was cached.
D was cached.
E was cached.
F was cached.
G was cached.
H was cached.
I was cached.
J was cached.
K was cached.
L was cached.
M was cached.
N was cached.
O was cached.
P was cached.
Q was cached.
R was cached.
S was cached.
T was cached.
U was cached.
V was cached.
W was cached.
X was cached.
Y was cached.
Z was cached.

Q is still in cache. The 'Q' character is the 17 letter in the English alphabet.
R is still in cache. The 'R' character is the 18 letter in the English alphabet.
S is still in cache. The 'S' character is the 19 letter in the English alphabet.
T is still in cache. The 'T' character is the 20 letter in the English alphabet.
U is still in cache. The 'U' character is the 21 letter in the English alphabet.
D was evicted for Expired.
C was evicted for Expired.
G was evicted for Expired.
E was evicted for Expired.
F was evicted for Expired.
B was evicted for Expired.
M was evicted for Expired.
V is still in cache. The 'V' character is the 22 letter in the English alphabet.
H was evicted for Expired.
I was evicted for Expired.
J was evicted for Expired.
K was evicted for Expired.
L was evicted for Expired.
A was evicted for Expired.
N was evicted for Expired.
W is still in cache. The 'W' character is the 23 letter in the English alphabet.
O was evicted for Expired.
P was evicted for Expired.
X is still in cache. The 'X' character is the 24 letter in the English alphabet.
Y is still in cache. The 'Y' character is the 25 letter in the English alphabet.
Z is still in cache. The 'Z' character is the 26 letter in the English alphabet.

Mutlak süre sonu ( MemoryCacheEntryOptions.AbsoluteExpirationRelativeToNow ) ayarıldığı için, önbelleğe alınan tüm öğeler sonunda çıkar.

Çalışan Hizmeti önbelleğe alma

Verileri önbelleğe alma stratejilerinden biri, önbelleği tüketen veri hizmetlerinden bağımsız olarak güncelleştirmektir. Çalışan Hizmeti şablonu, diğer uygulama kodundan bağımsız BackgroundService (veya arka planda) çalıştırıla birlikte harika bir örnektir. Uygulamasının bir uygulamasını barındıran bir uygulama çalışmaya başladığında, karşılık gelen uygulama (bu durumda veya IHostedService BackgroundService "çalışan") aynı işlemde çalışmaya başlar. Bu barındırılan hizmetler, genişletme yöntemi aracılığıyla DI'ye tekli AddHostedService<THostedService>(IServiceCollection) olarak kaydedilir. Diğer hizmetler herhangi bir hizmet ömrü ile DI'ye kayded olabilir.

Önemli

Hizmet yaşam sürelerini anlamak çok önemlidir. Tüm bellek içinde önbelleğe alma hizmetlerini kaydetmek için çağırarak AddMemoryCache hizmetler tekli olarak kaydedilir.

Fotoğraf hizmeti senaryosu

Imagine HTTP üzerinden erişilebilen üçüncü taraf API'sini kullanan bir fotoğraf hizmeti geliştiriyoruz. Bu fotoğraf verileri çok sık değişmez ama çok fazla veri var. Her fotoğraf basit bir ile temsil record edildi:

namespace CachingExamples.Memory;

public record Photo(
    int AlbumId,
    int Id,
    string Title,
    string Url,
    string ThumbnailUrl);

Aşağıdaki örnekte, DI'ye kayıtlı birkaç hizmet olduğunu görüyorsunuz. Her hizmetin tek bir sorumluluğu vardır.

using CachingExamples.Memory;

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddMemoryCache();
        services.AddHttpClient<CacheWorker>();
        services.AddHostedService<CacheWorker>();
        services.AddScoped<PhotoService>();
        services.AddSingleton(typeof(CacheSignal<>));
    })
    .Build();

await host.StartAsync();

Yukarıdaki C# kodunda:

, PhotoService verilen ölçütlere uyan fotoğraflar almaktan sorumludur (veya filter ):

using Microsoft.Extensions.Caching.Memory;

namespace CachingExamples.Memory;

public sealed class PhotoService
{
    private readonly IMemoryCache _cache;
    private readonly CacheSignal<Photo> _cacheSignal;
    private readonly ILogger<PhotoService> _logger;

    public PhotoService(
        IMemoryCache cache,
        CacheSignal<Photo> cacheSignal,
        ILogger<PhotoService> logger) =>
        (_cache, _cacheSignal, _logger) = (cache, cacheSignal, logger);

    public async IAsyncEnumerable<Photo> GetPhotosAsync(Func<Photo, bool>? filter = default)
    {
        try
        {
            await _cacheSignal.WaitAsync();

            Photo[] photos =
                await _cache.GetOrCreateAsync(
                    "Photos", _ =>
                    {
                        _logger.LogWarning("This should never happen!");

                        return Task.FromResult(Array.Empty<Photo>());
                    });

            // If no filter is provided, use a pass-thru.
            filter ??= _ => true;

            foreach (Photo? photo in photos)
            {
                if (photo is not null && filter(photo))
                {
                    yield return photo;
                }
            }
        }
        finally
        {
            _cacheSignal.Release();
        }
    }
}

Yukarıdaki C# kodunda:

  • Oluşturucu , IMemoryCache ve CacheSignal<Photo> ILogger gerektirir.
  • GetPhotosAsyncyöntemi:
    • Bir parametre Func<Photo, bool> filter tanımlar ve bir IAsyncEnumerable<Photo> döndürür.
    • çağrıları ve serbest bırakmalarını _cacheSignal.WaitAsync() bekler; bu, önbelleğe erişmeden önce önbelleğin doldurulduğundan sağlar.
    • _cache.GetOrCreateAsync()önbelleğe tüm fotoğrafları zaman uyumsuz olarak almak için çağrısında bulundu.
    • Bağımsız factory değişken bir uyarı günlüğe kaydeder ve boş bir fotoğraf dizisi döndürür; bu hiçbir zaman yaşanmaz.
    • Önbellekte yer alan her fotoğraf ile iter, filtrelenmiş ve yield return uygulanmıştır.
    • Son olarak, önbellek sinyali sıfırlanır.

Bu hizmetin tüketicileri yöntemini çağırarak GetPhotosAsync fotoğrafları uygun şekilde işlemeye ücretsizdir. Önbellek HttpClient fotoğrafları içerdiği için gerekli değildir.

CacheWorker, bir alt sınıfıdır: BackgroundService

using System.Net.Http.Json;
using Microsoft.Extensions.Caching.Memory;

namespace CachingExamples.Memory;

public class CacheWorker : BackgroundService
{
    private readonly ILogger<CacheWorker> _logger;
    private readonly HttpClient _httpClient;
    private readonly CacheSignal<Photo> _cacheSignal;
    private readonly IMemoryCache _cache;
    private readonly TimeSpan _updateInterval = TimeSpan.FromHours(3);

    private const string Url = "https://jsonplaceholder.typicode.com/photos";

    public CacheWorker(
        ILogger<CacheWorker> logger,
        HttpClient httpClient,
        CacheSignal<Photo> cacheSignal,
        IMemoryCache cache) =>
        (_logger, _httpClient, _cacheSignal, _cache) = (logger, httpClient, cacheSignal, cache);

    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        await _cacheSignal.WaitAsync();
        await base.StartAsync(cancellationToken);
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Updating cache.");

            try
            {
                Photo[]? photos =
                    await _httpClient.GetFromJsonAsync<Photo[]>(
                        Url, stoppingToken);

                if (photos is { Length: > 0 })
                {
                    _cache.Set("Photos", photos);
                    _logger.LogInformation(
                        "Cache updated with {Count:#,#} photos.", photos.Length);
                }
                else
                {
                    _logger.LogWarning(
                        "Unable to fetch photos to update cache.");
                }
            }
            finally
            {
                _cacheSignal.Release();
            }

            try
            {
                _logger.LogInformation(
                    "Will attempt to update the cache in {Hours} hours from now.",
                    _updateInterval.Hours);

                await Task.Delay(_updateInterval, stoppingToken);
            }
            catch (OperationCanceledException)
            {
                _logger.LogWarning("Cancellation acknowledged: shutting down.");
                break;
            }
        }
    }
}

Önemli

ve override BackgroundService.StartAsync çağrısının await _cacheSignal.WaitAsync() başlangıçları arasındaki yarış durumunu önlemek için çağrısı CacheWorker PhotoService.GetPhotosAsync gerekir.

Yukarıdaki C# kodunda:

  • Oluşturucu , ILogger HttpClient , ve CacheSignal<Photo> IMemoryCache gerektirir.
  • üç saatlik _updateInterval bir tanımlar.
  • ExecuteAsyncyöntemi:
    • Uygulama çalışırken döngüler.
    • için bir HTTP isteği "https://jsonplaceholder.typicode.com/photos" yapar ve yanıtı bir nesne dizisi olarak Photo eşler.
    • Fotoğraf dizisi anahtarının IMemoryCache altına "Photos" yerleştirilir.
    • _cacheSignal.Release()Çağrıldı ve sinyal bekleyen tüm tüketicileri serbest bırakır.
    • Çağrısı Task.Delay , güncelleştirme aralığı verildiğinde, bekletildi.
    • Üç saat erteledikten sonra önbellek güncellenir.

Zaman uyumsuz sinyal SemaphoreSlim , bir genel tür kısıtlı tekil içindeki kapsüllenmiş bir örneğe dayalıdır. , CacheSignal<T> Bir örneğine dayanır SemaphoreSlim :

namespace CachingExamples.Memory;

public sealed class CacheSignal<T>
{
    private readonly SemaphoreSlim _semaphore = new(1, 1);

    /// <summary>
    /// Exposes a <see cref="Task"/> that represents the asynchronous wait operation.
    /// When signaled (consumer calls <see cref="Release"/>), the 
    /// <see cref="Task.Status"/> is set as <see cref="TaskStatus.RanToCompletion"/>.
    /// </summary>
    public Task WaitAsync() => _semaphore.WaitAsync();

    /// <summary>
    /// Exposes the ability to signal the release of the <see cref="WaitAsync"/>'s operation.
    /// Callers who were waiting, will be able to continue.
    /// </summary>
    public void Release() => _semaphore.Release();
}

Önceki C# kodunda dekoratör deseninin bir örneğini kaydırmak için kullanılır SemaphoreSlim . CacheSignal<T>Tek bir olarak kaydedildiğinden, bu durumda herhangi bir genel tür ile tüm hizmet yaşam sürelerinin tamamında kullanılabilir — Photo . Önbelleğin dengeli hale getirmesinden sinyal getirmekten sorumludur.

Dağıtılmış önbelleğe alma

Bazı senaryolarda, — birden fazla uygulama sunucusu için bir dağıtılmış önbellek gerekir. Dağıtılmış önbellek, bellek içi önbelleğe alma yaklaşımına göre daha yüksek ölçeği destekler. Dağıtılmış önbellek kullanmak önbellek belleğini dış bir işleme devreder, ancak ek ağ g/ç gerektirir ve biraz daha fazla gecikme (nominal olsa bile) sağlar.

dağıtılmış önbelleğe alma soyutlamaları Microsoft.Extensions.Caching.Memory NuGet paketinin bir parçasıdır ve bir AddDistributedMemoryCache genişletme yöntemi de vardır.

Dikkat

AddDistributedMemoryCacheYalnızca geliştirme ve/veya test senaryolarında kullanılmalıdır ve uygulanabilir bir üretim uygulamasıdır.

Aşağıdaki paketlerden ' nin kullanılabilir uygulamalarından herhangi birini göz önünde bulundurun IDistributedCache :

Dağıtılmış önbelleğe alma API 'SI

Dağıtılmış önbelleğe alma API 'Leri, bellek içi önbelleğe alma API 'SI karşılıklarından daha basit bir bittir. Anahtar-değer çiftleri bir bit daha temel. Bellek içi önbelleğe alma anahtarları object , ' a dayalıdır, ancak dağıtılmış anahtarlar bir ' tır string . Bellek içi önbelleğe alma sayesinde değer kesin türü belirtilmiş bir genel olabilir, ancak dağıtılmış önbelleğe alma değerlerini olarak kalıcı hale getirilir byte[] . Bu, çeşitli uygulamaların kesin türü belirtilmiş genel değerleri kullanıma sunmadığından, ancak uygulama ayrıntısı olacağı söylenemez.

Değer oluştur

Dağıtılmış önbellekte değer oluşturmak için, ayarlanan API 'lerden birini çağırın:

AlphabetLetterBellek içi önbellek örneğinde kaydı kullanarak, NESNEYI JSON olarak seri hale geçirebilir ve sonra string şöyle kodlayın byte[] :

DistributedCacheEntryOptions options = new()
{
    AbsoluteExpirationRelativeToNow =
        TimeSpan.FromMilliseconds(MillisecondsAbsoluteExpiration)
};

AlphabetLetter alphabetLetter = new(letter);
string json = JsonSerializer.Serialize(alphabetLetter);
byte[] bytes = Encoding.UTF8.GetBytes(json);

await cache.SetAsync(letter.ToString(), bytes, options);

Bellek içi önbelleğe alma gibi, önbellek girişlerinde, bu durumda, önbelleğinde var olup olmadığını hassas bir şekilde ayarlamaya yardımcı olacak seçenekler bulunabilir — DistributedCacheEntryOptions .

Uzantı yöntemleri oluştur

Değer oluşturmak için çok sayıda kullanışlı tabanlı uzantı yöntemi vardır. Bu, nesnelerin ' de nesne temsillerini kodlamasına engel olmaya yardımcı olur string byte[] :

Değerleri oku

Dağıtılmış önbellekten değerleri okumak için Get API 'Lerinden birini çağırın:

AlphabetLetter? alphabetLetter = null;
byte[]? bytes = await cache.GetAsync(letter.ToString());
if (bytes is { Length: > 0 })
{
    string json = Encoding.UTF8.GetString(bytes);
    alphabetLetter = JsonSerializer.Deserialize<AlphabetLetter>(json);
}

Önbellek girdisi önbellekten okunduktan sonra, UTF8 kodlamalı string gösterimi byte[]

Okuma uzantısı yöntemleri

Değerleri okumak için bazı kolay tabanlı uzantı yöntemleri vardır. Bu, byte[] nesnelerin temsillerine kod çözmeyi önlemeye yardımcı olur string :

Değerleri Güncelleştir

Dağıtılmış önbellekteki değerleri tek bir API çağrısıyla güncelleştirmek mümkün değildir; Bunun yerine değerler, yenileme API 'lerinden biri ile birlikte Kayan süre sonu ayarlarına sahip olabilir:

Gerçek değerin güncelleştirilmesi gerekiyorsa, değeri silip yeniden eklemeniz gerekir.

Değerleri Sil

Dağıtılmış önbellekteki değerleri silmek için, kaldırma API 'Lerinden birini çağırın:

İpucu

Belirtilen API 'lerin zaman uyumlu sürümleri var olsa da, dağıtılmış önbellek uygulamalarının ağ g/ç 'ye bağlı olduğunu göz önünde bulundurun. Bu nedenle, zaman uyumsuz API 'Lerin kullanılması gerekenden daha sık tercih edilir.

Ayrıca bkz.