原文連結: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"; });