C# 缓存的实现
缓存的实现
我们不是做第三方比如Redis等的缓存实现,而是根据实际情况,基于C#上做一些环境变量的保存,方便项目使用。
1、系统全局变量
很多时候,在系统运行开始,需要对系统的运行参数进行保存,以便供全局使用。
代码如下:
复制代码
public class PFTCacheObject
{
///
/// 字典
///
private static Dictionary _dataDic = new Dictionary();
///
/// 定义一个静态变量来保存类的实例
///
private static PFTCacheObject _session;
///
/// 定义一个标识确保线程同步
///
private static readonly object _locker = new object();
///
/// 单例
///
/// 返回类型为Session
public static PFTCacheObject Instance
{
get
{
if (_session == null)
{
lock (_locker)
{
if (_session == null)// 如果类的实例不存在则创建,否则直接返回
{
_session = new PFTCacheObject();
}
}
}
return _session;
}
}
#region Remove 移除
///
/// 删除成员
///
///
public void Remove(string name)
{
_dataDic.Remove(name);
}
///
/// 删除全部成员
///
public void RemoveAll()
{
_dataDic.Clear();
}
#endregion
#region 本类的索引器
///
/// 本类的索引器
///
/// 返回Object成员
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