ASP.NET Core 中的內存緩存
MSDN:https://docs.microsoft.com/zh-cn/aspnet/core/performance/caching/memory?view=aspnetcore-5.0
1 引用Caching.Memory
1.1 NuGet安裝Microsoft.Extensions.Caching.Memory
https://www.nuget.org/packages/Microsoft.Extensions.Caching.Memory/5.0.0?_src=template
1.2 Startup.cs的ConfigureServices中添加服務
1.3 代碼中引用
using Microsoft.Extensions.Caching.Memory;
1.4 構造時注入
2 緩存的存取
2.1 Get和Set
Get獲取緩存,如果沒有命中,則用Set設置緩存
//使用緩存
public ActionResult CacatDate()
{
//基本用法:Get;Set
//讀取緩存
string now = cache.Get<string>("cacheNow");
//如果緩存為null,則設置緩存
if (now == null)
{
now = DateTime.Now.ToString();
cache.Set("cacheNow", now);
}
return JsonResult(now);
}
2.2 GetOrCreate
如果命中緩存則獲取,否則設置緩存
和使用GetSet效果一樣
//使用緩存
public ActionResult CacatDate()
{
string now = cache.GetOrCreate("cacheNow", entry =>
{
return DateTime.Now.ToString();
});
return JsonResult(now);
}
2.3 設置過期時間
緩存過期的策略有兩種。絕對過期時間和滑動過期時間。
絕對過期時間指:到指定的時間(比如2021年6月1日,或者當前系統日期+1天)后,緩存自動過期。
滑動過期時間指:設定一個滑動時間(比如10S)。如果緩存一直沒有被命中過,則經過這個時間后過期。如果被命中,則重新計時這個時間。
注:如果同時設置兩個策略,則滿足任意一個策略的過期條件就會過期。
//使用緩存
public ActionResult CacatDate()
{
string now = cache.GetOrCreate("cacheNow", entry =>
{
entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));//絕對過期時間
entry.SetSlidingExpiration(TimeSpan.FromSeconds(5));//滑動過期時間(規定時間內命中的話,重新計算時間)
return DateTime.Now.ToString();
});
return JsonResult(now);
}
2.4 緩存被刪除時的回調函數
注冊一個緩存被刪除時的回調函數:entry.RegisterPostEvictionCallback
//使用緩存
public ActionResult CacatDate()
{
string now = cache.GetOrCreate("cacheNow", entry =>
{
entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(10));//絕對過期時間
//entry.SetSlidingExpiration(TimeSpan.FromSeconds(5));//滑動過期時間(規定時間內命中的話,重新計算時間)
entry.RegisterPostEvictionCallback((key, value, reason, state) =>
{
Console.WriteLine("緩存刪除,回調函數");
});
return DateTime.Now.ToString();
});
return JsonResult(now);
}
2.5 緩存域
緩存域是Caching.Memory自帶的功能,得以實現緩存依賴。
什么是緩存依賴
通過檢測依賴項緩存是否過期,判斷緩存自身是否過期的一種方式。
測試緩存依賴
目前有兩個模型。加油站和汽油。加油站依賴於汽油。
/// <summary>
/// 加油站
/// </summary>
public class OilStationModel
{
/// <summary>
/// 加油站名稱
/// </summary>
public string OilStationName { get; set; }
/// <summary>
/// 加油站包含的汽油
/// </summary>
public OilModel Oil { get; set; }
}
/// <summary>
/// 汽油
/// </summary>
public class OilModel
{
/// <summary>
/// 汽油名稱
/// </summary>
public string OilName { get; set; }
}
還有兩個獲取數據的函數。獲取加油站信息和獲取汽油信息。
獲取加油站信息的函數嵌套着獲取汽油信息的函數。
加油站信息緩存設置為60秒到期,加油站里汽油的信息設置為5秒到期。
為了方便測試,值都是Set緩存當前時間的秒。
//獲取加油站信息(60秒緩存過期)
public OilStationModel GetOilStation()
{
OilStationModel oilStationModel = cache.GetOrCreate("oilStationModel", entry =>
{
entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
return new OilStationModel
{
OilStationName = $@"加油站名稱:{DateTime.Now.Second}",
Oil = GetOil()
};
});
return oilStationModel;
}
//獲取加油站中的汽油的信息(5秒緩存過期)
public OilModel GetOil()
{
OilModel oilModel = cache.GetOrCreate("oilModel", entry =>
{
entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(5));
return new OilModel
{
OilName = $@"汽油型號:{DateTime.Now.Second}"
};
});
return oilModel;
}
最后有一個調用的接口,獲取加油站的信息:
//緩存域實現緩存依賴
public ActionResult CacheZone()
{
OilStationModel oilStationModel = GetOilStation();
return JsonResult(oilStationModel);
}
調用接口,由於在第2S時調用的接口,可以看到加油站名稱和汽油型號都是2。
接下來6秒后再次調用接口,獲取加油站信息,按照加油站信息60S過期的策略,理論上應該取得剛才的加油站信息。
加油站名稱和汽油型號應該還是2。
但是實際上,加油站名稱和汽油型號都是8。
這就是緩存依賴實現的功能。由於依賴項(汽油型號)的緩存過期,使得自身(加油站)的緩存也過期。