Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.6k
HyperLogLog is interesting
ocadaruma
3
910
sbt-uglifier
ocadaruma
0
1.3k
Sparkが社内で流行ってきた話
ocadaruma
4
980
Other Decks in Programming
See All in Programming
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
2
300
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
130
Verilogで学ぶCPU自作入門.pdf
uyuki234
6
2.7k
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
780
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
100
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
5k
Workers Cache を知る
syumai
0
210
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
190
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.2k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
280
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
360
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Navigating Team Friction
lara
192
16k
Side Projects
sachag
456
43k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
Music & Morning Musume
bryan
48
7.4k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
Faster Mobile Websites
deanohume
310
32k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
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
まとめ 確率的データ構造面白くて便利!