C# CacheHelper
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web; namespace Utils
{
/// <summary>
/// 自定义字典缓存帮助类
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <typeparam name="TValue"></typeparam>
public class SynchronisedDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> innerDict; // 缓存内容
private ReaderWriterLockSlim readWriteLock; // 读写锁 /// <summary>
/// 初始化构造函数
/// </summary>
/// <param name="dic"></param>
public SynchronisedDictionary(Dictionary<TKey, TValue> dic)
{
this.readWriteLock = new ReaderWriterLockSlim();
this.innerDict = dic ?? new Dictionary<TKey, TValue>();
} /// <summary>
/// 使用lambda初始化构造函数
/// </summary>
/// <param name="getKey"></param>
/// <param name="list"></param>
public SynchronisedDictionary(Func<TValue, TKey> getKey, List<TValue> list)
{
this.readWriteLock = new ReaderWriterLockSlim();
this.innerDict = new Dictionary<TKey, TValue>(); if (list != null && list.Count > )
{
foreach (var item in list)
{
var key = getKey(item);
if (this.innerDict.ContainsKey(key))
{
this.innerDict[key] = item;
}
else
{
this.innerDict.Add(getKey(item), item);
}
}
}
} /// <summary>
/// 同步缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="value">缓存值</param>
/// <param name="del">是否删除</param>
/// <remarks>
/// 新增:SyncCache(Id,Value,false)
/// 修改:SyncCache(Id,Value,false)
/// 删除:SyncCache(Id,null,true)
/// </remarks>
public void SyncCache(TKey key, TValue value, bool del = false)
{
if (del)
{
Remove(key);
}
else
{
this[key] = value;
}
} /// <summary>
/// 通过KeyValuePair新增缓存(建议使用SyncCache方法)
/// </summary>
/// <param name="item">KeyValuePair键值对</param>
public void Add(KeyValuePair<TKey, TValue> item)
{
using (new AcquireWriteLock(this.readWriteLock))
{
this.innerDict[item.Key] = item.Value;
}
} /// <summary>
/// 根据Key,Value新增缓存(建议使用SyncCache方法)
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="value">缓存值</param>
public void Add(TKey key, TValue value)
{
using (new AcquireWriteLock(this.readWriteLock))
{
this.innerDict[key] = value;
}
} /// <summary>
/// 移除缓存(建议使用SyncCache方法)
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(TKey key)
{
bool isRemoved;
using (new AcquireWriteLock(this.readWriteLock))
{
isRemoved = this.innerDict.Remove(key);
}
return isRemoved;
} /// <summary>
/// 移除缓存(建议使用SyncCache方法)
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool Remove(KeyValuePair<TKey, TValue> item)
{
using (new AcquireWriteLock(this.readWriteLock))
{
return this.innerDict.Remove(item.Key);
}
} /// <summary>
/// 清空所有缓存
/// </summary>
public void Clear()
{
using (new AcquireWriteLock(this.readWriteLock))
{
this.innerDict.Clear();
}
} /// <summary>
/// 是否包含指定元素
/// </summary>
/// <param name="item">KeyValuePair键值对</param>
/// <returns></returns>
public bool Contains(KeyValuePair<TKey, TValue> item)
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.Contains<KeyValuePair<TKey, TValue>>(item);
}
} /// <summary>
/// 是否包含指定的键
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool ContainsKey(TKey key)
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.ContainsKey(key);
}
} /// <summary>
/// copy到指定Array中
/// </summary>
/// <param name="array"></param>
/// <param name="arrayIndex"></param>
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
using (new AcquireReadLock(this.readWriteLock))
{
this.innerDict.ToArray<KeyValuePair<TKey, TValue>>().CopyTo(array, arrayIndex);
}
} /// <summary>
/// 获取枚举数
/// 可用foreach
/// </summary>
/// <returns></returns>
public IEnumerator GetEnumerator()
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.GetEnumerator();
}
} IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.GetEnumerator();
}
} /// <summary>
/// 获取缓存
/// </summary>
/// <param name="key">缓存键</param>
/// <param name="value">缓存值</param>
/// <returns></returns>
public bool TryGetValue(TKey key, out TValue value)
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.TryGetValue(key, out value);
}
} /// <summary>
/// 获取缓存的所有KEY
/// </summary>
public ICollection<TKey> Keys
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.Keys;
}
}
} /// <summary>
/// 获取缓存的所有VALUE
/// </summary>
public ICollection<TValue> Values
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.Values;
}
}
} /// <summary>
/// 获取缓存长度
/// </summary>
public int Count
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict.Count;
}
}
} /// <summary>
/// TValue属性读写
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public TValue this[TKey key]
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return this.innerDict[key];
}
}
set
{
using (new AcquireWriteLock(this.readWriteLock))
{
this.innerDict[key] = value;
}
}
} /// <summary>
/// 是否只读
/// </summary>
public bool IsReadOnly
{
get
{
return false;
}
}
} /// <summary>
/// 自定义列表缓存帮助类
/// </summary>
/// <typeparam name="TValue"></typeparam>
public class SynchronisedList<TValue> : IList<TValue>
{
private List<TValue> innerList; // 缓存内容
private ReaderWriterLockSlim readWriteLock; // 读写锁 /// <summary>
/// 初始化构造函数
/// </summary>
/// <param name="list"></param>
public SynchronisedList(IEnumerable<TValue> list)
{
innerList = new List<TValue>();
readWriteLock = new ReaderWriterLockSlim();
if (list != null && list.Count() > )
{
this.innerList.AddRange(list);
}
} /// <summary>
/// 获取缓存内容列表
/// </summary>
/// <returns></returns>
public List<TValue> GetList()
{
return this.innerList;
} /// <summary>
/// 获取索引
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public int IndexOf(TValue item)
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList.IndexOf(item);
}
} /// <summary>
/// 根据索引插入值
/// </summary>
/// <param name="index"></param>
/// <param name="item"></param>
public void Insert(int index, TValue item)
{
using (new AcquireWriteLock(this.readWriteLock))
{
innerList.Insert(index, item);
}
} /// <summary>
/// 根据索引移除值
/// </summary>
/// <param name="index"></param>
public void RemoveAt(int index)
{
using (new AcquireWriteLock(this.readWriteLock))
{
innerList.RemoveAt(index);
}
} /// <summary>
/// TValue属性读写
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public TValue this[int index]
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList[index];
}
}
set
{
using (new AcquireWriteLock(this.readWriteLock))
{
innerList[index] = value;
}
}
} /// <summary>
/// 插入值
/// </summary>
/// <param name="item"></param>
public void Add(TValue item)
{
using (new AcquireWriteLock(this.readWriteLock))
{
innerList.Add(item);
}
} /// <summary>
/// 清除缓存
/// </summary>
public void Clear()
{
using (new AcquireWriteLock(this.readWriteLock))
{
innerList.Clear();
}
} /// <summary>
/// 是否包含
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool Contains(TValue item)
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList.Contains(item);
}
} /// <summary>
/// copy到指定Array中
/// </summary>
/// <param name="array"></param>
/// <param name="arrayIndex"></param>
public void CopyTo(TValue[] array, int arrayIndex)
{
using (new AcquireReadLock(this.readWriteLock))
{
innerList.CopyTo(array, arrayIndex);
}
} /// <summary>
/// 获取缓存长度
/// </summary>
public int Count
{
get
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList.Count;
}
}
} /// <summary>
/// 只读属性
/// </summary>
public bool IsReadOnly
{
get
{
return false;
}
} /// <summary>
/// 移除值
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public bool Remove(TValue item)
{
using (new AcquireWriteLock(this.readWriteLock))
{
return innerList.Remove(item);
}
} /// <summary>
/// 获取枚举数
/// 可用foreach
/// </summary>
/// <returns></returns>
public IEnumerator<TValue> GetEnumerator()
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList.GetEnumerator();
}
} IEnumerator IEnumerable.GetEnumerator()
{
using (new AcquireReadLock(this.readWriteLock))
{
return innerList.GetEnumerator();
}
}
} class AcquireReadLock : IDisposable
{
private ReaderWriterLockSlim rwLock;
private bool disposedValue; public AcquireReadLock(ReaderWriterLockSlim rwLock)
{
this.rwLock = new ReaderWriterLockSlim();
this.disposedValue = false;
this.rwLock = rwLock;
this.rwLock.EnterReadLock();
} public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if (!this.disposedValue && disposing)
{
this.rwLock.ExitReadLock();
}
this.disposedValue = true;
}
} class AcquireWriteLock : IDisposable
{
private ReaderWriterLockSlim rwLock;
private bool disposedValue; public AcquireWriteLock(ReaderWriterLockSlim rwLock)
{
this.rwLock = new ReaderWriterLockSlim();
this.disposedValue = false;
this.rwLock = rwLock;
this.rwLock.EnterWriteLock();
} public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if (!this.disposedValue && disposing)
{
this.rwLock.ExitWriteLock();
}
this.disposedValue = true;
}
} public class WebCacheHelper
{
System.Web.Caching.Cache Cache = HttpRuntime.Cache; public void Set(string key, object data)
{
Cache.Insert(key, data);
}
public void Set(string key, object data, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
Cache.Insert(key, data, null, absoluteExpiration, slidingExpiration);
} public object Get(string Key)
{
return Cache[Key];
} public T Get<T>(string key)
{
return (T)Cache[key];
} public bool IsSet(string key)
{
return Cache[key] != null;
} public void Remove(string Key)
{
if (Cache[Key] != null)
{
Cache.Remove(Key);
}
} public void RemoveByPattern(string pattern)
{
IDictionaryEnumerator enumerator = Cache.GetEnumerator();
Regex rgx = new Regex(pattern, (RegexOptions.Singleline | (RegexOptions.Compiled | RegexOptions.IgnoreCase)));
while (enumerator.MoveNext())
{
if (rgx.IsMatch(enumerator.Key.ToString()))
{
Cache.Remove(enumerator.Key.ToString());
}
}
} public void Clear()
{
IDictionaryEnumerator enumerator = Cache.GetEnumerator();
while (enumerator.MoveNext())
{
Cache.Remove(enumerator.Key.ToString());
}
} }
}
C# CacheHelper的更多相关文章
- 缓存工具类CacheHelper
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- MySqlHelper、CacheHelper
MySqlHelper代码: using System; using System.Collections; using System.Collections.Generic; using Syste ...
- [Cache] C#操作缓存--CacheHelper缓存帮助类 [复制链接]
using System;using System.Web;using System.Collections; namespace DotNet.Utilities{ public class Cac ...
- Asp.net Core CacheHelper 通用缓存帮助类
using System; using Microsoft.Extensions.Caching.Memory; using System.Runtime; namespace UFX.Tools { ...
- [Cache] C#操作缓存--CacheHelper缓存帮助类 (转载)
点击下载 CacheHelper.zip CacheHelper 缓存帮助类 C#怎么操作缓存 怎么设置和取缓存数据,都在这个类里面呢 下面看一下代码吧 /// <summary> /// ...
- CacheHelper工具类的使用
package com.bbcmart.util; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import ne ...
- C#操作缓存--CacheHelper缓存帮助类
/// <summary>/// 类说明:Assistant/// 联系方式:361983679 /// 更新网站:<a href=\"http://www.cckan. ...
- C#缓存-依赖 CacheHelper
缓存依赖文件或文件夹 //创建缓存依赖项 CacheDependency dep = new CacheDependency(fileName);//Server.MapPath("&quo ...
- C# WebHelper-CookieHelper,CacheHelper,SessionHelper
常用web操作工具类,记录一下,本文记录的工具类,都要求引用 System.Web 1.CookieHelper /// <summary> /// Cookie工具类 /// </ ...
- WebHelper-SessionHelper、CookieHelper、CacheHelper、Tree
ylbtech-Unitity: cs-WebHelper-SessionHelper.CookieHelper.CacheHelper.Tree SessionHelper.cs CookieHel ...
随机推荐
- EF的四种开发模式
EF提供了四种开发模式,具体如下:(转载)Code First(New DataBase) :在代码中定义类和映射关系并通过model生成数据库,使用迁移技术更新数据库.Code First(Exis ...
- Varnish缓存服务
Varnish缓存服务详解及应用实现 1.varnish的基本介绍 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已 ...
- [转]How To Use CSS3 Media Queries To Create a Mobile Version of Your Website
CSS3 continues to both excite and frustrate web designers and developers. We are excited about the p ...
- Tomcat 学习笔记二
学习一 java.bean.PropertyChangeListener用来监听bean类的属性值改变.当改变时同时执行对应事件.而且是线程安全的.tomcat用此reload的Boolean值改变是 ...
- Linux环境进程间通信(二):信号(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- Myeclipse 10 for mac 破解版下载安装及破解方法
下载地址:http://pan.baidu.com/share/link?shareid=463687&uk=1798617416 解压下载好的压缩包Myeclipse 10 for mac+ ...
- jQuery Validation让验证变得如此容易(二)
上一个例子我们是统一引用jquery.validate.js这样所有必填字段的提示信息都将是This field is required. 现在要改成动态提示,比如姓名如果为空则提示姓名不能为空,密码 ...
- 解决MSSQL 2008不能用IP登录的问题
解决MSSQL 2008不能用IP登录的问题 前提准备:mssql 2008已安装好了一个实例(我按默认情况下安装的实例是:SQLEXPRESS),并安装了SQL Server Manag ...
- Ajax实现天气预报功能
实现天气预报功能 闲来无聊,写下此文 经常看见很多网站上有那种天气预报功能,自己之前也写过一个,不过属于那种涉及WCF服务引用那种,今天发现一个更为简单的方式来实现,使用Javascript和Ajax ...