runoops.com

Redis HyperLogLogs

HyperLogLog是一种概率数据结构,用于对唯一事物进行计数(从技术上讲,这是指估计集合的基数)。 通常,对唯一项目进行计数需要使用与要计数的项目数量成比例的内存量,因为您需要记住过去已经看到的元素,以避免多次对其进行计数。 但是,有一组算法会以内存换取精度:以Redis实施为例,您得出的带有标准误差的估计度量最终会小于1%。 该算法的神奇之处在于,您不再需要使用与所计数项目数量成比例的内存量,而可以使用恒定数量的内存! 在最坏的情况下为12k字节,如果您的HyperLogLog(从现在开始将它们称为HLL)看到的元素很少,则少得多。

Redis中的HLL尽管在技术上是不同的数据结构,但被编码为Redis字符串,因此您可以调用GET来序列化HLL,然后调用SET来将其反序列化回服务器。

从概念上讲,HLL API就像使用Set来执行相同的任务。 您可以将每个观察到的元素添加到集合中,并使用SCARD检查集合中的元素数量,这是唯一的,因为SADD不会重新添加现有元素。

虽然您并未真正将项目添加到HLL中,但由于数据结构仅包含不包含实际元素的状态,因此API相同:

每次看到新元素时,都可以使用PFADD将其添加到计数中。
到目前为止,每次您要检索添加到PFADD中的唯一元素的当前近似值时,都使用PFCOUNT。

 > pfadd hll a b c d
  (integer) 1
  > pfcount hll
  (integer) 4

此数据结构用例的一个例子是每天计算用户在搜索表单中执行的唯一查询。

Redis也可以执行HLL的合并,请查看完整的文档以获取更多信息。