Galbanum之Cache(一)

asp.net提供缓存机制,但是很多的winForm和类库中也同样希望能使用上缓存,GalBanum.Cache正是提供这样的功能,
主要有ICache接口,HashTableCache类继承ICache接口,CacheFactory工厂生产ICache,CacheEntity保存缓存的value和key
,整体是通过静态Dictionary来保CacheEntity,然后再起子线程定时循环临控缓存是否过期,过期则删除,由于Dictionary不能在迭代的时候发生操作,所以用了一个静态的List<object> keys来同步保存key值。
Cache.dll文件下载地址: http://download.csdn.net/source/859667
Galbanum.Cache源代码下载地址: http://download.csdn.net/source/859676

缓存使用方法代码如下:

首先得using Cache;
  1. protected void UseCache()
  2.     {
  3.         ICache hcc = CacheFactory.GetCache<HashTableCache>();
  4.         using (IDataBase dbase = DataBaseFactory.GetDataBase("conn1"))
  5.         {
  6.             dbase.Open();
  7.             IList<Employee> ls;
  8.             if (hcc["emplist"] == null)
  9.             {
  10.                 ls = dbase.Load<Employee>();
  11.                 hcc.Insert("emplist", ls, new TimeSpan(2000));
  12.             }
  13.             else
  14.                 ls = hcc["emplist"as IList<Employee>;
  15.         }
  16.     }
其实数据库的实体操作可参考前面开源的Galbanum.Orm中的代码,Employee为实体类

由于缓存涉及到多线程并发问题,所以在压力测试方面有经过考验,测试代码为:

  1.   class CacheTest
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             CacheTest c = new CacheTest();
  6.             string a = Console.ReadLine();
  7.             while (a == "y")
  8.             {
  9.                 c = new CacheTest();
  10.                 a = Console.ReadLine();
  11.             }
  12.         }
  13.         internal CacheTest()
  14.         {
  15.             try
  16.             {   
  17.                 ThreadPool.QueueUserWorkItem(new WaitCallback(start0), 0);
  18.                 ThreadPool.QueueUserWorkItem(new WaitCallback(start1), 1);
  19.                 ThreadPool.QueueUserWorkItem(new WaitCallback(start2), 2);
  20.                 ThreadPool.QueueUserWorkItem(new WaitCallback(start3), 3);               
  21.             }
  22.             catch (Exception ex)
  23.             {
  24.                 Console.WriteLine(ex.Message);
  25.             }
  26.         } 
  27.         private void start0(object obj)
  28.         {
  29.             ICache hcc = CacheFactory.GetCache<HashTableCache>();
  30.             for (int i = 0; i < 200000; i++)
  31.             {
  32.                 DateTime dt = DateTime.Now;
  33.                 hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
  34.                 Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
  35.             }
  36.         }
  37.         private void start1(object obj)
  38.         {
  39.             ICache hcc = CacheFactory.GetCache<HashTableCache>();           
  40.             for (int i = 200000; i < 400000; i++)
  41.             {
  42.                 DateTime dt = DateTime.Now;
  43.                 hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
  44.                 Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
  45.             }
  46.         }
  47.         private void start2(object obj)
  48.         {
  49.             ICache hcc = CacheFactory.GetCache<HashTableCache>();           
  50.             for (int i = 400000; i < 600000; i++)
  51.             {
  52.                 DateTime dt = DateTime.Now;
  53.                 hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
  54.                 Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
  55.             }
  56.         }
  57.         private void start3(object obj)
  58.         {
  59.             ICache hcc = CacheFactory.GetCache<HashTableCache>();            
  60.             for (int i = 600000; i < 800000; i++)
  61.             {
  62.                 DateTime dt = DateTime.Now;
  63.                 hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
  64.                 Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
  65.             }
  66.         }
  67.     }

多次执行匀无报错。应该能接受的住考验的。。如有BUG还请回复邮件于我:[email protected]


你可能感兴趣的:(多线程,cache,测试,asp.net,WinForm,Dictionary)