.NET 快取

yinghualeihenmei發表於2024-07-01

原文連結:https://blog.csdn.net/dabusidede/article/details/124858045

記憶體快取包:

Microsoft.Extensions.Caching.Memory

1.註冊記憶體快取

services.AddMemoryCache();

2.基本使用示例

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    private readonly IServiceProvider _serviceProvider;

    public Worker(ILogger<Worker> logger, IServiceProvider serviceProvider)
    {
        _logger = logger;
        _serviceProvider = serviceProvider;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine(Get());
            await Task.Delay(1000, stoppingToken);
        }
    }

    public string Get()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();

        // 從快取中獲取鍵為 key1 的項,如果沒有或過期,則呼叫第二個引數Fun生成
        return cache.GetOrCreate<string>("key1", cacheEntity => {
            // 設定過期時間,過期後會重新呼叫該函式生成值
            // 設定過期時間
            // 如果5秒內沒有訪問該值,則過期
            // 否則,過期時間重新整理為訪問的時間 +5 秒
            cacheEntity.SlidingExpiration = TimeSpan.FromSeconds(5);

            // 設定絕對過期時間
            // 過期時間為15秒後,無論這15秒內是否有訪問都會過期
            cacheEntity.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(15);

            // 設定該項優先順序
            // NeverRemove 為不會從快取中移除,除非過期
            // 優先順序越低,記憶體不足時,將會移除該項
            cacheEntity.SetPriority(CacheItemPriority.NeverRemove);

            // 註冊快取項從快取移除時的回撥函式
            cacheEntity.RegisterPostEvictionCallback(
                (object key, object value, EvictionReason reason, object state) => { });

            return DateTime.Now.ToString();
        });
    }

    public void Remove()
    {
        IMemoryCache cache = _serviceProvider.GetService<IMemoryCache>();

        // 從快取中移除鍵為key1的快取項
        cache.Remove("key1");
    }
}

  3.記憶體快取與EFCore
EFCore也使用記憶體快取,如果我們使用依賴注入注入IMemoryCache ,則注入的可能是EFCore使用的快取,所以最好的方法是我們重新注入我們的快取(單例)

public class IEMemoryCache : MemoryCache, IIEMemoryCache
{
    public IEMemoryCache() : base(new MemoryCacheOptions {
        SizeLimit = null
    })
    {
    }
}

  分散式快取

1.使用示例

public string Get()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();

    // 獲取鍵為 mykey1 的快取項
    string value = cache.GetString("mykey1");
    if (string.IsNullOrEmpty(value))
    {
        // 設定鍵為 mykey1 的快取項
        cache.SetString("mykey1", "abc");
        return "no value";
    }
    
    return value;
}

public void Remove()
{
    IDistributedCache cache = _serviceProvider.GetService<IDistributedCache>();
    // 從快取中移除鍵為mykey1的快取項
    cache.Remove("mykey1");
}

  2.註冊分散式快取
目前有很多種分散式快取可以註冊
1)記憶體分散式快取
記憶體分散式快取其使用記憶體作為快取,單其卻實現了分散式快取的介面

services.AddDistributedMemoryCache();

  2)redis分散式快取

services.AddStackExchangeRedisCache (options => {
    // 配置 Redis 連線字串
    // 127.0.0.1:6379 為 Redis 服務地址,123456 為 Redis 連線密碼
    options.Configuration = "127.0.0.1:6379,password=123456";
    // 隨便起的例項名,我們在 Redis 伺服器儲存的 key 均以該例項名開頭
    options.InstanceName = "SampleInstance";
});

  

相關文章