C#的一个小菜鸟所写的缓存模块
做了一个缓存模块。主要是难有一个完整的缓存类支持多种缓存并且简单,所以就倒腾了个。
Discuz!nt的缓存写的很牛但是的确很复杂。尽管主要是为了解决WEB园中缓存同步的场景,但是觉得比较无用。不过据说最新版的修改了。如果能够开启WEB园那应该就不是虚拟机了,既然是自己的机器
为什么装个Memcached就会更好啊。纠结啊。所以那个缓存类也是很值得使用的。
自己就写了个。反正简单用着。还行。估计有不少BUG。如果有bug就告诉下我,我好修改。里面的MemCached有部分方法没实现,主要是因为默认的方法并不包含这些,所以这个可以自己去修改下客户端。不过那样会破坏Memcached的效率。
MemCached的客户端包都一起封装进去了。省了想用的人再去下载,还有就是因为因为默认的那个叫EN什么的库有点bug。后来就稍微修改了下。(名字忘记了不好意思呵呵。之后我会把
那个给完整的发下,命名空间我也改了。主要是为了好区分。给开源团队道歉下。同时貌似memcached是mit协议的 允许修改的。)
代码写的比较菜。使用泛型只是为了让上面调用少掉类型转化,代码也会变得简单。目前是支持两个都同时运行。如果需要单一的缓存的话自己去倒腾下吧。使用微软企业库也可以自己实现下接口。推荐使用TryGetValue(string key out T value);方法。
其中有一个EnableCache。这个可以写到配置项里来开启是否使用缓存。该有的都有了。代码简单,越简单的代码越好维护。(估计要被架构师拍砖了。)
发成块的代码只是为了简单使用了。大家都免得重复的制造无数的轮子,现在轮子真的到处都是了。
废话一堆。直接发代码了。晕不支持上传,强烈的批评DUDU老大。
主要接口如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Collections.ObjectModel;
namespace Doodle.Cache
{
/// <summary>
/// 缓存类接口
/// </summary>
public interface ICache
{
/// <summary>
/// 获取一个值,指示当前的缓存是否可用
/// </summary>
bool EnableCache
{
get;
}
/// <summary>
/// 获取缓存的类型
/// </summary>
CacheType Type
{
get;
}
/// <summary>
/// 检查缓存中是否存在指定的键
/// </summary>
/// <param name="key">要检查的键</param>
/// <returns>返回一个值,指示检查的键是否存在</returns>
bool Contains(string key);
/// <summary>
/// 检查系统中是否存在指定的缓存
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="key">缓存key</param>
/// <returns>返回这个类型的值是否存在</returns>
bool Contains<T>(string key);
/// <summary>
/// 从缓存中获取指定键的值
/// </summary>
/// <param name="key">要获取的键</param>
/// <returns>返回指定键的值</returns>
T Get<T>(string key);
/// <summary>
/// 获取缓存中键值的数量
/// </summary>
int Count
{
get;
}
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <returns>返回添加的键值</returns>
void Add<T>(string key, T value);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <param name="absoluteExpiration">过期时间</param>
/// <returns>返回添加的键值</returns>
void Add<T>(string key, T value, DateTime absoluteExpiration);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <param name="slidingExpiration">保存时间</param>
/// <returns>返回添加的键值</returns>
void Add<T>(string key, T value, TimeSpan slidingExpiration);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <param name="minutes">保存时间(分钟)</param>
/// <returns>返回添加的键值</returns>
void Add<T>(string key, T value, int minutes);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <param name="priority">优先级</param>
/// <param name="slidingExpiration">保存时间</param>
void Add<T>(string key, T value, CachePriority priority, TimeSpan slidingExpiration);
/// <summary>
/// 添加缓存
/// </summary>
/// <param name="key">关键字</param>
/// <param name="value">缓存值</param>
/// <param name="priority">优先级</param>
/// <param name="absoluteExpiration">过期时间</param>
void Add<T>(string key, T value, CachePriority priority, DateTime absoluteExpiration);
/// <summary>
/// 尝试返回指定的缓存
/// </summary>
/// <typeparam name="T">缓存内容的类型</typeparam>
/// <param name="key">缓存的key</param>
/// <param name="value">缓存的内容</param>
/// <returns>是否存在这个缓存</returns>
bool TryGetValue<T>(string key, out T value);
/// <summary>
/// 移除键中某关键字的缓存并返回相应的值
/// </summary>
/// <param name="key">关键字</param>
void Remove(string key);
/// <summary>
/// 移除键中带某关键字的缓存
/// </summary>
/// <param name="key">关键字</param>
/// <returns>返回被移除的项的数量</returns>
int RemoveContains(string key);
/// <summary>
/// 移除键中以某关键字开头的缓存
/// </summary>
/// <param name="key">关键字</param>
/// <returns>返回被移除的项的数量</returns>
int RemoveStartWith(string key);
/// <summary>
/// 移除键中以某关键字结尾的缓存
/// </summary>
/// <param name="key">关键字</param>
/// <returns>返回被移除的项的数量</returns>
int RemoveEndWith(string key);
/// <summary>
/// 移除键中所有的缓存
/// </summary>
/// <returns>返回被移除的项的数量</returns>
int Clear();
/// <summary>
/// 缓存中所有的键列表
/// </summary>
ReadOnlyCollection<string> Keys
{
get;
}
}
/// <summary>
/// 缓存的优先级
/// </summary>
public enum CachePriority
{
/// <summary>
/// 无
/// </summary>
None = 0,
/// <summary>
/// 低
/// </summary>
Low = 1,
/// <summary>
/// 普通
/// </summary>
Normal = 2,
/// <summary>
/// 高
/// </summary>
High = 3,
/// <summary>
/// 不能被删除
/// </summary>
NotRemovable = 4,
}
}
那就先放个腾讯的下载地址吧。
很抱歉 最后腾讯的地址不支持其他的人下载。需要的留下个邮箱我给您们发吧。实在对不住各位了。
下一篇发下Hash关键词屏蔽过滤包。
下下一篇讨论实例化对象以及代码的一些事情。