原文: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. webpack搭建多页面系统(一):对webpack 构建工具的理解

    为什么使用webpack构建工具? 1.开发效率方面: 在一般的开发过程中,分发好任务后,每个人完成自己单独的页面,如果有的人开发完成之后,接手别人的任务,就有可能造成开发时候的冲突. 如果利用模块化 ...

  2. 软工第04组 Alpha冲刺(1/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 过去一段时间对项目的精度和分工进行了更加细致的划分,并初步进行了GamePlay逻辑部分的框架设计 GitHub签入记录: ...

  3. 将Chrome中的缓存数据移出C盘

    Chrome浏览器会默认的将用户的缓存是数据存放于  C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data文件夹内.用久了之后,就会积攒大量缓存数据 ...

  4. python中列表的简单用法

    1.定义list >>> li = ["a", "b", "mpilgrim", "z", " ...

  5. Python是否存在方法方法重载及是否可以不显示声明初始化方法

    一.python中是否存在方法重载 对java有了解的程序员都知道,java中存在构造方法重载和普通方法重载,重载指的是方法名相同,参数列表不同的多个方法.python中是否也支持这两种方法重载,测试 ...

  6. leetcode-hard-array-41. First Missing Positive-NO

    mycode class Solution(object): def firstMissingPositive(self, nums): """ :type nums: ...

  7. Session技术入门代码案例

    package com.loaderman.demo; import javax.servlet.ServletException; import javax.servlet.http.*; impo ...

  8. python programming GUI综合实战(在GUI上画图)

    import os import platform import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5 ...

  9. docker笔记、常遇问题、常用命令

    启动一个容器并且进到里面,退出后,容器结束 [root@bogon ~]# docker run --name mynginx -it nginx 启动一个容器,退出后自动删除 [root@bogon ...

  10. C基础知识(5):指针--传递指针给函数&返回指针的函数

    下面从3个代码例子分别讲述以下2个知识点: (1) 传递指针给函数(参数类型为指针) (2) 返回指针的函数(返回类型为指针) #include <stdio.h> // 传递指针给函数& ...