如何用 Redis 统计独立用户访问量?

目录

方法一:使用 Hash

具体做法:

eg:

方法二:使用Bitset

具体做法:

eg:

方法三:使用概率算法

具体做法:

eg:

总结:


方法一:使用 Hash

具体做法:

当一个用户访问时,若用户登录过,则使用用户id来标识该用户。若用户没有登陆过,则(前端页面)随机生成一个key来标识用户。我们可以使用 HSET 命令,key 可以选择 URI 与对应的日期进行拼凑, field 可以使用用户的 id 或随机标识, value 可简单设置为 1 。当需要统计某网页用户访问量时,直接使用 HLEN 得到最终结果。

eg:

方法二:使用Bitset

具体做法:

对于一个 32 的int,如果只是用来记录 id ,那么只能记录一个用户。如果换成二进制,每个二进制位表示一个用户,那可以表示32个用户,极大节省空间。对于没有登陆的用户,我们可以使用 哈希算法,把对应的用户标识哈希成一个数字id。

bitset 非常节省内存,假设有 1 亿个用户,也只需要 100 000 000 / 8 / 1024 / 1024 差不多 12 M 内存。而 Redis 已经为我们提供了 SETBIT 的方法。比如统计 item 页面的访问量,我们可以使用 SETBIT 命令, 设置用户已经访问了该页面,也可以使用 GETBIT 的方法查询某个用户是否访问。最后通过 BITCOUNT 可以统计 item 页面的访问量。

eg:

方法三:使用概率算法

具体做法:

由于页面可能会有非常大的访问量,加入所需访问量的统计不那么准确,可以使用概率算法。而实际上,对一个网站的 UV 统计,1 亿跟 1 亿 零 30 万其实差不多。 而 Redis 中,封装好了 HyperLogLog 算法,这是一种基数评估算法。这种算法的特征,一般都是数据不存具体的值,而是存用来计算概率的一些相关数据。

当用户访问时,使用 PFADD 命令,设置对应的命令,最后只要通过 PFCOUNT 就能顺利计算出最终的结果。因为这是一个概率算法,所以可能存在 0.81% 的误差。

eg:

总结:

方法 Hash 法 Bitset 概率算法
优点 简单,容易实现,查询方便,数据准确性高 占用内存小,查询方便,可指定查询某个用户。 占用内存极小,对于一个key,只需要12kb,适合用户访问量非常庞大的网站。
缺点 占用内存过大,随着key的增加,性能会下降。适合小网站 数据可能略有瑕疵,对于非登陆的用户,可能不同的key映射到同一个id,否则需要维护一个非登陆用户的映射,有额外开销。如果用户非常稀疏,那么占用的内存可能比Hash法更大。 查询指定用户的时候,可能会出错,毕竟存储的不是具体的数据。总数也存在一定的误差。

整理自: https://baijiahao.baidu.com/s?id=1634730713559356381&wfr=spider&for=pc

发布了95 篇原创文章 · 获赞 16 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tiankong_12345/article/details/90746565