項目中我們常常會碰到一些數據,需要高頻率用到但是又不會頻繁變動的這類,我們就可以使用緩存把這些數據緩存起來(比如說本項目的導航數據,帖子頻道數據). 我們項目中常用到有Asp.Net Core 本身提供的緩存組件MemoryCache以及第三方緩存組件Redis(當然這個不僅僅只用來做緩存工具用). ...
項目中我們常常會碰到一些數據,需要高頻率用到但是又不會頻繁變動的這類,我們就可以使用緩存把這些數據緩存起來(比如說本項目的導航數據,帖子頻道數據).
我們項目中常用到有Asp.Net Core 本身提供的緩存組件MemoryCache以及第三方緩存組件Redis(當然這個不僅僅只用來做緩存工具用).
MemoryCache組件的使用:
第一步:我們在Startup類中ConfigureServices方法中添加緩存組件
services.AddMemoryCache();
第二步:我們就可以在項目中使用該緩存組件了
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using MVCDemo.Core.Cache; namespace MVCDemo.Web.Controllers { public class CacheController : Controller { IMemoryCache _cache = null; public CacheController(IMemoryCache memoryCache) { _cache = memoryCache; } public IActionResult Index() { //MemoryCache示例 string memoryCache = _cache.Get<string>("memoryCacheTest"); if (string.IsNullOrEmpty(memoryCache)) { //添加並且設置緩存 _cache.Set<string>("memoryCacheTest", "我是memoryCacheTest緩存"); memoryCache = _cache.Get<string>("memoryCacheTest"); } ViewData["memoryCache"] = memoryCache; return View(); } } }
PS:在這裡我們使用的構造函數註入的方式獲取到了MemoryCache的實例對象
Redis緩存組件的使用:
PS:我們使用的是Windows系統上安裝的Redis組件,安裝教程請查看https://www.51core.net/posts/read/3048
第一步:使用Nuget添加Microsoft.Extensions.Caching.Redis組件
第二步:將Redis常用方法封裝成一個服務
1.創建一個ICacheService的介面,方便緩存組件的擴展
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace Mango.Framework.Services.Cache 6 { 7 public interface ICacheService 8 { 9 /// <summary> 10 /// 獲取緩存 11 /// </summary> 12 /// <typeparam name="T">泛型(返回的結果類型)</typeparam> 13 /// <param name="key">緩存key</param> 14 /// <returns></returns> 15 T Get<T>(string key) where T : new(); 16 /// <summary> 17 /// 獲取緩存 18 /// </summary> 19 /// <param name="key">緩存key</param> 20 /// <returns></returns> 21 string Get(string key); 22 /// <summary> 23 /// 添加緩存 24 /// </summary> 25 /// <param name="key">緩存key</param> 26 /// <param name="value">緩存值</param> 27 /// <param name="ExpirationTime">絕對過期時間(分鐘)</param> 28 void Add(string key, object value, int expirationTime = 20); 29 /// <summary> 30 /// 移除緩存 31 /// </summary> 32 /// <param name="key"></param> 33 void Remove(string key); 34 /// <summary> 35 /// 更新緩存 36 /// </summary> 37 /// <param name="key"></param> 38 /// <param name="value"></param> 39 /// <param name="ExpirationTime"></param> 40 void Replace(string key, object value, int expirationTime = 20); 41 } 42 }
2.創建一個RedisCacheService類繼承自ICacheService介面並且實現介面中的方法
using System; using System.Text; using Microsoft.Extensions.Caching.Redis; using Microsoft.Extensions.Caching.Distributed; using Newtonsoft.Json; namespace Mango.Framework.Services.Cache { public class RedisCacheService:ICacheService { private RedisCache _redisCache = null; public RedisCacheService(RedisCacheOptions options) { _redisCache = new RedisCache(options); } /// <summary> /// 獲取緩存 /// </summary> /// <typeparam name="T">泛型(返回的結果類型)</typeparam> /// <param name="key">緩存key</param> /// <returns></returns> public T Get<T>(string key) where T:new() { try { if (!string.IsNullOrEmpty(key)) { return JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(_redisCache.Get(key))); } return default(T); } catch { return default(T); } } /// <summary> /// 獲取緩存 /// </summary> /// <param name="key">緩存key</param> /// <returns></returns> public string Get(string key) { try { if (!string.IsNullOrEmpty(key)) { return Encoding.UTF8.GetString(_redisCache.Get(key)); } return string.Empty; } catch { return null; } } /// <summary> /// 添加緩存 /// </summary> /// <param name="key">緩存key</param> /// <param name="value">緩存值</param> /// <param name="ExpirationTime">絕對過期時間(分鐘)</param> public void Add(string key,object value,int expirationTime=20) { if (!string.IsNullOrEmpty(key)) { _redisCache.Set(key, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions() { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(expirationTime) }); } } /// <summary> /// 移除緩存 /// </summary> /// <param name="key">緩存key</param> public void Remove(string key) { if (!string.IsNullOrEmpty(key)) { _redisCache.Remove(key); } } /// <summary> /// 更新緩存 /// </summary> /// <param name="key">緩存key</param> /// <param name="value">緩存值</param> /// <param name="ExpirationTime"></param> public void Replace(string key, object value, int expirationTime = 20) { if (!string.IsNullOrEmpty(key)) { _redisCache.Remove(key); _redisCache.Set(key, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions() { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(expirationTime) }); } } } }
PS:該類中的構造函數負責創建Redis緩存的實例並且把相關的參數(連接字元串)傳入進行連接
第三步:在Startup類中ConfigureServices添加封裝的服務組件
//註冊自定義服務 services.AddSingleton(typeof(ICacheService), new RedisCacheService(new RedisCacheOptions() { Configuration = Configuration.GetSection("Cache:ConnectionString").Value, InstanceName = Configuration.GetSection("Cache:InstanceName").Value })); //註冊到全局服務控制類中以供其它項目的使用 Framework.Services.ServiceContext.RegisterServices(services);
第四步:在項目中調用,示例代碼如下
ICacheService cacheService = ServiceContext.GetService<ICacheService>(); string cacheData = cacheService.Get("WebSiteConfigCache");
到此ASP.NET CORE MVC項目中緩存的使用介紹已經完成.