web设计思考--缓存(1)--客户端缓存

把数据存放到客户端

1. 适用数据的特点

   海量,反复提取会影响网络带宽
   稳定,很少改动
   数据没有安全敏感性

2. 流程

A. 在页面中根据当前用户标识和最后一次修改的序列号,动态生成资源引用
<script src="/XXX/ClientData.axd?u=useid&n=123&t=pofoliu" type="text/javascript"></script>
其中u是用户ID,n是修改的序列号,t是要获取的数据类别
B. 在web.config中增加相应的URL请求映射
 <httpHandlers>
  <add verb="GET" path="ClientData.axd" type="Sample.ClientData" validate="false"/>
 </httpHandlers>
C.数据库表支持
增加一张额外的表,只有两个字段,用户标识和修改序列号。
由于表数据很小,可以把这张表在系统启动时加载到内存中
用户修改数据库时,必须通知集群server中的所有机器来更新这张表。SQL2005提供了MQ机制,来通知server们,其它场景也应该没啥问题吧。
D.在 ClientData 类中,根据用户标识和类别,获取用户相应的数据

[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public   sealed   class  ClientData : IHttpHandler
{
 
void IHttpHandler.ProcessRequest(HttpContext context)
 
{
        HttpResponse response1 
= context.Response;
        response1.Clear();                
  
//根据QueryString来获取用户标识和数据类别
      string text1 = context.Request.QueryString["u"];
      text1 
= ClientData.DecryptString(text1);//解码
      ..
      
//设置输出缓存的超时时间和内容类别
        HttpCachePolicy policy1 = response1.Cache;
        policy1.SetCacheability(HttpCacheability.Public);
        
        
//设置变化参数。如果不设置的话,每次请求ClientData.axd都会进来一次,缓存将不起作用。
        
//设置后,不同的参数值将取相应的缓存,只有缓存中不存在才会访问服务器
        policy1.VaryByParams["u"= true;
        policy1.VaryByParams[
"n"= true;
        policy1.VaryByParams[
"t"= true;
        
        policy1.SetOmitVaryStar(
true);
        policy1.SetExpires(DateTime.Now.AddDays(
20));
        policy1.SetValidUntilExpires(
true);
        policy1.SetLastModified(DateTime.Now);
        response1.ContentType 
= "application/x-javascript";
        
        
//把数据以压缩的方式输出
        MemoryStream stream2 = null;
        
        stream2 
= new MemoryStream();
        stream1 
= new GZipStream(stream2, 1);

        Stream stream3 
= GetData(userid, type);//获取数据
        byte[] buffer1 = new byte[0x400];
        
int num1 = 1;
        
while (num1 > 0)
        
{
            num1 
= stream3.Read(buffer1, 00x400);
            stream1.Write(buffer1, 
0, num1);
        }
  
 
        
byte[] buffer2 = stream2.ToArray();
        response1.AddHeader(
"Content-encoding""gzip");
        response1.OutputStream.Write(buffer2, 
0, buffer2.Length);
        stream1.Close();
        stream2.Close();


    }

   
private static void Throw404()
   
{
       
throw new HttpException(0x194, AtlasWeb.ScriptResourceHandler_InvalidRequest);
   }


}
 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值