上周博客大赛有个需求:关于每个ip每天访问只统一一次。
由于担心博客大赛的访问量较高,所以每次去数据库查询有没有当天记录,没有就插入,有就不插入的想法被毙掉
方法二:程序实现一个计数器,计算器放入memcached,对每次的有效访问进行累计,到一定程度批量入库。
方法二的优点:首页对于访问量的查询灰常快,不通过数据库,页面的访问量显示是实时的。
方法二的缺点:当memcached down掉时,在上次入库时间点到down机时间点这段时间数据没有了
对于博客大赛这种涉及物质奖励的活动,我觉得这个做法还是欠妥,毕竟涉及到利益(
当然使用缓存就要接受他的不好的一些方面,比如稳定性,如果方方面面都完美的话,那数据库还混什么
)
所以这个想法最后也没有被采纳。
方法三:每次插入访问量,先查看缓存服务器上有没有今天的访问量记录,有的话,进一步检查访问记录是不是今天的(因为缓存的有效时间和
上一次访问时间相加可能到第二天),是今天的话,不插入数据库,如果缓存没有或者是昨天的缓存,那么插入数据库,然后更新缓存。
在页面显示统计量的时候,会使用缓存
方法三的优点:统计量是比较准确的
方法三的缺点: 统计量显示是延时的,这样的性能也是个未知数
采用方法三可以在客户端利用cookie再次优化,利用cookie保存该客户端对某个博客的访问,
如果有这个cookie直接就返回,不做后续的操作了。
存储cookie也很有意思,第一次本人想法是 存储访问者的ip,访问者的访问的blogId,访问的时间(到day就可以了)为cookie name的cookie,
但是出现有意思现象,cookie name中出现两个ip(可能是ip跳转的缘故),出现两个ip没有问题,可恶的是中间的分隔符“,”,可能这个原因,cookie
保存不成功,后来经过讨论cookie的存放改成name为访问的blogId,value为ip+访问的时间,再进行判断,一切安详,没有异常