游客或者会员在点击文章的时候,需要对文章的点击量做一个计数统计。考虑到点击量计数的准确性,有以下几个需求:
- 用户可以不需要登录
- 每当用户点击文章的详情页面,这个文章的点击量+1
- 用户能实时看到文章点击量,也就是用户点击后能及时看到+1
- 点击量最终保存在数据库中,最终一致性
- 作者在后台编辑文章然后保存时,如果这期间有点击量的增加,保存文章时不能覆盖掉这段时间的增量
- 需要对用户去重处理,也就是一个人在一定时间内多次点击只计数一次,防止用户不断刷新或者使用爬虫不断请求某个API
- 要过滤掉百度和谷歌的爬虫请求(根据User-Agent头判断,可以先不做)
一、设计思路
1、因为用户的数量可能很多,所以要求做到高并发,直接在数据库做加1操作不行,考虑利用缓存计数;
2、要求最终数据库数据一致性,考虑利用定时任务从缓存中获取;
3、用户可以匿名,所以缓存的key设计可以用文章标题的hash+用户ip;
4、防止爬虫或者快速刷接口,需要在后端对同一个用户的同一篇文章在缓存中打标;
5、保存文章更新的时候,不能更新点击量,点击量通过定时任务从缓存中获取,防止数据被覆盖;
5、考虑到缓存的使用效率,需要对缓存的key做过期设置,或者主动清除旧的key。
二、设计实现
1、文章详情获取请求路径:Get /article/{title}
在请求详情的时候,同时请求点击量+1的接口 Put /article/{title} , 然后后端同步返回200
2、缓存的key设计,文章点击量key-> article:title:num 缓存的时间可以设置为1周;对用户文章点击量去重,设计key: article:title:ip, 缓存的有效时间1分钟,也就是1分种内同一个ip,同一片文章多次点击只计数一次。
3、数据库表设计
id | title | click_num | create_time | update_time |