ASP.NET 缓存的使用

来源:互联网 发布:老虎淘宝客 编辑:程序博客网 时间:2024/05/16 05:16

应公司项目实际运营的情况来看,有些数据是经常访问的而且是不经常的改变的数据。

根据这种特性,需要加入缓存来减少对数据库的访问次数和提升网站的响应速度。

1、通过分析,发现对于同一个请求,请求会员的基本信息比较频繁,如 账户类型、积分、余额等。

但是这些信息并不能使用缓存。所以最优的做法就是使用HttpContext.Current 对象来暂存会员信息。

HttpContext.Items属性中可以存放任何类型数据,无论这个属性中存放什么数据,都会在请求处理结束后自动清除,这就是暂存状态,数据的存放时间非常短。基于这种特性,非常适合在会员信息的缓存。

 var httpContext = HttpContext.Current;            if (httpContext == null)            {                return //这里是从数据库获取信息;            }            var cachedValue = httpContext.Items["__PerRequestMemberSessionCache"] as GetCurrentMemberInformationsOutput;//从items中获取缓存对象            if (cachedValue == null)            {                cachedValue = //这里是从数据库获取信息;                httpContext.Items["__PerRequestMemberSessionCache"] = cachedValue;//放入httpcontext 的items中            }            return cachedValue;

2、还有另外一类数据,此类数据经常访问,但不经常变化的,可以使用HttpRuntime.Cache,我使用的是目前net中比较流行的abp框架,他对HttpRuntime.Cache做了进一步的封装。有兴趣的同学可以了解一下abp框架。代码如下:

     public async Task<List<LineSettingDto>> XXX()        {           GetCurrentMemberInformationsOutput temp = await GetCurrentMemberInformationsAsync();           var lineSetting= _cacheManager.GetCache<string, List<LineSettingDto>>(EurCacheNames.GetTenantLineSettingCache).GetOrDefault(temp.Tenant.TenancyName);            if (lineSetting == null)            {                var setting=  //此处为从数据库读取配置信息;                if (setting != null)                {                    lineSetting = setting;                    _cacheManager.GetCache<string, List<LineSettingDto>>(EurCacheNames.GetTenantLineSettingCache).Set(temp.Tenant.TenancyName, setting);  //将从数据库获取的数据放入缓存中                }         }            return lineSetting;        }


其优点是:

1、将数据缓存,不用每次访问都查询数据库。

2、降低延迟,使响应速度加快。

3、既然使用缓存,那肯定也要设置缓存失效的时间,cache默认的缓存失效时间为60min,

WebModule中的PreInitialize方法中配置如下时间,就可以灵活的设置缓存的时间了。

   Configuration.Caching.ConfigureAll(cache => { cache.DefaultAbsoluteExpireTime = TimeSpan.FromHours(8); });   Configuration.Caching.Configure(EurCacheNames.GetActiveFreightPlan, cache => { cache.DefaultAbsoluteExpireTime = TimeSpan.FromHours(2); });

总结:
缓存要慎用,对于单表查询且数据大不大的没有必要使用缓存,因为从数据库中读取和从缓存中读取,速度上并不会差别很大。
本人是一个新鸟,如有不对之处,还望指正。