前言 |
公司的项目中有一个模块比较稳定,读取数据比较频繁,更新数据频率低,这就需要用到缓存技术,下面来了解一下.Net中的缓存。
正文 |
为什么出现缓存?
很久很久以前,用户经常去请求一个对象,从数据库中去取,随着时间的推移,对象的数据越来越多,对象也越来越大,用户请求这个对象等待响应的时间越来越长,数据库一直在工作,他也觉得很累,不想干了~~于是缓存就出现了,他可以
- 降低延迟
从客户端的缓存中请求数据比从源服务器请求数据所用时间更少,呈现速度更快,提高了用户体验度。
- 降低网络传输
缓存就相当于一个数据的副本,不用从服务器请求数据会大大降低用户的宽带使用,减低了网络流量的使用。
什么是缓存?
大部分的业务场景下,80%的访问量都集中在20%的热数据上(二八原则),我们把这20%的频繁访问的数据存在一个临时的地方,缓存就是这个地方。每次在获取原始数据代价太大,所以我们需要将临时数据或最终结果保存下来使用。
在离线访问QQ空间动态的时候,我们会看到最近一次更新的数据,这次的保留数据就被放在缓存中,以供用户再次访问时提高访问速度。
缓存分类
WebService的缓存机制
- 输出缓存
使用简单,适用于WebService的参数比较少,结果比较单一、改动较少的情况。 - 数据缓存
功能强大,可以存放任何类型的信息,并且可以在任何时候检索它。
应用举例
数据缓存主要是存储在Context.Cache之中,WebService的缓存使用Cache这个集合。
我在项目中写了一个CacheHelper类对缓存进行操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Caching;
namespace WebApplication6.Comment
{
public class CacheHelper
{
/// <summary>
/// 读取缓存数据
/// </summary>
/// <param name="cacheKey">键</param>
/// <returns></returns>
public static object GetCache(string cacheKey)
{
var objCache = HttpRuntime.Cache.Get(cacheKey);
return objCache;
}
/// <summary>
/// 设置缓存数据
/// </summary>
/// <param name="cacheKey">键</param>
/// <param name="content">值</param>
public static void SetCache(string cacheKey, object content)
{
var objCache = HttpRuntime.Cache;
objCache.Insert(cacheKey, content);
}
/// <summary>
/// 设置缓存数据并且设置默认过期时间
/// </summary>
/// <param name="cacheKey"></param>
/// <param name="content"></param>
/// <param name="timeOut"></param>
public static void SetCache(string cacheKey, object content, int timeOut = 3600)
{
try
{
if (content == null)
{
return;
}
var objCache = HttpRuntime.Cache;
//设置绝对过期时间
//绝对时间过期。DateTime.Now.AddSeconds(10)表示缓存在3600秒后过期,TimeSpan.Zero表示不使用平滑过期策略。
objCache.Insert(cacheKey, content, null, DateTime.Now.AddSeconds(timeOut), TimeSpan.Zero, CacheItemPriority.High, null);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 移除指定缓存
/// </summary>
/// <param name="cacheKey">键</param>
public static void RemoveAllCache(string cacheKey)
{
var objCache = HttpRuntime.Cache;
objCache.Remove(cacheKey);
}
/// <summary>
/// 删除全部缓存
/// </summary>
public static void RemoveAllCache()
{
var objCache = HttpRuntime.Cache;
var cacheEnum = objCache.GetEnumerator();
while (cacheEnum.MoveNext())
{
objCache.Remove(cacheEnum.Key.ToString());
}
}
}
}
参数说明
objCache.Insert()方法中有7个参数,下面是对参数的一些描述。
1. 参数“key”代表缓存数据项的键值,必须是唯一的。
2. 参数“value”代表缓存数据的内容,可以是任意类型。
3. 参数“dependencies”表示缓存的依赖项,也就是此项的更改意味着缓存内容已经过期。如果没有依赖项,可将此值设置为NULL。
4. 参数“absoluteExpiration”是日期型数据,表示缓存过期的时间,.NET 2.0提供的缓存在过期后是可以使用的,能使用多长时间,就看这个参数的设置。
5. 参数“slidingExpiration”的类型表示一段时间间隔,表示缓存参数将在多长时间以后被删除,此参数与absoluteExpiration参数相关联。
6. 参数“priority”表示撤销缓存的优先值,此参数的值取自枚举变量“CacheItemPriority”,优先级低的数据项将先被删除。此参数主要用在缓存退出对象时。
7. 参数“onRemoveCallback”表示缓存删除数据对象时调用的事件,一般用做通知程序。
总结 |
缓存的知识先了解到这里,咱们下回接着聊,看我在项目中用到的一级缓存和二级缓存。