云服务器网:购买云服务器和VPS必上的网站!

Redis实现唯一计数的3种方法分享

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩大计

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor (也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩大计数的维度,比如除需要每天的 UV,还想知道每周或每个月的 UV,这样致使计算十分复杂。

在关系数据库存储的系统里,实现唯一计数的方法就是 select count(distinct <item_id>),它十分简单,但是如果数据量很大,这个语句履行是很慢的。用关系数据库另外一个问题是插入数据性能也不高。

redis 解决这类计数问题得心应手,相比关系数据库速度更快,消耗资源更少,乃至提供了 3 种区别的方法。

1.基于 set

Redis 的 set 用于保存唯一的数据集合,通过它可以快速判断某一个元素会不会存在于集合中,也能够快速计算某一个集合的元素个数,另外和可以合并集合到一个新的集合中。触及的命令以下:

SISMEMBER key member # 判断 member 会不会存在
SADD key member # 往集合中加入 member
SCARD key # 获得集合元素个数

基于 set 的方法简单有效,计数精确,适用面广,易于理解,它的缺点是消耗资源比较大(固然比起关系数据库是少很多的),如果元素个数很大(比如上亿的计数),消耗内存很恐怖。

2.基于 bit

Redis 的 bit 可以用于实现比 set 内存高度紧缩的计数,它通过一个 bit 1 或 0 来存储某个元素会不会存在信息。例如网站唯一访客计数,可以把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB的空间就能够寄存 800 多万用户的一天访问计数情况。触及的命令以下:

SETBIT key offset value # 设置位信息
GETBIT key offset # 获得位信息
BITCOUNT key [start end] # 计数
BITOP operation destkey key [key …] # 位图合并

基于 bit 的方法比起 set 空间消耗小很多,但是它要求元素能否简单映照为位偏移,适用面窄了很多,另外它消耗的空间取决于最大偏移量,和计数值无关,如果最大偏移量很大,消耗内存也相当可观。

3.基于 HyperLogLog

实现超大数据量精确的唯一计数都是比较困难的,但是如果只是近似的话,计算科学里有很多高效的算法,其中 HyperLogLog Counting 就是其中非常著名的算法,它可以仅仅使用 12 k左右的内存,实现上亿的唯一计数,而且误差控制在百分之一左右。触及的命令以下:

PFADD key element [element …] # 加入元素
PFCOUNT key [key …] # 计数

这类计数方法真的很奇异,我也没有完全弄明白,有兴趣可以深入研究相关文章。

redis 提供的这三种唯一计数方式各有优劣,可以充分满足区别情况下的计数要求。

本文来源:https://www.yuntue.com/post/151964.html | 云服务器网,转载请注明出处!

关于作者: yuntue

云服务器(www.yuntue.com)是一家专门做阿里云服务器代金券、腾讯云服务器优惠券的网站,这里你可以找到阿里云服务器腾讯云服务器等国内主流云服务器优惠价格,以及海外云服务器、vps主机等优惠信息,我们会为你提供性价比最高的云服务器和域名、数据库、CDN、免费邮箱等企业常用互联网资源。

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注