原文: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. shell编程-定时任务(备份数据库)

    计划任务定时备份,删除等操作: #crontab -e #注意 会区分用户 默认在root用户登录用的是root权限用户的计划任务, 如果想在postgres备份 应使用postgres用户权限, 设 ...

  2. 【学习】eclipse自动提示+自动补全

    解决代码的自动提示问题: 1.打开 Eclipse -> Window -> Perferences 2.找到Java 下的 Editor 下的 Content Assist , 右边出现 ...

  3. (十二)C语言之循环结构

  4. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. OUC_Summer Training_ DIV2_#5

    这是做的最好的一次了一共做了4道题  嘻嘻~ A - Game Outcome Time Limit:2000MS     Memory Limit:262144KB     64bit IO For ...

  6. vscode如何使用命令面板

    vscode如何使用命令面板 方法/步骤     首先找到vscode.   进入,打开页面.   找到查看.   打开找到命令面板.   选择打开,可以看到命令.   下拉还有多个,以及快捷键.   ...

  7. Ansible 快速安装配置,常用模块

    Ansible是一个轻量级的工具,基于python语言实现,通过python中的paramiko来连接并管理机器, 功能强大(YAML,PlayBook,模块化功能),不需要安装客户端, 通过ssh连 ...

  8. grep命令和tail命令

    写在前面的话: 最近参与了新项目开发,周期短,与自己负责的主要业务对接.业务复杂,时常出现bug,然额对于菜鸟的我,更是无从下手.其实最好的帮助就是 学会查看日志,关键是之前查看日志真是太少了,菜鸟一 ...

  9. Oracle 变量 之 define variable declare 用法及区别

    Oracle 变量 之 define variable declare 用法及区别 Table of Contents 1. 扯蛋 2. define和accept 3. variable 3.1. ...

  10. Oracle 12C 物理Standby 主备切换switchover

    Oracle 12C 物理Standby 主备切换switchover Oracle 12C 物理Standby 主备切换switchover Table of Contents 1. 简述 2. 切 ...