在上一篇文章http://www.cnblogs.com/ryuasuka/p/3483632.html中,为了获取视频播放时的用户行为,并且要异步地将其写入XML文件中,我采用了先写入log,后生成XML文件的方法。这个方法的缺点就在于当大量用户访问的时候生成的log会加重服务器的负担。而今天看到一篇文章讲Cache的用法http://www.cnblogs.com/lin714115/archive/2013/04/07/3003643.html,突然就想试一试如果使用Cache是不是能省去很多代码和文件呢?

  为了便于说明,我写了个Demo。一个aspx页面(事实上html页面也可以),一个ashx一般处理程序。Aspx页面的核心部分如下:

时间:<input id="currentTime" type="text" /><input id="aButton" type="button" value="button" />
<input id="toFile" type="button" value="Get File" />
<script type="text/javascript">
$('#aButton').click(function () {
$('#currentTime').val(Date());
$.post("/MyHandler.ashx", { type:"data",data: $('#currentTime').val() }, function() {});
}); $('#toFile').click(function() {
$.post("/MyHandler.ashx", { type: "submit" }, function() {});
});
</script>

单击button获得当前系统时间并实时地在ashx文件中进行XmlDocument对象的节点写入。单击Get File按钮生成XML文件。

ashx代码如下:

        private XmlDocument doc;
private XmlElement root; public void ProcessRequest(HttpContext context)
{
if (context.Request["type"] == "data") // 写入数据
{
// 从Cache中读入doc对象
doc = context.Cache["file"] as XmlDocument;
if (doc == null) // 若没有就新建一个
{
doc = new XmlDocument();
XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(decl);
context.Cache["file"] = doc; // 初始化完毕之后在Cache中保存doc对象
} // 从Cache中读入root对象
root = context.Cache["root"] as XmlElement;
if (root == null) // 若没有就新建一个
{
root = doc.CreateElement("video");
doc.AppendChild(root);
context.Cache["root"] = root; // 同样保存一下
} // 写入数据
XmlElement time = doc.CreateElement("time");
time.InnerText = context.Request["data"];
root.AppendChild(time);
}
else if (context.Request["type"] == "submit") // 生成XML
{
// 从Cache中读入之前保存的doc对象
doc = context.Cache["file"] as XmlDocument;
if (doc != null)
{
doc.Save(context.Server.MapPath("time.xml"));
}
} }

  代码中,每次发起Http请求都先从Cache中读入先前保存的doc和root(doc是XmlDocument对象,root是XmlElement对象,因为要执行root.AppendChild操作,因此要保存一下root)。如果读入的对象为null,则通过构造方法新建一个对象,完成初始化之后立刻将其保存入cache,这样下一次请求的时候Cache中就有内容了。

  从代码中可以看到,使用Cache避免了文件的大量读写,使得操作都在内存中进行,提高了程序效率。同时,Cache可以存储任何类型的数据(在代码中体现为Object类型),这就为规模较大的数据的传递提供了基础。

  但是这种做法也有一个缺点,那就是当发起请求中包含了”no-cache”,那么Cache就不会起作用了。

视频播放用户行为记录之使用Cache的方法的更多相关文章

  1. MyBatis 用户表记录数查询

    搭建MyBatis开发环境,实现用户表记录数查询 1.在MyEclipse中创建工程,导入MyBatis的jar包

  2. Linux实战案例(4)CentOS清除用户登录记录和命令历史方法

    CentOS清除用户登录记录和命令历史方法 清除登陆系统成功的记录[root@localhost root]# echo > /var/log/wtmp //此文件默认打开时乱码,可查到ip等信 ...

  3. 用asp.net core 把用户访问记录优化到极致

    菜菜呀,前几天做的用户空间,用户反映有时候比较慢呀 CEO,CTO,CFO于一身的CXO 是吗? 菜菜 我把你拉进用户反馈群,你解决一下呀 CEO,CTO,CFO于一身的CXO (完了,以后没清净时候 ...

  4. mysql进阶(十四) 批量更新与批量更新多条记录的不同值实现方法

    mysql 批量更新与批量更新多条记录的不同值实现方法 在mysql中批量更新我们可能使用update,replace into来操作,下面详细介绍mysql批量更新与性能. 批量更新 mysql更新 ...

  5. Windows Server查看和记录远程登录信息的方法

    前两天我的一台Windows Server 2012R2的服务器中了传说中的cryptowall病毒,所有数据文件都被加密,需要我支付1个比特币才能解码.幸好服务器上没什么重要的文件,还好我没钱,我选 ...

  6. 让input表单输入框不记录输入过信息的方法

    有过表单设计经验的朋友肯定知道,当我们在浏览器中输入表单信息的时候,往往input文本输入框会记录下之前提交表单的信息,以后每次只要双击input文本输入框就会出现之前输入的文本,这样有时会觉得比较方 ...

  7. SQL Server中查询用户的对象权限和角色的方法

    --SQL Server中查询用户的对象权限和角色的方法 -- 查询用户的object权限 exec sp_helprotect NULL, 'sa' -- 查询用户拥有的role exec sp_h ...

  8. 关于EasyUI 1.5版Datagrid组件在空数据时无法显示"空记录"提示的BUG解决方法

    问题:jQuery easyUI中Datagrid,在表格数据加载无数据的时候,如何显示"无记录"的提示语? 解决jQuery EasyUI 1.5.1版本的Datagrid,在处 ...

  9. linux 中将用户添加到组的 4 个方法

    Linux 组是用于管理 Linux 中用户帐户的组织单位.对于 Linux 系统中的每一个用户和组,它都有惟一的数字标识号.它被称为 用户 ID(UID)和组 ID(GID).组的主要目的是为组的成 ...

随机推荐

  1. hdu1047 Integer Inquiry

    /* Integer Inquiry Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  2. Visualize real-time data streams with Gnuplot

    源文地址 (September 2008) For the last couple of years, I've been working on European Space Agency (ESA) ...

  3. extern "C" 用法解析

    extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的 ...

  4. python中range函数和xrange函数有什么异同?

    http://ciniao.me/article.php?id=17 简单来说,range生成的是一个列表,而xrange生成的是一个生成器,而生成器在数组很大的时候能够比range更节省空间

  5. JS的构造及其事件注意点总结

    一:js的组成 ECMAscript bom dom 类型包括: number boolean  string undefined  object function 二:基本函数作用 parseInt ...

  6. 第50课 C++对象模型分析(上)

    1. 回归本质 (1)class是一种特殊的结构体 ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的.即每个 ...

  7. sublime修改字体大小

    /Packages/Theme\ -\ Default/Default.sublime-theme { "class": "label_control", , ...

  8. javascript中的数组操作

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  9. 关于第一个Java应用

    一.创建Java源文件 Java应用由一个或多个扩展名为".java"的文件构成,这些文件被称为Java源文件,从编译的角度,则被称为编译单元(Compilation Unit). ...

  10. WindowsPhone8解锁提示IpOverUsbSvc问题

    问题如图: 一般都是系统未启动或者未安装该服务. 1.使用sc命令查询是否存在IpOverUsbSvc服务 Cmd执行Sc query IpOverUsbSvc 结果如下,如果可以找到服务,state ...