Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Redis compatible HLL implementation in Java

A Redis compatible HLL implementation in Java

Okada Haruki

August 02, 2019
Tweet

More Decks by Okada Haruki

Other Decks in Programming

Transcript

  1. 原理の直感的な説明 いいかえると、2^k 個ランダムに選ばないと「左端 の1 がk bit 目」であるような数が現れない つまりあるデータセットの要素を64bit hash にか

    けて「左端の1 のbit 番号」だけ記録すれば、そのデ ータセットのユニークカウントを推定できる もちろんこれだけだと2^k 単位でしか近似できない し精度も悪いので、hash 関数をm 個使ってその平 均を取る、とか色々やる 実際は別々のhash 関数を用意するんじゃなくて もっと頭のいい方法でやる
  2. HyperLogLog on Redis $ for i in `seq 1000`; redis­cli

    PFADD key $i > /dev/null $ redis­cli PFCOUNT key (integer) 1001 $ for i in `seq 1000`; redis­cli PFADD key $i > /dev/null $ redis­cli PFCOUNT key (integer) 1001 $ for i in `seq 100`; redis­cli PFADD foo a$i > /dev/null $ redis­cli PFCOUNT foo (integer) 99 $ redis­cli PFMERGE merged key foo OK $ redis­cli PFCOUNT merged (integer) 1103
  3. HyperLogLog の内部表現 普通に内部表現をGET できる 公式doc にもちゃんと書いてある https://redis.io/commands/pfcount redis­cli> PFADD key

    elem1 elem2 (integer) 1 redis­cli> GET key "HYLL\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80i\xe1\x80N\ The HyperLogLog, being a Redis string,can be retrieved with GET and restored with SET. “ “
  4. 例 $ amm > import $ivy.`com.mayreh:pfutil:0.1.1` > import com.mayreh.pfutil.v4.HllV4 >

    val hll = HllV4.newBuilder().build() > (1 to 1000).foreach(i => hll.pfAdd(s"$i".getBytes)) > hll.pfCount() res4: Long = 1001L > val hll2 = HllV4.newBuilder().build() > (1 to 100).foreach(i => hll2.pfAdd(s"a$i".getBytes)) > hll2.pfCount() res7: Long = 99L > hll.pfMerge(hll2).pfcount() res8: Long = 1103L