• Redis中Hyperloglog的用途和用法
  • 发布于 2个月前
  • 89 热度
    0 评论
一 Hyperloglog 相关概念

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


如果上面你不明白是啥意思,那么简单说 ,就是HLL是用来进行基数统计的,在一些场景非常有用,比如网络流量分析、统计网站的独立访客数量、社交媒体平台的活跃用户数、统计分析等等。

二  常见操作命令
Redis的命令行工具(redis-cli)提供了一系列的命令来操作HyperLogLog数据结构。以下是一些常用的HyperLogLog相关命令:

1.PFADD key element [element ...]: 将一个或多个元素添加到指定的HyperLogLog结构中。
示例:PFADD mylog apple banana cherry
2.PFCOUNT key [key ...]: 获取一个或多个HyperLogLog结构的估计基数值。
示例:PFCOUNT mylog
3.PFMERGE destkey sourcekey [sourcekey ...]: 将多个HyperLogLog结构合并到目标HyperLogLog结构中。

示例:PFMERGE destination source1 source2

4.PDEBUG <subcommand> [arguments ...]: 命令行调试子命令,可以用于检查和调试HyperLogLog内部状态。
示例:PDEBUG OBJECT mylog

5.PTTL key: 获取指定HyperLogLog结构的剩余过期时间(以毫秒为单位)。
示例:PTTL mylog

6.PEXPIRE key milliseconds: 设置指定HyperLogLog结构的过期时间(以毫秒为单位)。
示例:PEXPIRE mylog 10000

7.PERSIST key: 移除指定HyperLogLog结构的过期时间,使其永久有效。
示例:PERSIST mylog

三  Redis-cli下的操作示例
主要演示PFADD, PFCOUNT, PFMERGE命令的使用,如下图:

四.基于Golang实现的使用实例
Golang实现的代码如下:
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)
}
得到的结果如下:

在终端界面使用命令操作,结果如下:

用户评论