asp.net提供缓存机制,但是很多的winForm和类库中也同样希望能使用上缓存,GalBanum.Cache正是提供这样的功能,
其实数据库的实体操作可参考前面开源的Galbanum.Orm中的代码,Employee为实体类
主要有ICache接口,HashTableCache类继承ICache接口,CacheFactory工厂生产ICache,CacheEntity保存缓存的value和key
,整体是通过静态Dictionary来保CacheEntity,然后再起子线程定时循环临控缓存是否过期,过期则删除,由于Dictionary不能在迭代的时候发生操作,所以用了一个静态的List<object> keys来同步保存key值。
Galbanum.Cache源代码下载地址:
http://download.csdn.net/source/859676
缓存使用方法代码如下:
首先得using Cache;
- protected void UseCache()
- {
- ICache hcc = CacheFactory.GetCache<HashTableCache>();
- using (IDataBase dbase = DataBaseFactory.GetDataBase("conn1"))
- {
- dbase.Open();
- IList<Employee> ls;
- if (hcc["emplist"] == null)
- {
- ls = dbase.Load<Employee>();
- hcc.Insert("emplist", ls, new TimeSpan(2000));
- }
- else
- ls = hcc["emplist"] as IList<Employee>;
- }
- }
由于缓存涉及到多线程并发问题,所以在压力测试方面有经过考验,测试代码为:
- class CacheTest
- {
- static void Main(string[] args)
- {
- CacheTest c = new CacheTest();
- string a = Console.ReadLine();
- while (a == "y")
- {
- c = new CacheTest();
- a = Console.ReadLine();
- }
- }
- internal CacheTest()
- {
- try
- {
- ThreadPool.QueueUserWorkItem(new WaitCallback(start0), 0);
- ThreadPool.QueueUserWorkItem(new WaitCallback(start1), 1);
- ThreadPool.QueueUserWorkItem(new WaitCallback(start2), 2);
- ThreadPool.QueueUserWorkItem(new WaitCallback(start3), 3);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- private void start0(object obj)
- {
- ICache hcc = CacheFactory.GetCache<HashTableCache>();
- for (int i = 0; i < 200000; i++)
- {
- DateTime dt = DateTime.Now;
- hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
- Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
- }
- }
- private void start1(object obj)
- {
- ICache hcc = CacheFactory.GetCache<HashTableCache>();
- for (int i = 200000; i < 400000; i++)
- {
- DateTime dt = DateTime.Now;
- hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
- Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
- }
- }
- private void start2(object obj)
- {
- ICache hcc = CacheFactory.GetCache<HashTableCache>();
- for (int i = 400000; i < 600000; i++)
- {
- DateTime dt = DateTime.Now;
- hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
- Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
- }
- }
- private void start3(object obj)
- {
- ICache hcc = CacheFactory.GetCache<HashTableCache>();
- for (int i = 600000; i < 800000; i++)
- {
- DateTime dt = DateTime.Now;
- hcc.Insert(dt.AddMinutes(i), dt.Ticks, new TimeSpan(0, 3, 20));
- Console.WriteLine("添加缓存成功,Key为:" + i + " 值为:" + i);
- }
- }
- }
多次执行匀无报错。应该能接受的住考验的。。如有BUG还请回复邮件于我:ojek@163.com