独特的算是
网站的一个很常见的
功能,如访问网站的
独立访问者人数(即UV)。常见的计数问题,但
解决方案可能会很复杂:一是计算量可能会很大,如大型网站每天都有数以百万计的人访问,数据量大;二是通常也要
扩展维数,比如每天除了紫外,还想知道每周或每月的紫外线,所以结果是很复杂的。
在关系数据库存储
系统中,唯一计数的唯一
方法是选择计数(不同)。这是非常简单的,但是如果数据量很大,这句话的
执行速度很慢。关系数据库的另一个问题是插入数据的
性能不高。
redis是能够解决这样的计数问题,于关系数据库,更快的资源少,甚至3种不同的方法。
1。基于集
Redis集合是用来存储独特的数据集。它可以快速判断一个元素是否存在于集合中,或者快速计算一个集合的元素个数,并将其合并到一个新集合中:
复制代码代码如下所示:
sismember关键成员#判断是否存在
萨德的
核心成员#加盟成员
个关键#获取集合中的元素数
基于集合的方法简单、有效、准确、适用范围广、易于理解。它的缺点是资源消耗比较大(当然,比关系数据库少得多)。如果元素的数量很大,比如上百万的计数,那么消耗
内存就太可怕了。
2。基于位
Redis的点可以用来实现高
压缩比的计数
设置内存,存储有关元素的信息通过一个1位或0。例如,该网站的独立访客数可以user_id作为抵消点偏移,设置为1,这意味着访问。1 MB的
空间可以存储大约8000000个
用户的每日访问计数:
复制代码代码如下所示:
setbit关键偏移值#集信息
中的getbit偏移#获取信息的关键
{开始} #比特计数键结束计数
bitop
操作destkey关键{key} #位图合并…
基于空间消耗的位方法要比集合小得多,但它可以映射到简单的元素迁移,应用范围很窄,而且占用空间取决于最大偏移量,而计数不相关,如果最大偏移量很大,也有相当大的内存消耗。
三.基于HyperLogLog
为了达到精确计数只有大量的数据是困难的,但如果只是近似的话,有许多科学计算的有效算法,这是一个著名的HyperLogLog计数算法,它可以只使用大约12 K的内存,只指望亿元,与约百分之一的误差。所涉及的
命令如下:
复制代码代码如下所示:
pFADD要素{元…} #添加元素
pfcount关键{key} #计数…
这种计数方法实在是太棒了,我还没有完全了解它,我对相关的文章很感兴趣。
三独特的计数方法所提供的使用都有自己的优点和缺点,可以充分满足不同
情况下的计算要求。