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
350
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
900
sbt-uglifier
ocadaruma
0
1.3k
Sparkが社内で流行ってきた話
ocadaruma
4
970
Other Decks in Programming
See All in Programming
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
220
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
180
スマートグラスで並列バイブコーディング
hyshu
0
260
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
170
Vite+ Unified Toolchain for the Web
naokihaba
0
340
dRuby over BLE
makicamel
2
390
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
Performance Engineering for Everyone
elenatanasoiu
0
210
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
290
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Featured
See All Featured
It's Worth the Effort
3n
188
29k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
440
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
RailsConf 2023
tenderlove
30
1.5k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Technical Leadership for Architectural Decision Making
baasie
3
420
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Balancing Empowerment & Direction
lara
6
1.2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
400
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
まとめ 確率的データ構造面白くて便利!