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关键词屏蔽过滤包。
下下一篇讨论实例化对象以及代码的一些事情。