看完这篇还不会高并发浏览数设计,我跪搓衣板,99%程序员已收藏

前言

在经历了,缓存、限流、布隆穿透等等一系列加强功能,十万博客基本算是成型,网站上线以后也加入了百度统计来见证十万+ 的整个过程。

但是百度统计并不能对每篇博文进行详细的浏览量统计,如果做一些热点博文排行、48小时排行之类统计,还需要引入浏览量统计功能。

设计

通常情况下,我们只需要每次请求浏览量+1,但是这样真的好吗?或者更直白的讲,真实浏览数准确吗?

UPDATE blog SET views = views+1 WHERE id=?

参考了多个社区博客的设计,因为并不十分清楚其后端实现过程,只能从前端得出以下结论。

  • 慕课网手记:无论是用户登录模式还是用户状态,每次刷新页面浏览数都会 +1。

  • 51CTO博客:无论是用户登录模式还是用户状态,每次刷新页面浏览数都会 +1。

  • 简书:用户登录模式下,无论如何刷新浏览数都不会新增,但是游客状态下每次刷新浏览数都会+1。

  • 博客园:无论是用户登录模式还是用户状态,每次刷新页面浏览数都不变,即使隔天访问,也不变,没细测。

  • 微信公众号:只能是用户登录状态,每次刷新浏览数基本不变,有时候会出现由多变少的情况,不知道大家有没有发现。

  • CSDN博客:无论是用户登录模式还是用户状态,每次刷新页面浏览数都不变,但是隔天访问,浏览数会+1,没细测。

基于以上社区的数据,直接 Pass 掉前两位,总结了以下几种方案,都是基于缓存标识实现。

  • 如果游客或者登录用户访问,按照 IP + 文章 ID 维度增加浏览数,那局域网中怎么算?

  • 如果是游客访问,按照 IP + 浏览器SessionId + 文章 ID 维度增加浏览数,可能解决局域网问题,那么关闭浏览器,重新打开又怎么算?

  • 如果是登录用户,用户ID + 文章 ID 维度增加浏览数,那么游客在登录后算不算一个浏览数,或者是用户换个 IP 登录算不算 ?

所以说,怎么算都不准确,浏览数本身就是一个不需要太精确的功能,不要想太多,直接使用 IP + 文章ID 维度即可。

方案

方案一

得到 GET 请求,在限流之后,缓存之前,判断缓存中是否存在 IP+ 文章ID是否存在 Key。

如果存在,说明之前浏览过,就什么也不做。如果没有,就加上这个 Key,根据业务设置缓存失效时间,然后更新数据库浏览量+1,下面是代码实现:

//获取 Key
String key = IPUtils.getIpAddr()+":blog:"+id;
//判断是否存在
boolean flag =  redisUtil.hasKey(key);
if(!flag){
   
	//设置缓存标识并更新数据库
	redisUtil.set(key,"true",36000);
	String nativeSql = "UPDATE blog SET views = views+1 WHERE id=?";
	dynamicQuery.nativeExecuteUpdate(nativeSql,new 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值