前言
本地緩存又稱為服務器緩存,存儲與服務端的緩存,與之前的客戶端緩存反向代理緩存不同,本地緩存主要用於存儲一些常用的數據,由於每個請求進入服務端獲取數據都要進行一系列的計算以及數據庫操作,加了緩存之后,請求進如服務端之后先查找緩存,緩存中有需要的數據就直接返回,否則才去進行計算,然后記錄緩存;這樣的做法就導致了數據庫與服務器壓力降低,當然也有缺點,那就是實時性,沒加入緩存之前是每次都去訪問數據庫,很顯然這樣做會導致數據庫壓力爆棚,但是獲取的數據是最新的,而緩存的數據可能會與數據庫不一致,通過一些策略可以改善,但也不是絕對的一致,需要進行取舍。
實現
.Net Core 中內置了MemoryCache,我們就用它了,首先Nuget 一下Microsoft.Extensions.Caching.Memory
下載完成后,進入Startup中的ConfigureServices進行注冊;
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddMemoryCache(); }
接下來就能使用了,使用與其他服務一樣,先進行注入,然后就能使用了,這里寫了幾句簡單的代碼,一個不過期緩存nowKey,一個隨機事件過期緩存randomKey。

private readonly IMemoryCache _memoryCache; public HomeController(IMemoryCache memoryCache) { this._memoryCache = memoryCache; } public IActionResult Index() { string nowKey = "Now"; string randomKey = "Random"; string date= string.Empty; string num = string.Empty; if (!_memoryCache.TryGetValue(randomKey, out num)) { var r = new Random().Next(10, 20); num = r + $"秒后過期 起始時間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")}"; _memoryCache.Set(randomKey, num, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(r))); } if (!_memoryCache.TryGetValue(nowKey, out date)) { date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"); _memoryCache.Set(nowKey, date); } ViewBag.DateCache = date; ViewBag.RandomCache = num; return View(); }
»MemoryCache的過期策略有絕對過期時間,也有相對過期時間,上面的過期時間使用的是絕對過期時間,從set之后開始計時,超過一段時間后過期;相對過期時間是指超過一段時間沒調用后過期,如果設置緩存后開始計時這時有一個緩存進來會重新計時。
效果
打開多個窗體同時訪問localhost:8878/Home/Index端口,效果如下
可以看到上面的時間緩存與下面的緩存三個窗體一致,說明這兩個緩存存儲在服務端內存中。訪問本服務端都拿到一樣的值。
下面看看同時運行多個實例
三個實例的緩存不一致,原因當然很簡單,因為三個實例為三個進程,而進程間互相隔離,所以他們只能訪問到存在自己進程中存儲緩存的內存,從而導致不一致。如果把一個實例當成單機,三個實例即一個集群,他們之間內存並不共享,這就需要分布式緩存了,下一篇說。
總結
回到本地緩存,本地緩存的作用還是減輕服務器和數據庫的壓力,攔截到請求先在緩存中查找,緩存沒找到才去計算或者數據庫取,這樣可以提升服務器訪問量以及響應速度,有較明顯的性能提升。