CacheHelper对缓存的控制

通常我们针对页面以及相关数据进行相应的缓存(分为客户端和服务端的缓存),以下代码为对一般操作进行相应的缓存(服务端),用以减少对数据库的访问次数,减少服务器的压力。

 

(一)CacheHelper类

CacheHelper类主要是依赖于系统的System.Web.Caching.HostingEnvironment.Cache,具体代码如下:

     public   static   class  CacheHelper
    {
        
private   static  Cache _cache;

        
public   static   double  SaveTime 
        { 
            
get
            
set ;
        }

        
static  CacheHelper()
        {
            _cache 
=  HostingEnvironment.Cache;
            SaveTime 
=   15.0 ;
        }

        
public   static   object  Get( string  key)
        {
            
if  ( string .IsNullOrEmpty(key))
            {
                
return   null ;
            }

            
return  _cache.Get(key);
        }

        
public   static  T Get < T > ( string  key)
        {
            
object  obj  =  Get(key);
            
return  obj == null ? default (T):(T)obj;
        }

        
public   static   void  Insert( string  key,  object  value, CacheDependency dependency, CacheItemPriority priority, CacheItemRemovedCallback callback)
        {
            _cache.Insert(key, value, dependency, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(SaveTime), priority, callback);
        }

        
public   static   void  Insert( string  key,  object  value, CacheDependency dependency, CacheItemRemovedCallback callback)
        {
            Insert(key, value, dependency, CacheItemPriority.Default, callback);
        }

        
public   static   void  Insert( string  key,  object  value, CacheDependency dependency)
        {
            Insert(key, value, dependency, CacheItemPriority.Default, 
null );
        }

        
public   static   void  Insert( string  key,  object  value)
        {
            Insert(key, value, 
null , CacheItemPriority.Default,  null );
        }

        
public   static   void  Remove( string  key)
        {
            
if  ( string .IsNullOrEmpty(key))
            {
                
return ;
            }

            _cache.Remove(key);
        }

      
   public   static  IList < string >  GetKeys()
        {
            List < string >  keys  =   new  List < string > ();
            IDictionaryEnumerator enumerator  =  _cache.GetEnumerator();
            
while  (enumerator.MoveNext())
            {
                keys.Add(enumerator.Key.ToString());
            }

            
return  keys.AsReadOnly();
        }

        
public   static   void  RemoveAll()
        {
            IList < string >  keys  =  GetKeys();
            
foreach  ( string  key  in  keys)
            {
                _cache.Remove(key);
            }
        }
    }
}

 

 

在原有基础上增加了如下3个方法:

(1)public static T Get<T>(string key)

(2)public static IList<string> GetKeys()

(3)public static void RemoveAll()

这样我们能够方便的以静态方法来对Cache进行相应的操作。

 

(二)Cache类

Cache类位于System.Web.Caching命名空间下,实现了IEnumerable接口,主要方法如下:

     public   sealed   class  Cache : IEnumerable
    {
         
public   object  Get( string  key);
         
public  IDictionaryEnumerator GetEnumerator();
         
public   void  Insert( string  key,  object  value);
         
public   void  Insert( string  key,  object  value, CacheDependency dependencies);
         
public   void  Insert( string  key,  object  value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration);
         
public   void  Insert( string  key,  object  value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemUpdateCallback onUpdateCallback);
         
public   void  Insert( string  key,  object  value, CacheDependency dependencies, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onRemoveCallback);
        
         
public   object  Remove( string  key);
    }

 

 

在底层,应该是以一个字典来对相关的键值对来进行数据保存。

 

(三)CacheHelper相关的单元测试

    [TestClass()]
    
public   class  CacheHelperTest
    {
        
///   <summary>
        
/// Get 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  GetTest()
        {
            
string  key  =   " key "
            
object  actual  =  CacheHelper.Get(key);
            Assert.IsNull(actual);

            Cache cache 
=  HostingEnvironment.Cache;
            
string  value = " value " ;
            cache.Insert(key,value);
            actual 
=  CacheHelper.Get(key);

            Assert.IsNotNull(actual);
            Assert.IsTrue(actual.ToString()
== value);
        }

        
///   <summary>
        
/// Get 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  GetWithAbnormalParameterTest() 
        {
            
object  actual  =  CacheHelper.Get( string .Empty);
            Assert.IsNull(actual);

            actual 
=  CacheHelper.Get( null );
            Assert.IsNull(actual);
        } 

        
///   <summary>
        
/// GetKeys 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  GetKeysTest()
        {
            
int  count  =  ( new  Random()).Next( 10 );
            IList
< string >  keys  =  CreateAllKeys(count);
            InsertAllKeys(keys);
            IList
< string >  results  =  CacheHelper.GetKeys();
            Assert.IsTrue(results.Count 
==  count);

            
for  ( int  index  =   0 ; index  <  count; index ++ )
            { 
               Assert.IsTrue(results.Contains(keys[index]));
            }

            
for  ( int  index  =   0 ; index  <  count; index ++ )
            {
                Assert.IsTrue(keys.Contains(results[index]));
            }
        }

        
private   void  InsertAllKeys(IList < string >  keys)
        {
            Cache cache 
=  HostingEnvironment.Cache;
            
foreach  ( string  key  in  keys)
            {
                cache.Insert(key,key);
            }
        }

        
private  IList < string >  CreateAllKeys( int  count)
        {
            IList
< string >  keys  =   new  List < string > ();
            
for  ( int  index  =   0 ; index  <  count; index ++ )
            {
                keys.Add(
" KEY " + index.ToString());
            }

            
return  keys;
        }

        
///   <summary>
        
/// Remove 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  RemoveTest()
        {
            
int  count  =   1 ;
            IList
< string >  keys  =  CreateAllKeys(count);
            InsertAllKeys(keys);
            
string  key  =  keys[ 0 ];

            IList
< string >  results  =  CacheHelper.GetKeys();
            Assert.IsTrue(results.Contains(key));

            CacheHelper.Remove(key);

            results 
=  CacheHelper.GetKeys();
            Assert.IsFalse(results.Contains(key));
        }

        
///   <summary>
        
/// RemoveAll 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  RemoveAllTest()
        {
            
int  count  =  ( new  Random()).Next( 20 );
            IList
< string >  keys  =  CreateAllKeys(count);
            InsertAllKeys(keys);
           
            IList
< string >  results  =  CacheHelper.GetKeys();
            
foreach  ( string  key  in  keys)
            {
                Assert.IsTrue(results.Contains(key));
            }
    
            CacheHelper.RemoveAll();

            results 
=  CacheHelper.GetKeys();
            Assert.IsTrue(results.Count
== 0 );
        }

        
///   <summary>
        
/// SaveTime 的测试
        
/// </summary>
        [TestMethod()]
        
public   void  SaveTimeTest()
        {
            
double  expected  =  ( new  Random()).Next( 10000 );
            
double  actual;
            CacheHelper.SaveTime 
=  expected;
            actual 
=  CacheHelper.SaveTime;
            Assert.IsTrue(expected
== actual);
        }
    }

 

 

这个上面的仅仅是对一些基本的方法进行了单元测试,基本验证了方法的逻辑,当然不包括那些重载方法的验证。至于为什么写这样相关的类,主要是能够以静态的方法来对Cache进行统一的操作,仅仅是为了方便与统一。

 

源代码下载:缓存类与单元测试源代码下载

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值