ASP.net缓存 - 正确使用

时间:2010-02-03 09:17:00

标签: c# asp.net performance caching

我正在创建一个Web应用程序,并且我的缓存存在问题。

我的应用程序有大量数据我想尝试,而不是每次需要信息时都不会从sql数据库调用。

我尝试过以下方式使用缓存:

        public static List<DAL.EntityClasses.AccountsEntity> Accounts
    {
        get
        {
            if (HttpContext.Current.Cache["Account"] == null)
            {
                HttpContext.Current.Cache.Insert("Account", LoadAccounts(), null, DateTime.Now.AddHours(4), System.Web.Caching.Cache.NoSlidingExpiration);
            }

            return (List<DAL.EntityClasses.AccountsEntity>)HttpContext.Current.Cache["Account"];
        }
    }

问题在于,当我向缓存中添加项目时,我已经缓存的项目将被删除。

因此大多数调用都在调用DB来获取缓存的数据。

我哪里出错?

由于

2 个答案:

答案 0 :(得分:3)

这对于LRU缓存来说是正常的 - 当缓存填满容量时,最少使用的项目会被推出。

Configure your cache更大量的数据。

答案 1 :(得分:1)

仅供参考: 您的Accounts属性的实现存在问题,这与您的原始问题无关,但可能会在将来出现问题:

可能发生的是这一行之间的

if (HttpContext.Current.Cache["Account"] == null)

和这一行:

 return (List<DAL.EntityClasses.AccountsEntity>)HttpContext.Current.Cache["Account"]; 

您的缓存可以清除/可以从缓存中删除帐户条目。

更好的实施方式是:

public static List<DAL.EntityClasses.AccountsEntity> Accounts             
{             
    get             
    {  
      List<DAL.EntityClasses.AccountsEntity> accounts = 
       HttpContext.Current.Cache["Account"] as List<DAL.EntityClasses.AccountsEntity> 

      if(accounts == null)
      {
        accounts = LoadAccounts();
        HttpContext.Current.Cache.Insert("Account", accounts, null, DateTime.Now.AddHours(4), System.Web.Caching.Cache.NoSlidingExpiration);          
      }  
      return accounts;
   }
}