1、项目用到依赖注入参考:
https://www.cnblogs.com/handsomeziff/p/16390502.html
2、新建ICaching接口
using Microsoft.Extensions.Caching.Distributed; namespace YYApi.Caches { /// <summary> /// 缓存抽象接口,基于IDistributedCache封装 /// </summary> public interface ICaching { public IDistributedCache Cache { get; } void AddCacheKey(string cacheKey); Task AddCacheKeyAsync(string cacheKey); void DelByPattern(string key); Task DelByPatternAsync(string key); void DelCacheKey(string cacheKey); Task DelCacheKeyAsync(string cacheKey); bool Exists(string cacheKey); Task<bool> ExistsAsync(string cacheKey); List<string> GetAllCacheKeys(); Task<List<string>> GetAllCacheKeysAsync(); T Get<T>(string cacheKey); Task<T> GetAsync<T>(string cacheKey); object Get(Type type, string cacheKey); Task<object> GetAsync(Type type, string cacheKey); string GetString(string cacheKey); Task<string> GetStringAsync(string cacheKey); void Remove(string key); Task RemoveAsync(string key); void RemoveAll(); Task RemoveAllAsync(); void Set<T>(string cacheKey, T value, TimeSpan? expire = null); Task SetAsync<T>(string cacheKey, T value); Task SetAsync<T>(string cacheKey, T value, TimeSpan expire); void SetPermanent<T>(string cacheKey, T value); Task SetPermanentAsync<T>(string cacheKey, T value); void SetString(string cacheKey, string value, TimeSpan? expire = null); Task SetStringAsync(string cacheKey, string value); Task SetStringAsync(string cacheKey, string value, TimeSpan expire); Task DelByParentKeyAsync(string key); } }View Code
3、新建Caching类
using Microsoft.Extensions.Caching.Distributed; using Newtonsoft.Json; using System.Text; using YYApi.Const; namespace YYApi.Caches { public class Caching : ICaching { private readonly IDistributedCache _cache; public Caching(IDistributedCache cache) { _cache = cache; } private byte[] GetBytes<T>(T source) { return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(source)); } public IDistributedCache Cache => _cache; public void AddCacheKey(string cacheKey) { var res = _cache.GetString(CacheConst.KeyAll); var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); if (!allkeys.Any(m => m == cacheKey)) { allkeys.Add(cacheKey); _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } } /// <summary> /// 增加缓存Key /// </summary> /// <param name="cacheKey"></param> /// <returns></returns> public async Task AddCacheKeyAsync(string cacheKey) { var res = await _cache.GetStringAsync(CacheConst.KeyAll); var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); if (!allkeys.Any(m => m == cacheKey)) { allkeys.Add(cacheKey); await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } } public void DelByPattern(string key) { var allkeys = GetAllCacheKeys(); if (allkeys == null) return; var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList(); delAllkeys.ForEach(u => { _cache.Remove(u); }); // 更新所有缓存键 allkeys = allkeys.Where(u => !u.Contains(key)).ToList(); _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } /// <summary> /// 删除某特征关键字缓存 /// </summary> /// <param name="key"></param> /// <returns></returns> public async Task DelByPatternAsync(string key) { var allkeys = await GetAllCacheKeysAsync(); if (allkeys == null) return; var delAllkeys = allkeys.Where(u => u.Contains(key)).ToList(); delAllkeys.ForEach(u => { _cache.Remove(u); }); // 更新所有缓存键 allkeys = allkeys.Where(u => !u.Contains(key)).ToList(); await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } public void DelCacheKey(string cacheKey) { var res = _cache.GetString(CacheConst.KeyAll); var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); if (allkeys.Any(m => m == cacheKey)) { allkeys.Remove(cacheKey); _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } } /// <summary> /// 删除缓存 /// </summary> /// <param name="cacheKey"></param> /// <returns></returns> public async Task DelCacheKeyAsync(string cacheKey) { var res = await _cache.GetStringAsync(CacheConst.KeyAll); var allkeys = string.IsNullOrWhiteSpace(res) ? new List<string>() : JsonConvert.DeserializeObject<List<string>>(res); if (allkeys.Any(m => m == cacheKey)) { allkeys.Remove(cacheKey); await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } } public bool Exists(string cacheKey) { var res = _cache.Get(cacheKey); return res != null; } /// <summary> /// 检查给定 key 是否存在 /// </summary> /// <param name="cacheKey">键</param> /// <returns></returns> public async Task<bool> ExistsAsync(string cacheKey) { var res = await _cache.GetAsync(cacheKey); return res != null; } public List<string> GetAllCacheKeys() { var res = _cache.GetString(CacheConst.KeyAll); return string.IsNullOrWhiteSpace(res) ? null : JsonConvert.DeserializeObject<List<string>>(res); } /// <summary> /// 获取所有缓存列表 /// </summary> /// <returns></returns> public async Task<List<string>> GetAllCacheKeysAsync() { var res = await _cache.GetStringAsync(CacheConst.KeyAll); return string.IsNullOrWhiteSpace(res) ? null : JsonConvert.DeserializeObject<List<string>>(res); } public T Get<T>(string cacheKey) { var res = _cache.Get(cacheKey); return res == null ? default : JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(res)); } /// <summary> /// 获取缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="cacheKey"></param> /// <returns></returns> public async Task<T> GetAsync<T>(string cacheKey) { var res = await _cache.GetAsync(cacheKey); return res == null ? default : JsonConvert.DeserializeObject<T>(Encoding.UTF8.GetString(res)); } public object Get(Type type, string cacheKey) { var res = _cache.Get(cacheKey); return res == null ? default : JsonConvert.DeserializeObject(Encoding.UTF8.GetString(res), type); } public async Task<object> GetAsync(Type type, string cacheKey) { var res = await _cache.GetAsync(cacheKey); return res == null ? default : JsonConvert.DeserializeObject(Encoding.UTF8.GetString(res), type); } public string GetString(string cacheKey) { return _cache.GetString(cacheKey); } /// <summary> /// 获取缓存 /// </summary> /// <param name="cacheKey"></param> /// <returns></returns> public async Task<string> GetStringAsync(string cacheKey) { return await _cache.GetStringAsync(cacheKey); } public void Remove(string key) { _cache.Remove(key); DelCacheKey(key); } /// <summary> /// 删除缓存 /// </summary> /// <param name="key"></param> /// <returns></returns> public async Task RemoveAsync(string key) { await _cache.RemoveAsync(key); await DelCacheKeyAsync(key); } public void RemoveAll() { var catches = GetAllCacheKeys(); foreach (var @catch in catches) Remove(@catch); catches.Clear(); _cache.SetString(CacheConst.KeyAll, JsonConvert.SerializeObject(catches)); } public async Task RemoveAllAsync() { var catches = await GetAllCacheKeysAsync(); foreach (var @catch in catches) await RemoveAsync(@catch); catches.Clear(); await _cache.SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(catches)); } public void Set<T>(string cacheKey, T value, TimeSpan? expire = null) { _cache.Set(cacheKey, GetBytes(value), expire == null ? new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) } : new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); AddCacheKey(cacheKey); } /// <summary> /// 增加对象缓存 /// </summary> /// <param name="cacheKey"></param> /// <param name="value"></param> /// <returns></returns> public async Task SetAsync<T>(string cacheKey, T value) { await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); await AddCacheKeyAsync(cacheKey); } /// <summary> /// 增加对象缓存,并设置过期时间 /// </summary> /// <param name="cacheKey"></param> /// <param name="value"></param> /// <param name="expire"></param> /// <returns></returns> public async Task SetAsync<T>(string cacheKey, T value, TimeSpan expire) { await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); await AddCacheKeyAsync(cacheKey); } public void SetPermanent<T>(string cacheKey, T value) { _cache.Set(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value))); AddCacheKey(cacheKey); } public async Task SetPermanentAsync<T>(string cacheKey, T value) { await _cache.SetAsync(cacheKey, Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value))); await AddCacheKeyAsync(cacheKey); } public void SetString(string cacheKey, string value, TimeSpan? expire = null) { if (expire == null) _cache.SetString(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); else _cache.SetString(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); AddCacheKey(cacheKey); } /// <summary> /// 增加字符串缓存 /// </summary> /// <param name="cacheKey"></param> /// <param name="value"></param> /// <returns></returns> public async Task SetStringAsync(string cacheKey, string value) { await _cache.SetStringAsync(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(6) }); await AddCacheKeyAsync(cacheKey); } /// <summary> /// 增加字符串缓存,并设置过期时间 /// </summary> /// <param name="cacheKey"></param> /// <param name="value"></param> /// <param name="expire"></param> /// <returns></returns> public async Task SetStringAsync(string cacheKey, string value, TimeSpan expire) { await _cache.SetStringAsync(cacheKey, value, new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow = expire }); await AddCacheKeyAsync(cacheKey); } /// <summary> /// 缓存最大角色数据范围 /// </summary> /// <param name="userId"></param> /// <param name="dataScopeType"></param> /// <returns></returns> public async Task SetMaxDataScopeType(long userId, int dataScopeType) { var cacheKey = CacheConst.KeyMaxDataScopeType + userId; await SetStringAsync(cacheKey, dataScopeType.ToString()); await AddCacheKeyAsync(cacheKey); } /// <summary> /// 根据父键清空 /// </summary> /// <param name="key"></param> /// <returns></returns> public async Task DelByParentKeyAsync(string key) { var allkeys = await GetAllCacheKeysAsync(); if (allkeys == null) return; var delAllkeys = allkeys.Where(u => u.StartsWith(key)).ToList(); delAllkeys.ForEach(Remove); // 更新所有缓存键 allkeys = allkeys.Where(u => !u.StartsWith(key)).ToList(); await SetStringAsync(CacheConst.KeyAll, JsonConvert.SerializeObject(allkeys)); } } }View Code
4、新建缓存相关类CacheConst
namespace YYApi.Const { /// <summary> /// 缓存相关常量 /// </summary> public class CacheConst { /// <summary> /// 用户缓存 /// </summary> public const string KeyUser = "user:"; /// <summary> /// 用户部门缓存 /// </summary> public const string KeyUserDepart = "userDepart:"; /// <summary> /// 菜单缓存 /// </summary> public const string KeyMenu = "menu:"; /// <summary> /// 菜单 /// </summary> public const string KeyPermissions = "permissions"; /// <summary> /// 权限缓存 /// </summary> public const string KeyPermission = "permission:"; /// <summary> /// 接口路由 /// </summary> public const string KeyModules = "modules"; /// <summary> /// 系统配置 /// </summary> public const string KeySystemConfig = "sysConfig"; /// <summary> /// 查询过滤器缓存 /// </summary> public const string KeyQueryFilter = "queryFilter:"; /// <summary> /// 机构Id集合缓存 /// </summary> public const string KeyOrgIdList = "org:"; /// <summary> /// 最大角色数据范围缓存 /// </summary> public const string KeyMaxDataScopeType = "maxDataScopeType:"; /// <summary> /// 验证码缓存 /// </summary> public const string KeyVerCode = "verCode:"; /// <summary> /// 所有缓存关键字集合 /// </summary> public const string KeyAll = "keys"; /// <summary> /// 定时任务缓存 /// </summary> public const string KeyTimer = "timer:"; /// <summary> /// 在线用户缓存 /// </summary> public const string KeyOnlineUser = "onlineuser:"; /// <summary> /// 常量下拉框 /// </summary> public const string KeyConstSelector = "selector:"; /// <summary> /// swagger登录缓存 /// </summary> public const string SwaggerLogin = "swaggerLogin:"; } }View Code
5、新增缓存注册类CacheSetup.cs
using YYApi.Caches; namespace YYApi.ServiceExtensions { public static class CacheSetup { /// <summary> /// 统一注册缓存 /// </summary> /// <param name="services"></param> public static void AddCacheSetup(this IServiceCollection services) { //使用内存 services.AddMemoryCache(); services.AddDistributedMemoryCache(); services.AddSingleton<ICaching, Caching>(); } } }View Code
6、在Program.cs文件增加:
builder.Services.AddCacheSetup();
7、在Autofac增加
public class AutofacModuleRegister : Autofac.Module { builder.RegisterType<Caching>().As<ICaching>().SingleInstance(); } }
8、使用:
新建一个控制器WeatherForecastController.cs。这里使用创建项目自助生成的控制器
using Microsoft.AspNetCore.Mvc; using System; using YYApi.Caches; using YYApi.Model.YY; namespace YYApi.Controllers { [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; private readonly ICaching _caching; public WeatherForecastController(ILogger<WeatherForecastController> logger, ICaching caching) { _logger = logger; _caching = caching; } [HttpGet(Name = "GetWeatherForecast")] public async Task<WeatherForecast> Get() { string cacheKey = "keyname"; WeatherForecast model = new WeatherForecast(); model = await _caching.GetAsync<WeatherForecast>(cacheKey); if (null != model) { return model; } model = new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(1)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }; await _caching.SetAsync(cacheKey, model, TimeSpan.FromMinutes(3)); return model; } } }
标签:缓存,string,res,cache,Task,cacheKey,设置,net8,public From: https://www.cnblogs.com/handsomeziff/p/17965099