Microsoft Enterprise Library: Cache 模块

    Microsoft Enterprise Library中的Cache模块能在多种场景中提供缓存功能:Web程序,桌面程序,WPF程序。我们可以配置Cache模块的缓存处理器,目前系统自带3个缓存处理器:In-Memory,Isolated Storage Cache Store 和 Data Cache Storage。 并且我们还能实现自己的缓存处理器,只需要实现接口 IBackingStore,我们又可以发明自己的轮子啦:)

In-Memory:保存在内存中。  

Isolated Storage Cache Store:系统将缓存的信息保存在独立文件中(C:\Users\<<user name>>\AppData\Local\IsolatedStorage)。

Data Cache Storage:将缓存数据保存在数据库中。

Custom Cache Storage:自己扩展的处理器。我们可以将数据保存在注册表中或文本文件中。

 

In-Memory

            ICacheManager cacheManager = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();

            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("B", "This is letter B.");
            cacheManager.Add("C", "This is letter C.");
            cacheManager.Add("D", "This is letter D.");
            cacheManager.Add("E", "This is letter E.");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Remove("B");
            cacheManager.Remove("C");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Flush();


 

配置信息

 

 

Isolated Storage Cache Store

            simeple demo
            ICacheManager cacheManager = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();

            cacheManager.Add("A", "This is letter A");
            cacheManager.Add("B", "This is letter B");

            Console.WriteLine(string.Format("{0}:{1}", "A", cacheManager.GetData("A")));

            cacheManager.Remove("A");
            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Flush();
            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));


 

配置信息

 

Data Cache Storage

ICacheManager cacheManager = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();

            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("B", "This is letter B.");
            cacheManager.Add("C", "This is letter C.");
            cacheManager.Add("D", "This is letter D.");
            cacheManager.Add("E", "This is letter E.");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Remove("B");
            cacheManager.Remove("C");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Flush();


 

配置信息

 

 

Custom Cache Storage

ICacheManager cacheManager = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();

            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("A", "This is letter A.");
            cacheManager.Add("B", "This is letter B.");
            cacheManager.Add("C", "This is letter C.");
            cacheManager.Add("D", "This is letter D.");
            cacheManager.Add("E", "This is letter E.");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Remove("B");
            cacheManager.Remove("C");

            Console.WriteLine(string.Format("currently there are {0} elements in cache pool.", cacheManager.Count));

            cacheManager.Flush();


Custom Cache Storage实现代码

namespace SimpleCacheDemo
{
    using System;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Data;
    using System.IO;
    using Microsoft.Win32;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Collections.Generic;
    using System.Collections;

    using Microsoft.Practices.EnterpriseLibrary.Common;
    using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
    using Microsoft.Practices.ServiceLocation;
    using Microsoft.Practices.Unity.Configuration;
    using Microsoft.Practices.EnterpriseLibrary.Caching;
    using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
    using Microsoft.Practices.EnterpriseLibrary.Caching.Configuration;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    /// 
    [ConfigurationElementType(typeof(CustomCacheStorageData))]
    public class CustomStorage:IBackingStore
    {


        public CustomStorage(NameValueCollection keys)
        { }

        public void Add(CacheItem newCacheItem)
        {
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey software = hklm.OpenSubKey("software", true);
            RegistryKey microsoft = software.OpenSubKey("microsoft", true);
            RegistryKey entryDir = microsoft.CreateSubKey("customcache", RegistryKeyPermissionCheck.ReadWriteSubTree);

            if (entryDir != null)
            {

                if (entryDir.GetValue(newCacheItem.Key) == null)
                {
                    entryDir.SetValue(newCacheItem.Key, newCacheItem.Value.ToString(), RegistryValueKind.String);
                }
                entryDir.Close();
            }
            microsoft.Close();
            software.Close();
        }

        public int Count
        {
            get {
                int keyCount = 0;
                RegistryKey hklm = Registry.LocalMachine;
                RegistryKey software = hklm.OpenSubKey("software", true);
                RegistryKey microsoft = software.OpenSubKey("microsoft", true);
                using (RegistryKey entryDir = microsoft.CreateSubKey("customcache", RegistryKeyPermissionCheck.ReadWriteSubTree))
                {

                    if (entryDir != null)
                    {
                        keyCount = entryDir.GetValueNames().Length;
                    }
                }
                return keyCount;
            }
        }

