闽公网安备 35020302035485号
HyperLogLog 是一种用于估算集合基数的概率型数据结构。通常,计算唯一元素的数量需要使用与待计数项数量成比例的内存,因为需要记住过去已见过的元素,以避免重复计数。然而,有一组算法可以用内存换取精度:您最终得到了带有标准误差的估算值,在Redis实现中,这个误差小于1%。这种算法的神奇之处在于,您不再需要使用与待计数项数量成比例的内存,而是可以只用一个固定的内存量!在最坏情况下是12k字节,或者如果HLL(我们从现在开始都称之为HLL)看到的元素非常少,则可以使用更少的内存。

package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
func main() {
// 创建Redis客户端
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis服务器地址
Password: "", // Redis访问密码
DB: 0, // Redis数据库编号
})
// 添加元素到HyperLogLog结构
err := client.PFAdd(context.TODO(), "mylog", "apple", "banana", "cherry").Err()
if err != nil {
fmt.Println("Error:", err)
return
}
// 堆代码 duidaima.com
// 获取估算的基数值
count, err := client.PFCount(context.TODO(), "mylog").Result()
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Estimated count:", count)
}
得到的结果如下:
