做了一个缓存模块。主要是难有一个完整的缓存类支持多种缓存并且简单,所以就倒腾了个。

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

作者: imfunny 发表于 2011-07-05 11:21 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架