文章的阅读量PV解决方案
「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
文章的阅读量场景分析
在掘金里面的文章,每个用户阅读一遍文章,该篇文章的阅读量就会加1。如下图:
在微信公众号里面的文章,每个用户阅读一遍文章,该篇文章的阅读量就会加一。如下图:
还要很多这样的例子,这里就不一一举例了。
文章的阅读量实现原理
- 对一并发量不大的网站,我们可能把点赞数据持久化到数据库,但是并发量上来了,我们不可能采用数据库来做计数器.
- 对于一线互联网公司,如此大的并发量,通常都是用redis中间件实现的。
- redis中使用
incr命令来实现。 - incr命令,它的全称是increment,用途就是计数器。每执行一次incr命令,都将key的value自动加1。如果key不存在,那么key的值初始化为0,然后再执行INCR操作。
例如:微信文章id=100,做阅读计算如:
127.0.0.1:6379> incr article:100
(integer) 1
127.0.0.1:6379> incr article:100
(integer) 2
127.0.0.1:6379> incr article:100
(integer) 3
127.0.0.1:6379> incr article:100
(integer) 4
127.0.0.1:6379> get article:100
"4"
复制代码
编码实现文章的阅读量
@RestController
@Slf4j
public class ViewController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping(value = "/isView")
public void isView(Integer id) {
//redis key
String key="article:"+id;
//调用redis的increment计数器命令
long n=this.stringRedisTemplate.opsForValue().increment(key);
log.info("key={},阅读量为{}",key, n);
}
}
复制代码
思考
- 需要
频繁的修改redis,耗费CPU,高并发修改redis会导致 redis 的CPU和网络资源耗尽,如何优化
- 例如一篇文章500阅读量,有1000篇文章,那么需要请求redis服务500*1000=500000次,如果是高并发的商品等页面请求,需要网络连接redis次数会更加多。
- 采用
双缓存模式减少redis请求。
- redis数据如何同步到数据库
- 采用
定时任务读取redis数据持久化到数据库




近期评论