文档章节

浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?

FansUnion
 FansUnion
发布于 2015/05/03 01:29
字数 800
阅读 4
收藏 0

最近,个人官网实现了PDF下载功能,出于统计的考虑,增加了“下载次数”download_count这个字段。

     但是,我今天突然发现,每次下载download_count都直接+2了。如果服务器发生这种事,还有一定的可能,本地就我一个人下载,怎么可能下载2次。于是,打开了log4j的debug模式,果然执行了2次更新请求。

    

@RequestMapping(value = "/download/pdf")

public void downloadPdf(@RequestParam Integer id, HttpServletRequest req,

HttpServletResponse res) {

Map<String, Object> article = articleService.get(id);

PdfDownload.doDownloadPdfPostWithShuiyin(req, res, article);
                articleService.plusDownloadCount(id);  
    }



  于是,想通过ThreadLocal<Integer> local;这种方式去记录,如果local中有值,表明当前线程已经下载过了,不需要再次更新下载次数。

   但事实证明,上述做法不正确,实际现象是次数增加不够“稳定”,有时+1,有时+2。

后来,我又把local中的值,存放ip,判断是否为null,或者2次请求ip是否相同,结果仍然不够“稳定”。
--------------------------------------------------------
在实践过程中,我的一些“误解”
1.下载文件,浏览器只会发送1次请求。实际是2次,毫无疑问。
2.发送2次请求,是同一个线程响应。我想当然的认为这2次请求,都是服务于“同一次下载”。
  事实证明,我太天真。
3.由于觉得这2次请求,我认为使用ThreadLocal存放个值,表明当前线程已经下载过了。
  事实证明,这不科学。2次请求,2个不同的线程响应。
4.“2次请求,2个不同的线程响应。”理论上是这样。
   但我们Team在做公司项目的时候,遇到了类似的问题。Boss后来想起来,Tomcat的线程是用“线程池” 实现的。
   多次请求可能是同一个线程处理,也可能是多个。 
  这一点,和实际发生的“更新次数不稳定” 非常吻合。
5.下载文章A,次数更新。下载文章B、C、D,次数都不再更新。
  这个不符合我的设想,原因是:下载没有比较文章的ID,不同文章的下载次数应该是相互独立的。 

--------------------------------------------------------
现在有2个问题:
1.我就想实现自己最初的想法。
   浏览器发送2次请求,下载次数更新了2次。能不能只让它更新一次了,从而准确地体现下载次数!!!
  这个我目前还没有想到好的方法。

2. 改变需求,一个用户在一定时期内,下载一篇文章,无论多少次,都只算一次。
  下载不同的文章,次数应该且只应该增加1次。

  我的想法:
  建立一个存放已经下载的队列,用户的ip和文章的id共同作为key。
  用户下载一次,就把用户IP和文章ID 共同组成的key,存放到队列里。
  当来了新的下载请求时,从队列中查找,是否已经存在key,如果不存在,才+1.否则,不更新次数。


原文首发:http://fansunion.cn/article/detail/141.html

© 著作权归作者所有

FansUnion
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问

暂无文章

为构建社交关系链手淘都做了啥?

作者|王卫(泓冰) 出品|阿里巴巴新零售淘系技术部 01、淘宝社交关系推荐的背景 1、互联网下半场到来:互联网的下半场,人口红利消失,各大平台需要对用户做精细化运营,用户的增长和留存是每一...

阿里云官方博客
18分钟前
3
0
Iaas/Paas/Saas有何区别,一个故事告诉你

云计算有三种服务模式,IaaS,PaaS和SaaS。单从英文全称去理解,他们分别是“基础设施即服务”“平台即服务”和“软件即服务”。 这样翻译过来可不好理解,但是我们可以举个例子。现在我们就以...

JEPaaS云平台
25分钟前
4
0
温度传感器怎么测好坏

  温度传感器也就是负温度系数热敏电阻,温度越高,电阻越小,测量时先看其阻值能不能根据温度的变化而变,再看其变化的阻值是不是在标定的范围之内。   有以下四种方法;   1、若是有...

仙溪
26分钟前
3
0
zk中ZooKeeperServer解析

内部类 ChangeRecord 处理PrepRP和FinalRP之间的信息 static class ChangeRecord { ChangeRecord(long zxid, String path, StatPersisted stat, int childCount, List<ACL> acl) {......

writeademo
36分钟前
3
0
LNMP---安装worrdpress、discuz,域名重定向,用户认证,nginx访问日志

4.34 安装wordpress 4.35 安装discuz 4.36 域名重定向 4.37 用户认证 4.38 nginx访问日志 一、安装wordpress 创建博客: 添加一个博客的虚拟主机 blog.tobe.com.conf 做如下更改 安装博客wor...

tobej
38分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部