Redis HyperLogLog

Redis HyperLogLog是一種使用隨機化的算法,以少量內存提供集合中唯一元素數量的近似值。

HyperLogLog 可以接受多個元素作爲輸入,並給出輸入元素的基數估算值:

  • 基數:集合中不同元素的數量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基數就是 3 。
  • 估算值:算法給出的基數並不是精確的,可能會比實際稍微多一些或者稍微少一些,但會控制在合理的範圍之內。

HyperLogLog 的優點是,即使輸入元素的數量或者體積非常非常大,計算基數所需的空間總是固定的、並且是很小的。

在 Redis 裏面,每個 HyperLogLog 鍵只需要花費 12 KB 內存,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費內存就越多的集合形成鮮明對比。

但是,因爲 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以
HyperLogLog 不能像集合那樣,返回輸入的各個元素。

示例

redis 127.0.0.1:6379> PFADD mykey "redis"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mongodb"  
1) (integer) 1  
redis 127.0.0.1:6379> PFADD mykey "mysql"  
1) (integer) 1  
redis 127.0.0.1:6379> PFCOUNT mykey  
(integer) 3

Redis集排序集合命令

下表列出了 HyperLogLog 相關的一些基本命令。

序號

命令

說明

1

PFADD key element [element …]

將指定的元素添加到指定的HyperLogLog 中。

2

PFCOUNT key [key …]

返回給定 HyperLogLog 的基數估算值。

3

PFMERGE destkey sourcekey [sourcekey …]

將多個 HyperLogLog 合併爲一個 HyperLogLog