Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果用户访问n次,则统计唯一用户_Algorithm_Redis_Bloom Filter - Fatal编程技术网

Algorithm 如果用户访问n次,则统计唯一用户

Algorithm 如果用户访问n次,则统计唯一用户,algorithm,redis,bloom-filter,Algorithm,Redis,Bloom Filter,我想在广告网络中实现频率上限。我想在一天中只为唯一的用户提供n次活动。如果n=1,我可以用redis中的BloomFilter实现,但通常n大于1。有没有针对这个问题的数据结构,甚至是概率数据结构?这是在redis中实现的吗?如果n很小,只需在“1x”+用户、“2x”+用户、…,n+“x”+“用户”上使用bloom过滤器即可。作为一个细节,按随机顺序检查它们。这意味着,当用户只在一小部分时间内被看到时,您将有更少的查找 如果N很大,考虑只做固定数量的随机查找。当你接近你的极限时,它会与你的表现进

我想在广告网络中实现频率上限。我想在一天中只为唯一的用户提供n次活动。如果n=1,我可以用redis中的BloomFilter实现,但通常n大于1。有没有针对这个问题的数据结构,甚至是概率数据结构?这是在redis中实现的吗?

如果n很小,只需在“1x”+用户、“2x”+用户、…,n+“x”+“用户”上使用bloom过滤器即可。作为一个细节,按随机顺序检查它们。这意味着,当用户只在一小部分时间内被看到时,您将有更少的查找

如果N很大,考虑只做固定数量的随机查找。当你接近你的极限时,它会与你的表现进行交易,当你接近极限时,它有时会选择不填补。例如,最多4次查找时,在到达极限的50%时,您在90%的时间内做出了正确的选择,在到达极限的80%时,您在60%左右的时间内仍然做出了正确的选择。如果n=20,当你达到极限时,你节省了很多时间

我确信有一种特殊的bloom过滤器可以达到类似的限制,即每次检查的哈希函数的随机子集比您设置的要多。但你不会发现这种特殊的结构已经在Redis中预先构建好了

我建议的概率版本是:

def is_available(user, k=4, n=20):
    tried = []
    for 1..k:
        i = rand(n)
        while i in tried:
            i = rand(n)
        id = user + ":" + str(i)
        if bloomfilter.lookup(id):
            tried.append(i)
        else:
            bloomfilter.add(id)
            return True
    return False
随机化的目的是减少所需的查找次数。如果你每次都按相同的顺序进行,那么在第10次访问时,你将进行9次查找,然后你会发现它们没有超出配额。但是,如果n是20,并且以随机顺序进行,则第一次查找的一半时间就足够了。这减少了往返次数,从而提高了性能,这在adtech中非常重要。

如果n很小,只需在“1x”+用户、“2x”+用户、…,n++“x”+“用户”上使用bloom过滤器即可。作为一个细节,按随机顺序检查它们。这意味着,当用户只在一小部分时间内被看到时,您将有更少的查找

如果N很大,考虑只做固定数量的随机查找。当你接近你的极限时,它会与你的表现进行交易,当你接近极限时,它有时会选择不填补。例如,最多4次查找时,在到达极限的50%时,您在90%的时间内做出了正确的选择,在到达极限的80%时,您在60%左右的时间内仍然做出了正确的选择。如果n=20,当你达到极限时,你节省了很多时间

我确信有一种特殊的bloom过滤器可以达到类似的限制,即每次检查的哈希函数的随机子集比您设置的要多。但你不会发现这种特殊的结构已经在Redis中预先构建好了

我建议的概率版本是:

def is_available(user, k=4, n=20):
    tried = []
    for 1..k:
        i = rand(n)
        while i in tried:
            i = rand(n)
        id = user + ":" + str(i)
        if bloomfilter.lookup(id):
            tried.append(i)
        else:
            bloomfilter.add(id)
            return True
    return False

随机化的目的是减少所需的查找次数。如果你每次都按相同的顺序进行,那么在第10次访问时,你将进行9次查找,然后你会发现它们没有超出配额。但是,如果n是20,并且以随机顺序进行,则第一次查找的一半时间就足够了。这减少了往返次数,从而提高了性能,这在adtech中非常重要。

听起来像是在描述,而Redis core没有,确实是:

听起来像是在描述,而Redis core没有,确实是:

好主意,使用multipe bloom过滤器,但我冒昧地提供了另一种奇特的数据结构。这是一个有趣的想法。当然,count min sketch是另一种选择,但可能需要更多内存。我不明白的是随机顺序。这会有什么帮助?你能用查找和添加的伪代码更详细地描述算法吗?@ThomasMueller我添加了代码和一个简短的解释。使用multipe bloom过滤器的想法很棒,但我冒昧地提供了另一种奇特的数据结构。这是一个有趣的想法。当然,count min sketch是一种替代方法,但可能需要更多内存。我不明白的是随机顺序。这会有什么帮助?你能用查找和添加的伪代码更详细地描述算法吗?@ThomasMueller我添加了代码并做了简要解释。