Skip to content

在微信公众号里面的文章,每个用户阅读一遍文章,该篇文章的阅读量就会加一,对于微信这种一线互联网公司,如此大的并发量,一般不可能采用数据库来做计数器,通常都是用redis的incr命令来实现。

TIP

Redis小知识:INCR命令,它的全称是increment,用途就是计数器。每执行一次INCR命令,都将key的value自动加1。如果key不存在,那么key的值初始化为0,然后再执行INCR操作。

例如:微信文章id=100,做阅读计算如:

shell
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"

DANGER

技术方案的缺陷:需要频繁的修改redis,耗费CPU,高并发修改redis会导致 redisCPU 100%

案例实战:编码实现微信文章的阅读量

java
@RestController
@Slf4j
public class ViewController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping(value = "/view")
    public void view(Integer id) {
        //redis key
        String key="article:"+id;
        //调用redis的increment计数器命令
        long n = this.stringRedisTemplate.opsForValue().increment(key);
        log.info("key={},阅读量为{}",key, n);
    }
}

TIP

思考:本篇文章主要讲述的就是INCR命令,文章阅读量都是在redis内存操作的,那如何同步到数据库呢?如果不同步到数据库,就会出现数据丢失,请思考:如何把阅读量PV同步到mydql数据库?