.NET Cache方法类

创建CacheHelper.cs

csharp 复制代码
     public class CacheHelper
    {
        public static IMemoryCache _memoryCache = new MemoryCache(new MemoryCacheOptions());

        /// <summary>
        /// 缓存绝对过期时间
        /// </summary>
        ///<param name="key">Cache键值</param>
        ///<param name="value">给Cache[key]赋的值</param>
        ///<param name="minute">minute分钟后绝对过期</param>
        public static void AddCacheWithAbsolute(string key, object value, int minute)
        {
            if (value == null) return;
            _memoryCache.Set(key, value, new MemoryCacheEntryOptions()
                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(minute)));
        }


        /// <summary>
        /// 缓存相对过期,最后一次访问后minute分钟后过期
        /// </summary>
        ///<param name="key">Cache键值</param>
        ///<param name="value">给Cache[key]赋的值</param>
        ///<param name="minute">滑动过期分钟</param>
        public static void AddCacheWithRelative(string key, object value, int minute)
        {
            if (value == null) return;
            _memoryCache.Set(key, value, new MemoryCacheEntryOptions()
                    .SetSlidingExpiration(TimeSpan.FromMinutes(minute)));
        }


        /// <summary>
        ///以key键值,把value赋给Cache[key].如果不主动清空,会一直保存在内存中.
        /// </summary>
        ///<param name="key">Cache键值</param>
        ///<param name="value">给Cache[key]赋的值</param>
        public static void AddCache(string key, object value)
        {
            _memoryCache.Set(key, value);
        }

        /// <summary>
        ///清除Cache[key]的值
        /// </summary>
        ///<param name="key"></param>
        public static void CleanCache(string key)
        {
            _memoryCache.Remove(key);
        }

        /// <summary>
        ///根据key值,返回Cache[key]的值
        /// </summary>
        ///<param name="key"></param>
        public static object GetCache(string key)
        {
            return _memoryCache.Get(key);
        }
        /// <summary>
        /// 根据key查询value,如果不存在,则执行传入的查询方法并存入缓存
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="myFunc"></param>
        /// <returns></returns>
        public static r GetCacheOrQuery<r>(string key, Func<r> myFunc)
        {
            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc();
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }

        public static r GetCacheOrQuery<p, r>(string key, Func<p, r> myFunc, p param1)
        {
            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }

        public static r GetCacheOrQuery<p1, p2, r>(string key, Func<p1, p2, r> myFunc, p1 param1, p2 param2)
        {
            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1,param2);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }


        public static r GetCacheOrQuery<p1, p2, p3, r>(string key, Func<p1, p2, p3, r> myFunc, p1 param1, p2 param2, p3 param3)
        {
            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1,param2,param3);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }


        public static r GetCacheOrQuery<p1, p2, p3, p4, r>
            (string key, Func<p1, p2, p3, p4, r> myFunc, p1 param1, p2 param2, p3 param3, p4 param4)
        {
            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1,param2,param3,param4);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }

        public static r GetCacheOrQuery<p1, p2, p3, p4, p5, r>
            (string key, Func<p1, p2, p3, p4, p5, r> myFunc, p1 param1, p2 param2, p3 param3, p4 param4, p5 param5)
        {

            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1, param2, param3, param4,param5);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }

        public static r GetCacheOrQuery<p1, p2, p3, p4, p5, p6, r>
            (string key, Func<p1, p2, p3, p4, p5, p6,r> myFunc, p1 param1, p2 param2, p3 param3, p4 param4, p5 param5, p6 param6)
        {

            r result;
            if (GetCache(key) is not r value)
            {
                result = myFunc(param1, param2, param3, param4,param5,param6);
                AddCache(key, result);
            }
            else
            {
                result = value;
            }
            return result;
        }

    }

测试

csharp 复制代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.OpenApi.Any;

namespace Cache.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public Object Get()
        {
            object queryData = CacheHelper.GetCacheOrQuery("queryValue", value);
            return queryData;
        }

        private static int index = 1;

        private object value()
        {
            Console.WriteLine($"这是第{index++}次查询数据");
            return new
            {
                name = "zhangsan",
                age = 22
            };
        }
    }
}

只有当第一次访问时,才会执行查询方法

相关推荐
80530单词突击赢4 小时前
JavaWeb进阶:SpringBoot核心与Bean管理
java·spring boot·后端
爬山算法4 小时前
Hibernate(87)如何在安全测试中使用Hibernate?
java·后端·hibernate
WeiXiao_Hyy5 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇5 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
long3165 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
rannn_1115 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
短剑重铸之日6 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu6 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人7 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法7 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate