redis分布式缓存(六)一一文章的阅读量PV解决方案文

文章的阅读量PV解决方案

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

文章的阅读量场景分析

在掘金里面的文章,每个用户阅读一遍文章,该篇文章的阅读量就会加1。如下图:

image.png

在微信公众号里面的文章,每个用户阅读一遍文章,该篇文章的阅读量就会加一。如下图:

image.png

还要很多这样的例子,这里就不一一举例了。

文章的阅读量实现原理

  1. 对一并发量不大的网站,我们可能把点赞数据持久化到数据库,但是并发量上来了,我们不可能采用数据库来做计数器.
  2. 对于一线互联网公司,如此大的并发量,通常都是用redis中间件实现的。
  3. redis中使用incr命令来实现。
  4. 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);
    }
}
复制代码

思考

  1. 需要频繁的修改redis,耗费CPU,高并发修改redis会导致 redis 的CPU和网络资源耗尽,如何优化
  • 例如一篇文章500阅读量,有1000篇文章,那么需要请求redis服务500*1000=500000次,如果是高并发的商品等页面请求,需要网络连接redis次数会更加多。
  • 采用双缓存模式减少redis请求。
  1. redis数据如何同步到数据库
  • 采用定时任务读取redis数据持久化到数据库

redis分布式缓存系列