原文:ASP.NET CORE CACHE的使用(含MemoryCache,Redis)

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

依赖命名空间:

Microsoft.AspNetCore.Mvc;//测试调用时

Microsoft.Extensions.Caching.Memory;

Microsoft.Extensions.Caching.Redis;

StackExchange.Redis;

Newtonsoft.Json;

定义通用工具类 :CacheUntity

public class CacheUntity

    {

        private static ICacheHelper _cache = new RedisCacheHelper();//默认使用Redis

        private static bool isInited = false;

        public static void Init(ICacheHelper cache)

        {

            if (isInited)

                return;

            _cache.Dispose();

            _cache = cache;

            isInited = true;

        }

        public static bool Exists(string key)

        {

            return _cache.Exists(key);

        }

        public static T GetCache<T>(string key) where T : class

        {

            return _cache.GetCache<T>(key);

        }

        public static void SetCache(string key, object value)

        {

            _cache.SetCache(key, value);

        }

        public static void SetCache(string key, object value, DateTimeOffset expiressAbsoulte)

        {

            _cache.SetCache(key, value, expiressAbsoulte);

        }

        //public void SetCache(string key, object value, double expirationMinute)

        //{

        //}

        public static void RemoveCache(string key)

        {

            _cache.RemoveCache(key);

        }

    }

定义统一缓存操作接口:ICacheHelper

public interface ICacheHelper

    {

        bool Exists(string key);

        T GetCache<T>(string key) where T : class;

        void SetCache(string key, object value);

        void SetCache(string key, object value, DateTimeOffset expiressAbsoulte);//设置绝对时间过期

        //void SetCache(string key, object value, double expirationMinute);  //设置滑动过期, 因redis暂未找到自带的滑动过期类的API,暂无需实现该接口

        void RemoveCache(string key);

        void Dispose();

    }

定义RedisCache帮助类:RedisCacheHelper

public class RedisCacheHelper : ICacheHelper

    {

        public RedisCacheHelper(/*RedisCacheOptions options, int database = 0*/)//这里可以做成依赖注入,但没打算做成通用类库,所以直接把连接信息直接写在帮助类里

        {

            RedisCacheOptions options = new RedisCacheOptions();

            options.Configuration = "127.0.0.1:6379";

            options.InstanceName = "test";

            int database = 0;

            _connection = ConnectionMultiplexer.Connect(options.Configuration);

            _cache = _connection.GetDatabase(database);

            _instanceName = options.InstanceName;

        }

        private IDatabase _cache;

        private ConnectionMultiplexer _connection;

        private readonly string _instanceName;

        private string GetKeyForRedis(string key)

        {

            return _instanceName + key;

        }

        public bool Exists(string key)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            return _cache.KeyExists(GetKeyForRedis(key));

        }

        public T GetCache<T>(string key) where T : class

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            var value = _cache.StringGet(GetKeyForRedis(key));

            if (!value.HasValue)

                return default(T);

            return JsonConvert.DeserializeObject<T>(value);

        }

        public void SetCache(string key, object value)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            if (value == null)

                throw new ArgumentNullException(nameof(value));

            if (Exists(GetKeyForRedis(key)))

                RemoveCache(GetKeyForRedis(key));

            _cache.StringSet(GetKeyForRedis(key), JsonConvert.SerializeObject(value));

        }

        public void SetCache(string key, object value, DateTimeOffset expiressAbsoulte)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            if (value == null)

                throw new ArgumentNullException(nameof(value));

            if (Exists(GetKeyForRedis(key)))

                RemoveCache(GetKeyForRedis(key));

            _cache.StringSet(GetKeyForRedis(key), JsonConvert.SerializeObject(value), expiressAbsoulte - DateTime.Now);

        }

        //public void SetCache(string key, object value, double expirationMinute)

        //{

        //    if (Exists(GetKeyForRedis(key)))

        //        RemoveCache(GetKeyForRedis(key));

        //    DateTime now = DateTime.Now;

        //    TimeSpan ts = now.AddMinutes(expirationMinute) - now;

        //    _cache.StringSet(GetKeyForRedis(key), JsonConvert.SerializeObject(value), ts);

        //}

        public void RemoveCache(string key)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            _cache.KeyDelete(GetKeyForRedis(key));

        }

        public void Dispose()

        {

            if (_connection != null)

                _connection.Dispose();

            GC.SuppressFinalize(this);

        }

    }

定义MemoryCache帮助类:MemoryCacheHelper

