在上一篇文章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. NOIP2012普及组 (四年后的)解题报告 -SilverN

    本章施工仍未完成 现在的时间是3.17 0:28,我困得要死 本来今天(昨天?)晚上的计划是把整个四道题的题解写出来,但是到现在还没写完T4的高效算法,简直悲伤. 尝试了用floyd写T4,终于大功告 ...

  2. 怎样快速免费获取Windows版本的ZBrush

    ZBrush是一款专业的3D绘制软件及数字雕刻软件,随着3D技术的不断进步,ZBrush也是越来越受到业内欢迎,在世界拥有了众多的粉丝和爱好者.相信很多用户对软件的体验就是从使用的版本开始的,本文就教 ...

  3. 边工作边刷题:70天一遍leetcode: day 87

    Implement strStr() 要点:rolling hash方法的速度比较慢. 小优化:不用hash%base,而用hash-=base*最高位是一样的. rolling hash错误点: b ...

  4. python-可变迭代对象在for循环中的风险Risk in FOR loop while looping mutable iterable object

    >>> a = [1,2,3,4,5,6] >>> for item in a: ... a.remove(item) ... >>> a [2, ...

  5. HDU 1671 Phone List

    一道字典树的模板题,每次插入前查询是否有该串的某个前缀子串存在,或者该串是否某个串的前缀.具体实现是在插入时串的结尾做一个标记,如果某一个串在查询的时候找到一个标记,说明存在前缀:第二种情况是这个串遍 ...

  6. 三维网格形变算法(Linear rotation-invariant coordinates和As-Rigid-As-Possible)

    在三维网格形变算法中,个人比较喜欢下面两个算法,算法的效果都比较不错, 不同的是文章[Lipman et al. 2005]算法对控制点平移不太敏感.下面分别介绍这两个算法: 文章[Lipman et ...

  7. 《至少有那天》——IU

    //<你的意义>中文版 那天冷的让人好想哭 可是我那一天看到了爱情 湖边的薄冰和老树 就在零下七度那一天 你和我牵手 慢慢聊着以前那些童话 可能它们都有些意义吧 是吗 一个吻 一滴眼泪 一 ...

  8. Linux命令学习-grep

    1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局 ...

  9. 1445 送Q币

    1445 送Q币  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 一次在玩网络游戏的过程中,在 ...

  10. Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...