        public void Flush()
        {
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey software = hklm.OpenSubKey("software", true);
            RegistryKey microsoft = software.OpenSubKey("microsoft", true);
            microsoft.DeleteSubKeyTree("customcache");

        }

        public System.Collections.Hashtable Load()
        {
            Hashtable cacheItemTbl = new Hashtable();
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey software = hklm.OpenSubKey("software", true);
            RegistryKey microsoft = software.OpenSubKey("microsoft", true);
            using (RegistryKey entryDir = microsoft.CreateSubKey("customcache", RegistryKeyPermissionCheck.ReadWriteSubTree))
            {

                if (entryDir != null)
                {
                    foreach (string key in entryDir.GetValueNames())
                    {
                        cacheItemTbl.Add(key, entryDir.GetValue("key"));
                    }
                }
            }
            return cacheItemTbl;
        }

        public void Remove(string key)
        {
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey software = hklm.OpenSubKey("software", true);
            RegistryKey microsoft = software.OpenSubKey("microsoft", true);
            using (RegistryKey entryDir = microsoft.CreateSubKey("customcache", RegistryKeyPermissionCheck.ReadWriteSubTree))
            {

                if (entryDir != null)
                {
                    entryDir.DeleteValue(key);
                }
            }
        }

        public void UpdateLastAccessedTime(string key, DateTime timestamp)
        {
           
        }

        public void Dispose()
        {
            
        }
    }
}

配置信息

 

缓存禁用

cache expire regulation
            string moniterFilePath = AppDomain.CurrentDomain.BaseDirectory + "tmp.txt";
            ICacheManager cacheManager = EnterpriseLibraryContainer.Current.GetInstance<ICacheManager>();
            if (File.Exists(moniterFilePath) == false)
            {
                using (File.Create(moniterFilePath))
                { }
            }

            // these class was implemented interface ICacheItemExpiration
            NeverExpired neverExpired = new NeverExpired();
            AbsoluteTime absoluteTime = new AbsoluteTime(new TimeSpan(0, 0, 10));//ten seconds
            SlidingTime slidingTime = new SlidingTime(new TimeSpan(0, 0, 10));
            FileDependency fileDependency = new FileDependency(moniterFilePath);

            //没实现,构造函数中的参数比较奇怪
            ExtendedFormatTime extendedFormatTIme = new ExtendedFormatTime("Hour - 0-23");

            //cache refresh listener
            CacheRefreshContainer cacheRefreshContainer = new CacheRefreshContainer(cacheManager, slidingTime);
            CacheRefresher cacheRefresher = new CacheRefresher(cacheRefreshContainer);//new CacheRefresher();//new CacheRefresher(cacheManager);


            //seems we can't add a new item in cache pool during CacheRefresher was executing.
            cacheManager.Add("A", "This is letter A!", CacheItemPriority.High, cacheRefresher, slidingTime);
            Console.WriteLine(string.Format("{0}:{1}", "A", cacheManager.GetData("A")));
            System.Threading.Thread.Sleep(15000);
            Console.WriteLine(string.Format("{0}:{1}", "AB", cacheManager.GetData("AB")));


            //test encryptograme function
            cacheManager.Add("A", "This is letter A.");
            Console.WriteLine(string.Format("{0}:{1}", "A", cacheManager.GetData("A")));
            Console.ReadKey();
            cacheManager.Flush();


CacehRefresher

    [Serializable]
    public class CacheRefresher:ICacheItemRefreshAction
    {
        //ICacheManager _cacheManager;
        //public CacheRefresher(ICacheManager cacheManager)
        //{
        //    _cacheManager = cacheManager;
        //}
        CacheRefreshContainer _cacheRefreshContainer;
        public CacheRefresher(CacheRefreshContainer cacheRefreshContainer)
        {
            _cacheRefreshContainer = cacheRefreshContainer;
        }

        public void Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason)
        {
            //_cacheManager.Remove(removedKey);
            //_cacheManager.Add(removedKey + "B", expiredValue.ToString() + " new!");
        }
    }

 

   
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值