public class MemoryCacheHelper : ICacheHelper

    {

        public MemoryCacheHelper(/*MemoryCacheOptions options*/)//这里可以做成依赖注入,但没打算做成通用类库,所以直接把选项直接封在帮助类里边

        {

            //this._cache = new MemoryCache(options);

            this._cache = new MemoryCache(new MemoryCacheOptions());

        }

        private IMemoryCache _cache;

        public bool Exists(string key)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            object v = null;

            return this._cache.TryGetValue<object>(key, out v);

        }

        public T GetCache<T>(string key) where T : class

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            T v = null;

            this._cache.TryGetValue<T>(key, out v);

            return v;

        }

        public void SetCache(string key, object value)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            if (value == null)

                throw new ArgumentNullException(nameof(value));

            object v = null;

            if (this._cache.TryGetValue(key, out v))

                this._cache.Remove(key);

            this._cache.Set<object>(key, value);

        }

        public void SetCache(string key, object value, double expirationMinute)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            if (value == null)

                throw new ArgumentNullException(nameof(value));

            object v = null;

            if (this._cache.TryGetValue(key, out v))

                this._cache.Remove(key);

            DateTime now = DateTime.Now;

            TimeSpan ts = now.AddMinutes(expirationMinute) - now;

            this._cache.Set<object>(key, value, ts);

        }

        public void SetCache(string key, object value, DateTimeOffset expirationTime)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            if (value == null)

                throw new ArgumentNullException(nameof(value));

            object v = null;

            if (this._cache.TryGetValue(key, out v))

                this._cache.Remove(key);

            this._cache.Set<object>(key, value, expirationTime);

        }

        public void RemoveCache(string key)

        {

            if (string.IsNullOrWhiteSpace(key))

                throw new ArgumentNullException(nameof(key));

            this._cache.Remove(key);

        }

        public void Dispose()

        {

            if (_cache != null)

                _cache.Dispose();

            GC.SuppressFinalize(this);

        }

    }

调用:

[HttpGet]

        public string TestCache()

        {

            CacheUntity.SetCache("test", "RedisCache works!");

            string res = CacheUntity.GetCache<string>("test");

            res += Environment.NewLine;

            CacheUntity.Init(new MemoryCacheHelper());

            CacheUntity.SetCache("test", "MemoryCache works!");

            res += CacheUntity.GetCache<string>("test");

            return res;

        }

ASP.NET CORE CACHE的使用(含MemoryCache,Redis)的更多相关文章

  1. 在ASP.NET Core 2.0中使用MemoryCache

    说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...

  2. 第十二节:Asp.Net Core 之分布式缓存(SQLServer和Redis)

    一. 整体说明 1. 说明 分布式缓存通常是指在多个应用程序服务器的架构下,作为他们共享的外部服务共享缓存,常用的有SQLServer.Redis.NCache.     特别说明一下:这里的分布式是 ...

  3. asp.net core计划任务探索之hangfire+redis+cluster

    研究了一整天的quartz.net,发现一直无法解决cluster模式下多个node独立运行的问题,改了很多配置项,仍然是每个node各自为战.本来cluster模式下的各个node应该是负载均衡的, ...

  4. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...

  5. ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存

    .NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...

  6. asp.net core 系列之Response caching(1)

    这篇文章简单的讲解了response caching: 讲解了cache-control,及对其中的头和值的作用,及设置来控制response caching; 简单的罗列了其他的缓存技术:In-me ...

  7. 从零搭建一个IdentityServer——集成Asp.net core Identity

    前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...

  8. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  9. 简易的开发框架(微服务) Asp.Net Core 2.0

      Asp.Net Core 2.0 + Mysql Orm + Ioc + Redis + AOP + RabbitMQ + Etcd + Autofac + Swagger 基础框架: https ...

随机推荐

  1. AWS EC2 PV Drivers 驱动升级

    问题 从2019-10-23起,我的AWS实例不断的重启(大概6个小时左右),或者连接不上(远程连接不上并PING不通IP),但控制台显示running. 分析与解决方法 通过查看dump文件,发现是 ...

  2. How to change the button text of <input type=“file” />?

    How to change the button text of <input type=“file” />? Simply <label class="btn btn-p ...

  3. spark streaming 4: DStreamGraph JobScheduler

    DStreamGraph有点像简洁版的DAG scheduler,负责根据某个时间间隔生成一序列JobSet,以及按照依赖关系序列化.这个类的inputStream和outputStream是最重要的 ...

  4. android canvas drawtext 字高

    Paint pFont = new Paint(); Rect rect = new Rect(); pFont.getTextBounds("豆", 0, 1, rect); L ...

  5. go之无缓冲channel(通道)和有缓冲channel(通道)

    channel我们先来看一下通道的解释:channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度.chann ...

  6. linux中的i2c控制器驱动应该做些什么?

    答:完成读写功能即可,不要涉及任何针对从设备的特殊操作,这样就可以避免与从设备的代码产生冗余,linux中的i2c控制器驱动就做的特别棒,做好最简单的读写,然后其它的从设备驱动就是直接调用这些最简单的 ...

  7. pid稳态控制

    https://blog.csdn.net/qq_25352981/article/details/81007075

  8. javascript之常用事件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Carousel 走马灯

    在有限空间内,循环播放同一类型的图片.文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯.幻灯片的内容是任意的,需要放在e ...

  10. [ubuntu]android SDK 与Gradle环境的安装与配置|搭建android基础开发/构建环境

    系统环境: linux:ubuntu18 已配置jdk 环境变量 切换到root账户 sudo su 安装Android-sdk (0)准备工作 切换到/usr/local目录: /usr/local ...