封装MemoryCache
一、定义一个缓存接口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的更多相关文章
- 第二节:从程序集的角度分析MemoryCache,并完成基本封装
一. 轻车熟路 有了上一个章节对 System.Web.Caching.Cache 的探究,这里我们按照同样的思路对 MemoryCache 进行探究,相信必定会得心应手. 1. 程序集准备 a. 需 ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...
- Atitit. C# java 的api 目录封装结构映射总结
Atitit. C# java 的api 目录封装结构映射总结 C# java ref System.Reflection System.Type, java.lang.ref concurrent ...
- Android 框架修炼-自己封装双缓存管理框架库
一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...
- Asp.net Core 缓存 MemoryCache 和 Redis
Asp.net Core 缓存 MemoryCache 和 Redis 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitH ...
- 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理(转)
在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...
- 在.NET项目中使用PostSharp,使用MemoryCache实现缓存的处理
在之前一篇随笔<在.NET项目中使用PostSharp,实现AOP面向切面编程处理>介绍了PostSharp框架的使用,试用PostSharp能给我带来很多便利和优势,减少代码冗余,提高可 ...
- 在ASP.NET Core 2.0中使用MemoryCache
说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...
随机推荐
- Web APi入门之Self-Host寄宿及路由原理 【转载】
前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知 ...
- Learn ft=rom WTL: CXXImpl<T>
// t9.cpp : Defines the entry point for the console application. // #include "stdafx.h" cl ...
- 5、Linux-Mac配置环境变量
1.安装jdk1.6,1.7,1.8 2.查看jdk安装目录 /usr/libexec/java_home -v 1.6 /usr/libexec/java_home -v 1.7 /usr/libe ...
- mysql重复start stop slave测试
如题,测试重复start slave, stop slave是否会有报错. 版本 5.7.21 重复start slave测试 第一次start >start slave; Query OK, ...
- 报错: unable to register MBean
解决方法: 在SpringBoot项目中配置文件加上 spring.jmx.enabled=false https://stackoverflow.com/questions/27440985/una ...
- Digispark红外接收器
一.红外协议之NEC协议原理 NEC协议格式: 首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是 ...
- Web API 令牌(秘钥是双方约定的,并不在网络连接上传输)
http://blog.csdn.net/qq289523052/article/details/47750021 秘钥是双方约定的,并不在网络连接上传输 Web API数据传输加密 2015-08- ...
- 简单说throw和throws的区别
1. 区别 throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是指抛出的一个具体的异常类型. 2.分别介绍 ...
- 找不到 EntityType “ ” 的映射和元数据信息。
意思是: 数据库里边有添加的新字段DB1,而程序中的的实体即“元数据”中没有这个新字段Et1,由于EntityFramework更新模型时已自动默认对DB1和Et1进行了映射(默认认为实体中存在这个字 ...
- ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)
问题描述 我们可以把由“”和“”组成的字符串分为三类:全“”串称为B串,全“”串称为I串,既含“”又含“”的串则称为F串. FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种.由一个长 ...