缓存的实现

我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用。

1、系统全局变量

很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便供全局使用。

代码如下:

 public class PFTCacheObject
{
/// <summary>
/// 字典
/// </summary>
private static Dictionary<string, object> _dataDic = new Dictionary<string, object>(); /// <summary>
/// 定义一个静态变量来保存类的实例
/// </summary>
private static PFTCacheObject _session; /// <summary>
/// 定义一个标识确保线程同步
/// </summary>
private static readonly object _locker = new object(); /// <summary>
/// 单例
/// </summary>
/// <returns>返回类型为Session</returns>
public static PFTCacheObject Instance
{
get
{
if (_session == null)
{
lock (_locker)
{
if (_session == null)// 如果类的实例不存在则创建,否则直接返回
{
_session = new PFTCacheObject();
}
}
}
return _session;
}
} #region Remove 移除 /// <summary>
/// 删除成员
/// </summary>
/// <param name="name"></param>
public void Remove(string name)
{
_dataDic.Remove(name);
} /// <summary>
/// 删除全部成员
/// </summary>
public void RemoveAll()
{
_dataDic.Clear();
}
#endregion #region 本类的索引器 /// <summary>
/// 本类的索引器
/// </summary>
/// <returns>返回Object成员</returns>
public Object this[string index]
{
get
{
if (_dataDic.ContainsKey(index))
{
Object obj = (Object)_dataDic[index];
return obj;
}
return null;
}
set
{
if (_dataDic.ContainsKey(index))
{
_dataDic.Remove(index);
}
_dataDic.Add(index, value);
}
}
#endregion }

这里使用一个静态变量的Dictionary来进行保存,所有项目均可以直接获取。

2、异步的数据缓存

在web上面,很多时候都是使用的HttpContext.Current.Items进行数据缓存,在.Net Framework框架上使用CallContext.LogicalSetData。在.Net Standard 上面CallContext.LogicalSetData已经不能使用了,替换他的方法是AsyncLocal。因为我们现在都是使用的是.Net Standard,并且我们项目并不仅仅是web,所以这里我们就只用使用AsyncLocal实现。

代码如下

public class PFTCallContext
{ #region 共享数据库连接 private static AsyncLocal<object> _asyncLocalConnectionOject = new AsyncLocal<object>(); /// <summary>
/// 设置共享数据库连接
/// </summary>
/// <param name="obj"></param>
public static void SetConnectionOject(object obj)
{
_asyncLocalConnectionOject.Value = obj;
} /// <summary>
/// 获取共享数据库连接
/// </summary>
/// <returns></returns>
public static object GetConnectionOject()
{
return _asyncLocalConnectionOject.Value;
} /// <summary>
/// 清空共享数据库连接
/// </summary>
public static void ClearConnectionOject()
{
_asyncLocalConnectionOject.Value = null;
} #endregion }

这里我们就先定义一个当前数据库连接对象的缓存。如果还需要其他的定义,你可以直接实现。

3、.Net Core 的MemoryCache

本来这块想使用.Net Framework框架中的cache的,但是.Net Core才是未来的大势,而且.Net Framework的cache已经有很多的实现方法了,所以这里我就直接用.Net Core 的MemoryCache。.Net Core蜗牛也在学习中,相关的API也在不断的研究,如果有问题,请大家帮忙纠正。

public static class PFTCache
{
public readonly static IMemoryCache _memoryCache; static PFTCache()
{
_memoryCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
} #region 常规缓存
/// <summary>
/// 获取缓存的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static Object GetCache(string key)
{
return _memoryCache.Get(key);
}
/// <summary>
/// 移除缓存
/// </summary>
/// <param name="key"></param>
public static void Remove(string key)
{
_memoryCache.Remove(key);
}
/// <summary>
/// 设置缓存
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public static void SetCache(string key, Object value)
{
_memoryCache.GetOrCreate(key, entry =>
{
return value;
});
}
/// <summary>
/// 设置缓存(固定时间过期)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="absoluteExpiration"></param>
public static void SetCacheAbsolute(string key, Object value, int absoluteExpiration)
{
_memoryCache.GetOrCreate(key, entry =>
{ entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(absoluteExpiration));
return value;
});
}
/// <summary>
/// 设置缓存(滚动时间过期)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <param name="slidingExpiration"></param>
public static void SetCacheSliding(string key, Object value, int slidingExpiration)
{
_memoryCache.GetOrCreate(key, entry =>
{ entry.SetSlidingExpiration(TimeSpan.FromSeconds(slidingExpiration));
return value;
});
} #endregion #region 文件依赖缓存
/// <summary>
/// 文件依赖缓存
/// </summary>
/// <param name="key"></param>
/// <param name="fullName"></param>
/// <returns></returns>
public static string DependentCacheFile(string key, string fullName)
{
var basePath = PFTFile.GetDirectoryName(fullName);
var fileName = PFTFile.GetFileName(fullName);
var fileProvider = new PhysicalFileProvider(basePath);
return _memoryCache.GetOrCreate(key, entry =>
{
entry.AddExpirationToken(fileProvider.Watch(fileName));
return PFTFile.IsExistFile(fullName) ? PFTFile.ReadFile(fullName) : string.Empty;
});
}
#endregion }

好了,关于缓存这块蜗牛就先说到这里。

C# 缓存的实现的更多相关文章

