Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
A Redis compatible HLL implementation in Java
Search
Okada Haruki
August 02, 2019
Programming
360
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
A Redis compatible HLL implementation in Java
https://github.com/ocadaruma/pfutil
Okada Haruki
August 02, 2019
More Decks by Okada Haruki
See All by Okada Haruki
HyperLogLog feature of ClickHouse
ocadaruma
0
1.5k
HyperLogLog is interesting
ocadaruma
3
910
sbt-uglifier
ocadaruma
0
1.3k
Sparkが社内で流行ってきた話
ocadaruma
4
980
Other Decks in Programming
See All in Programming
My Marp Sample
sinoue0108
0
130
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
260
VibeCodingからAgenticWorkflowへ
starfish719
0
950
Dockerfile CMD for Node.js
grazie1999
0
150
React本体のコードリーディング
high_g_engineer
1
160
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
280
源内ハンズオン概要編
hideg
0
230
Press start. Python's next generation.
willingc
PRO
3
280
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
170
高専キャリア LT 発表内容
crysta1221
5
4.9k
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
41
27k
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
550
Featured
See All Featured
For a Future-Friendly Web
brad_frost
183
10k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
210
Crafting Experiences
bethany
1
270
Ruling the World: When Life Gets Gamed
codingconduct
0
310
Between Models and Reality
mayunak
4
410
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
220
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Code Reviewing Like a Champion
maltzj
528
40k
RailsConf 2023
tenderlove
30
1.5k
Utilizing Notion as your number one productivity tool
mfonobong
4
560
HDC tutorial
michielstock
2
830
Transcript
Redis 互換なHyperLogLog の Java 実装を作った話 @ocadaruma
HyperLogLog ユニークカウントを高速・省メモリに推定する確 率的データ構造 Redis にも標準で入ってる
原理の直感的な説明 64bit int を一様ランダムに選んだとき、「左から 数えて1 が最初に立つのがk bit 目」である確率は 1/2^k
原理の直感的な説明 いいかえると、2^k 個ランダムに選ばないと「左端 の1 がk bit 目」であるような数が現れない つまりあるデータセットの要素を64bit hash にか
けて「左端の1 のbit 番号」だけ記録すれば、そのデ ータセットのユニークカウントを推定できる もちろんこれだけだと2^k 単位でしか近似できない し精度も悪いので、hash 関数をm 個使ってその平 均を取る、とか色々やる 実際は別々のhash 関数を用意するんじゃなくて もっと頭のいい方法でやる
HyperLogLog on Redis $ for i in `seq 1000`; rediscli
PFADD key $i > /dev/null $ rediscli PFCOUNT key (integer) 1001 $ for i in `seq 1000`; rediscli PFADD key $i > /dev/null $ rediscli PFCOUNT key (integer) 1001 $ for i in `seq 100`; rediscli PFADD foo a$i > /dev/null $ rediscli PFCOUNT foo (integer) 99 $ rediscli PFMERGE merged key foo OK $ rediscli PFCOUNT merged (integer) 1103
利用例 page やドメイン単位でUU 数をリアルタイムにレポ ートするシステム
PFMERGE は比較的遅い Redis 上で重い操作はあんまりしたくない
HyperLogLog の内部表現 普通に内部表現をGET できる 公式doc にもちゃんと書いてある https://redis.io/commands/pfcount rediscli> PFADD key
elem1 elem2 (integer) 1 rediscli> 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. “ “
Java 側で操作できれば便利では? PFMERGE みたいな重い操作をRedis 上でやらず、 アプリケーション側に内部表現を持ってきて、 Java 上でやれると便利
pfutil https://github.com/ocadaruma/pfutil Redis v4 とv5 ではアルゴリズムがちょっと違う 内部表現は同じ どっちのアルゴリズムにも対応
例 $ 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
まとめ 確率的データ構造面白くて便利!