封装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 ...
随机推荐
- day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁
一.线程 1.进程:资源的分配单位 线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...
- Spring 框架的历史
2002 年 10 月,Rod Johnson 撰写了一本名为 Expert One-on-One J2EE 设计和开发的书.本书由 Wrox出版,介绍了当时 Java 企业应用程序开发的情况,并指出 ...
- python初始化list列表(1维、2维)
1.初始化递增的list: list1 = range(10)#print list1#[0,1,2,...,9] 2.初始化每项为0的一维数组: list2 = [0] * 5#print list ...
- 在CentOS6.8系统上安装MySQL5.7(转)
mysql-57">如何在CentOS 6.8系统上安装MySQL 5.7? 一.检查系统上是否已经安装MySQL 命令: ? 1 2 3 4 5 [root@localhost ~] ...
- 在Hanlp词典手动添加未登录词的方式介绍
在使用Hanlp词典进行分词的时候,会出现分词不准的情况,原因是内置词典中并没有收录当前这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作呢,下面我们来看一下: ...
- RedHat7.3安装MySQL5.7
1.下载Mysql安装包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-1.el6.x86_64.rpm-bundle.tar 附百度 ...
- Hyperledger fabric 1.3版本的安装部署(原创多机多Orderer部署
首先,我们在安装前,要考虑一个问题 Hyperledger Fabric,通过指定的节点进行背书授权,才能完成交易的存储 延伸开来,就是为了实现容错.高并发.易扩展,需要zookeeper来选择排序引 ...
- sql重置标识
DBCC CHECKIDENT ( 'table_name' [ , { NORESEED | { RESEED [ , new_reseed_val ...
- 安装Python时遇到的api-ms-win-crt-runtime-l1-1-0.dll 丢失问题
api-ms-win-crt-runtime-l1-1-0.dll 丢失 电脑找不到api-ms-win-crt-runtime-l1-1-0.dll文件解决方法: 问题描述: 1.开机提示“api- ...
- sass之为什么要使用预处理器
使用预处理器主要目的就是编写出可读性更好.更易于维护的css. 以sass为例,sass中提供了@import可以在sass文件中导入其他sass文件,或在选择器中按需导入所需要的某个属性样式: @i ...