一、定义一个缓存接口IChace

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 缓存
{
public interface ICache
{
T Get<T>(string key);
void Add(string key,object data,int cacheTime=);
bool Contains(string keys);
void Remove(string key);
void RemoveAll();
object this[string key] { get;set; }
int Count { get; }
}
}

二、定义一个MyCache类用来封装MemoryCache的基本业务,实现缓存接口IChace

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Caching;
using System.Text; namespace 缓存
{
class MyCache : ICache
{
/// <summary>
/// 索引器,提供一个全局读写
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public object this[string key] { get => Cache.Get(key); set => Add(key,value); } protected MemoryCache Cache
{
get
{
return MemoryCache.Default;
}
} public int Count =>(int)Cache.GetCount() ; /// <summary>
/// 添加缓存
/// </summary>
/// <param name="key"></param>
/// <param name="data"></param>
/// <param name="cacheTime">分钟</param>
public void Add(string key, object data, int cacheTime = )
{
if (Cache.Contains(key))
{
this.Remove(key);
}
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Add(new CacheItem(key, data), policy);
} /// <summary>
/// 判断cache是否存在
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Contains(string key)
{
return Cache.Contains(key);
} /// <summary>
/// 读取缓存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T Get<T>(string key)
{
if (Cache.Contains(key))
{
return (T)Cache[key];
}
else
{
return default(T);
}
} /// <summary>
/// 删除缓存
/// </summary>
/// <param name="key"></param>
public void Remove(string key)
{
Cache.Remove(key);
} /// <summary>
/// 删除所有缓存
/// </summary>
public void RemoveAll()
{
foreach (var item in Cache)
{
this.Remove(item.Key);
}
}
}
}

三、定义一个CacheManager类来管理不同的缓存对象,上端主程序直接调用该类进行业务缓存

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace 缓存
{
public class CacheManager
{
private CacheManager()
{ }
private static ICache _cache = null;
static CacheManager()
{
_cache = Activator.CreateInstance(typeof(MyCache)) as ICache;
} /// <summary>
/// 获取缓存数量
/// </summary>
public static int Count => _cache.Count; /// <summary>
/// 判断缓存项是否存在
/// </summary>
/// <param name="key">缓存项</param>
/// <returns></returns>
public static bool Conatins(string key)
{
return _cache.Contains(key);
} /// <summary>
/// 判断是否存在缓存,存在返回结果,不存在返回T类型的默认值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public static T Get<T>(string key)
{
if(Conatins(key))
{
return _cache.Get<T>(key);
}
else
{
return default(T);
}
} /// <summary>
/// 判断是否存在缓存,如果没有则先增加再获取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">缓存项</param>
/// <param name="func">没有缓存时所增加的缓存项</param>
/// <param name="cacheTime">默认过期时间</param>
/// <returns></returns>
public static T Get<T>(string key,Func<T> func,int cacheTime=)
{
if (!_cache.Contains(key))
{
_cache.Add(key, func, cacheTime);
}
return _cache.Get<T>(key);
} /// <summary>
/// 删除缓存数据项
/// </summary>
/// <param name="key">缓存项</param>
public static void Remove(string key)
{
_cache.Remove(key);
} /// <summary>
/// 删除所有缓存数据项
/// </summary>
public static void RemoveAll()
{
_cache.RemoveAll();
}
}
}

封装MemoryCache的更多相关文章

  1. 第二节:从程序集的角度分析MemoryCache,并完成基本封装

    一. 轻车熟路 有了上一个章节对 System.Web.Caching.Cache 的探究,这里我们按照同样的思路对 MemoryCache 进行探究,相信必定会得心应手. 1. 程序集准备 a. 需 ...

  2. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  3. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...

  4. Atitit. C# java 的api 目录封装结构映射总结

    Atitit. C#  java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent ...

  5. Android 框架修炼-自己封装双缓存管理框架库

    一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...

  6. Asp.net Core 缓存 MemoryCache 和 Redis

    Asp.net Core 缓存 MemoryCache 和 Redis 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitH ...

  7. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理(转)

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

  8. 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理

    在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...

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

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

随机推荐

  1. 数学与猜想 数学中的归纳和类比 (G. 波利亚 著)

    第一章 归纳方法 (已看) $1. 经验和信念 $2. 启发性联想 $3. 支持性联想 $4. 归纳的态度 第二章 一般化,特殊化,类比 (已看) $1. 一般化,特殊化,类比和归纳 $2. 一般化 ...

  2. C# 键盘响应事件及键值对照表

    键盘响应事件总结 键盘响应事件是在用户按下某个键后触发的事件,可以是任意操作,但不是任意键都可以被捕获的. 原型:public event KeyPressEventHandler KeyPress ...

  3. GlusterFS学习

    环境准备 3台机器,每个机器双网卡,每个机器还需要额外添加1个10GB的磁盘用于测试 机器系统版本是centos6.6 [root@gluster-1-1 ~]# uname -rm 2.6.32-5 ...

  4. pycharm开发django项目 static报404解决方法

    settings文件中确保有以下配置 # Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.10/ ...

  5. Request.QueryString()和Request()和Request.Form();

    一. querystring的用法及原理 当页面上的 FORM以 GET方式向页面发送请求数据 (如数据含有不安全字符,则浏览器先将其转换成 16进制的字符再传送,如空格被转成 %20)时, WEB ...

  6. Eclipse提交代码到Spark集群上运行

    Spark集群master节点:      192.168.168.200 Eclipse运行windows主机: 192.168.168.100 场景: 为了测试在Eclipse上开发的代码在Spa ...

  7. 阅读 ‘External Memory PHY Interface (ALTMEMPHY)’笔记

    阅读 ‘External Memory PHY Interface (ALTMEMPHY)’笔记 1.PLL reference clock frequency 此处控制器输入时钟设置为100MHz, ...

  8. oracle 存储过程、游标参考实例

    create or replace procedure INIT_DICT_QUEUECODE(p_queueId int,p_paramType in varchar2,p_queenName in ...

  9. 【转】[Android] NDK独立编译——独立工具链

    转载地址:https://blog.csdn.net/suningning/article/details/74510125

  10. VS2010 如何自动生成UML图

    项目名---右键----查看类图