为程序使用内存缓存(MemoryCache)

为了程序的灵活性,可能为程序使用了XML等外部文件存储配置,但也有可能文件内容会被频繁读取,为了减小磁盘的读取次数,提升程序性能,能够将频繁读取的配置文件缓存到内存中,加速配置的读取。而且须要能够在配置文件更改后及时的更新缓存。缓存

(该功能多是.NET Framework 4.0 新加,其余低版本未测试)性能

下面经过一个方法来讲明缓存的使用方法,说明详见注释:测试

/// <summary>
/// 从内存缓存中读取配置。若缓存中不存在,则从新从文件中读取配置,存入缓存
/// </summary>
/// <param name="cacheKey">缓存Key</param>
/// <returns>配置词典</returns>
private static Dictionary<string, string> GetConfigDictionary(string cacheKey)
{
    Dictionary<string, string> configs = null;

    //一、获取内存缓存对象
    ObjectCache cache = MemoryCache.Default;
    
    //二、经过Key判断缓存中是否已有词典内容(Key在存入缓存时设置)
    if (cache.Contains(cacheKey))
    {
        //三、直接从缓存中读取词典内容
        configs = cache.GetCacheItem(cacheKey).Value as Dictionary<string, string>;
    }
    else
    {
        //三、读取配置文件,组成词典对象,准备放到缓存中
        configs = GetFromXml();
        
        //四、检查是否读取到配置内容
        if (configs != null)
        {
            //四、新建一个CacheItemPolicy对象,该对象用于声明配置对象在缓存中的处理策略
            CacheItemPolicy policy = new CacheItemPolicy();
            
            //五、由于配置文件一直须要读取,因此在此设置缓存优先级为不该删除
            // 实际状况请酌情考虑,同时能够设置AbsoluteExpiration属性指定过时时间
            policy.Priority = CacheItemPriority.NotRemovable;

            //六、将词典内容添加到缓存,传入 缓存Key、配置对象、对象策略
            // Set方法首先会检查Key是否在缓存中存在,若是存在,更新value,不存在则建立新的
            // 这里先加入缓存再加监视的缘由是:在缓存加入时,也会触发监视事件,会致使出错。
            cache.Set(cacheKey, configs, policy);

            //七、监视文件须要传入一个IList对象,因此即使只有一个文件也须要新建List对象
            List<string> filePaths = new List<string>() { "c:\config.xml" };

            //八、新建一个文件监视器对象,添加对资源文件的监视
            HostFileChangeMonitor monitor = new HostFileChangeMonitor(filePaths);
            
            //九、调用监视器的NotifyOnChanged方法传入发生改变时的回调方法
            monitor.NotifyOnChanged(new OnChangedCallback((o) =>
                    { 
                        cache.Remove(cacheKey);
                    }
                ));
                
            //十、为配置对象的缓存策略加入监视器
            policy.ChangeMonitors.Add(monitor);
        }
    }
    return configs;
}

反正缓存用起来也就是经过Key来增删改查,内存缓存还能够在config中的配置对内存的使用状况,其实默认自动管理也不错哈。spa

相关内容能够查阅msdn:http://msdn.microsoft.com/ZH-CN/library/vstudio/dd941872(v=vs.110).aspxcode

相关文章
相关标签/搜索