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