电影url点击次数统计功能设计

THEEYE 2012-08-15

简介

电影的点击次数代表着电影受欢迎的程度,系统中需要统计每一部电影的历史总点击次数和某一段时间内的点击次数,依据这些数据可以给用户推荐当前最热的电影,吸引用户下单。

现在实现

目前线上系统具有记录每部电影总点击次数的功能,其实现是:电影表中设计一个记录点击次数的字段,当用户请求电影详情时实时修改该字段为当前值+1

缺点mysql数据写性能不强,并发性能差,当有大量用户访问时会造成数据库假死,正常的页面访问不响应只能记录总的点击次数,不能记录近期的点击次数,推荐不准确

优点

点击次数统计准确,实时性好

流行实现分析

现在很多成熟的网站都提供类似的功能,其实现方法也有所不同,分为实时统计和异步统计两种实现,总结有如下方式:

nosql实时统计

使用诸如memcached的nosql实现,memcached提供incr指令,它可以原子性的对指定key的值+1,而且性能极高,他的缺点是不能持久化,当数据库崩溃时数据会全部丢失,所以需要在有数据高安全性要求的情况,使用memcacheddb 或者开启持久化的redis代替memcached,他们都支持memcached协议,所以原有的代码不需要做任何修改,但性能会损失一点,这种损失对日均pv500万以下的网站应该不会有影响。

记录访问信息、异步统计

上面讲述的是一种实时解决方案,能解决大部分的情况,但对应性能要求高的网站,解决这个问题的杀手锏还是异步。当用户访问网页时直接记录这次访问的信息,但不马上进行统计,由一个后台服务程序动态统计这些数据,并把统计结果存储到数据库中,网站只需要访问统计好的结果即可,统计频率可以设置为几分钟、几小时或者几天,这要看网站对数据延迟的容忍度了/

mysql 存储

mysql update操作会锁记录,使用锁会影响性能,但insert操作会快很多,特别是myisam存储引擎可以允许不设置主键,插入性能很高。

nosql存储

使用nosql存储每次的日志,mysql insert的性能虽然不错,但在高并发情况下还是会出现问题,因此可以使用写性能更好的nosql,比如mongodb,tokyo tyrant等

文件存储

不引入其他的存储信息,直接使用文件存储日志,每天一个文件,在linux下能够达到很不错的性能,而且架构十分简单,java log4j也能达到不错的性能。

专业日志存储系统

使用专门的日志系统,比如scribe,具备处理海量并发,海量数据的能力,但运维成本高

抉择

方案选择指标尽可能的高性能开发简单,最好不用开发代码支持近期点击次数统计数据延时不长,数据不需要实时,延迟几个小时甚至1天都可以接受

结论
  1. 使用文件系统存储、异步统计,统计结果存储数据库
  2. 不开发代码,直接使用啊怕车系统系统记录日志
    1. 在影片详情加入一个图片,src="click.ichaoying.com/movie/dot.jpg?id=xxx&ts=xxx",id 表示电影id,ts表示时间戳,保证本地没有缓存
    2. 构建click域名,并配置其日志记录
  3. 开发shell脚本,异步统计日志信息,并存储
  4. 使用crontab定时执行,可以设置为每天夜里2点执行统计

相关推荐