介绍
计数器大量应用于互联网上大大小小的项目,你可以在很多场景都能找到计数器的应用范畴,单纯以技术派项目为例,也有相当多的地方会有计数相关的诉求,比如
文章带赞数
收藏数
评论数
用户粉丝数
......
技术派中有两种查询计数相关的方案,一个是基于db中的操作记录进行实施,一种是基于redis的incr特性来实现计数器
下面来看一下,redis的计数器是怎样用于技术派的技术场景的
计数的业务场景
首先我们看一下技术派中使用到的计数器的场景,主要有两大类(业务计数+pv/uv),三个细分领域(用户、文章、站点)
用户的相关统计信息
文章数,文章总阅读数,粉丝数,关注作者数,文章被收藏数、被点赞数量
站点的pv/uv等统计信息
网站的总pv/uv,某一天的pv/uv
某个uri的pv/uv
注意上面的几个场景,这里主要介绍redis计数器的使用
那用户与文章的相关统计将是我们的重点,因为这两个的业务属性很相似,因此我们选择一个重点,以用户统计来实现。
redis计数器
redis计数器,主要是借助原生的incr指令来实现原子的+1-1操作,更棒的是不仅redis的string数据结构支持incr,hash、zset数据结构同样也是支持incr的
1.incr指令
Redis incr命令将key中存储的数字值增值一。
如果key不存在,那么key的值会先被初始化为0,然后在执行INCR操作。
如果值包含错误类型,或者字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在64位有符号数字表示之内。
接下来看项目封装实现
/**
* 自增
*
* @param key
* @param filed
* @param cnt
* @return
*/
public static Long hIncr(String key, String filed, Integer cnt) {
return template.execute((RedisCallback<Long>) con -> con.hIncrBy(keyBytes(key), valBytes(filed), cnt));
}
2.用户计数统计
我们将用户的相关计数,每个用户对应一个hash数据结构
key: user_statistic_${userId}
filed:
follCount: 关注数
fansCount: 粉丝数
articleCount: 已发布文章数
praiseCoun