# 分布式计数服务

### 计数设计

计数是非常普遍的需求，比如交易系统中对交易量做统计、视频站点中对视频的点击数做统计、新闻网站对文章的点击量做统计、博客/微博中的点赞计数等；第一感觉可能是很简单啊，`select count(*) ...` 就搞定了，但是一旦数据量大了之后，并发上来之后，这件事情就没有那么简单了

* 原始阶段的计数

最开始的业务都是基于数据库，这个时候数据量小（核心业务的但表数据量在百万级以下），并发请求获取计数的需求也不大，使用数据库的 `select count` 就能搞定，而且配合分页等，满足业务需求绰绰有余

* 初步上升期

业务做的越来越好，原始的 `select count` 的方式就体现出了不足，查询速度越来越慢，以至于最后无法忍受。这个时期，我们可以考虑借助计数统计表来更新计数和维护计数

![计数表](https://1617012602-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M5PFXCiDtVclypn0iMK%2F-ME31SjfsnWxj8t4FGkn%2F-ME33ifhLKjaNHsMzMHq%2Fimage.png?alt=media\&token=681c6171-9931-4275-bab3-dc35ea815115)

* 高速上升期

这个时候就需要在架构设计层面上做改进和优化了，比如需要引入缓存（如redis），还可能需要引入 MQ 来缓冲高并发的写压力