  1. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  2. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  3. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  4. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  5. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

  6. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  7. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  8. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  9. 缓存工厂之Redis缓存

    这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...

  10. .net 分布式架构之分布式缓存中间件

    开源git地址: http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedCache 分布式缓存中间件  方便实现缓存的分布式,集群, ...

随机推荐

  1. 非常详细的Django使用Token(转)

    基于Token的身份验证 在实现登录功能的时候,正常的B/S应用都会使用cookie+session的方式来做身份验证,后台直接向cookie中写数据,但是由于移动端的存在,移动端是没有cookie机 ...

  2. C# ModBus 读取数据

    简单介绍: 项目上需要与多家公司做接口对接.我们提供接口的有,其他公司提供的接口也有.所有的接口全部对接完了,遇到一个非常棘手的问题,需要获取甲方船厂设备上的状态,就给了一个文档,文档上写了IP.端口 ...

  3. Spring中的循环依赖解决详解

    前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文 ...

  4. Linux网络问题排错

    前言 作为一名软件工程师,Linux相关的知识是一个不可或缺的技能点,而网络问题往往是初学者接触Linux时最先碰到的一只拦路虎,本篇博客将系统的讲解一个解决Linux网络问题的通用方法论,一个科学的 ...

  5. 盘一盘 NIO (三)—— Selector解析

    Selector是个啥? Selector是Java NIO核心组件中的选择器,用于检查一个或多个Channel(通道)的状态是否处于可读.可写.实现一个单独的线程可以管理多个channel,从而管理 ...

  6. 解决mysql乱码

    总结的几个乱码问题 希望我们全体学员也能够学会总结 java web 很是希望大家能够学好.并且也希望大家能够在学习过程中不段的积累相关的知识点 1.在response中写<meta  http ...

  7. 10.源码分析---SOFARPC内置链路追踪SOFATRACER是怎么做的?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  8. 牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)

    求最小的两个数相加为sum //求最小的两个数相加为sum public ArrayList<Integer> FindNumbersWithSum(int [] array,int su ...

  9. 记录一下vue transition 过渡各状态()

    .slide-fade-enter{   opacity: 0;   transform: translateX(100px);   /*从哪里开始过渡:在过渡之前我就把位置定义在100px的位置,并 ...

  10. STM32F0系列芯片SPI发送一字节数据却输出16个CLK时钟的解决办法

    问题 上一个项目在用寄存器操作STM32F0芯片的SPI_DR寄存器的时候,发现一个问题: 我给DR寄存器赋值一个uint8_t一字节大小的数据,SPI引脚能正确输出数据和时钟,但前面八位正确的数据输 ...