PV、UV 统计
PV(Page Views)
页面浏览量,指的是网站或应用程序的页面被访问的总次数。每次页面加载或刷新都会增加PV计数。PV反映了网站或应用程序的流量和页面受到的浏览量。
使用 Redis 进行 PV 统计时,使用 sorted set 数据类型,因为它的元素不重复,且每个元素都有一个对应的 double 类型 score;应用到 pv 统计再适合不过了,元素就是我们需要统计的资源,score 就是资源的 pv 值。
# 商品的 pv 统计
zadd goods_pv_key 1 good_primary_id
# good_primary_id 分数+1
zincryby goods_pv_key 1 good_primary_id
# 迭代(从 0 开始,获取 100 个元素)
zscan goods_pv_key 0 100
通常我们直接使用 zincryby
命令,不会使用 zadd
,因为使用 zadd
时,如果元素已经存在,则直接用传入的 score 更新;而 zincryby
命令在元素不存在时等同于 zadd
。
sorted set 数据类型提供了多种遍历和读取元素的方式,按照需要选择合适方式去读取已记录的元素的 score。
UV(Unique Visitors)
独立访客数,指的是访问网站或应用程序的唯一用户数量。UV统计根据用户的唯一标识(如IP地址、Cookie等)来计算,以区分不同的用户。无论用户访问了多少个页面,只要其标识是唯一的,UV计数就会增加。
UV 统计的实现也需要使用到 sorted set 数据类型,操作和 PV 统计一致。只不过这里还要考虑一个问题,用户唯一标识的识别和过滤,即用户无论访问多少次都只记录一次;解决这个问题也许多方式,这里推荐使用 HyperLogLog 数据类型,原因是它在做技术统计时,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
提示
其实可以直接使用 HyperLogLog 来计算 uv,但是这样有一个问题需要取舍,那就是每一个资源都是一个独立 HyperLogLog 类型的 key; 在最终将统计数据持久化到数据库时,只能通过模糊匹配先获取目标 key 再拿着 key 到 redis 中读取值,在理想情况下 Redis 中的 key 的命令都非常规范,那么直接使用 HyperLogLog 就已经足够了;如果 key 的命令不规范,迭代时可能会获取到其它类型的 key,这就会导致读取时程序出现异常。
# 添加成功时返回 1,如果已存在则返回 0
pfadd goods_uv_filter_key user_id
HyperLogLog 添加元素时,如果元素不存在返回 1,已存在返回 0。