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
Cache Stampede をセマフォで対策する
Search
najeira
September 27, 2016
Programming
19k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cache Stampede をセマフォで対策する
najeira
September 27, 2016
More Decks by najeira
See All by najeira
Flutter with Platform
najeira
4
1.5k
Google I/O 2019 Extended Tokyo - Flutter
najeira
1
210
Flutter APP DOJO 2019-04
najeira
1
200
Flutterとの1年
najeira
4
1.6k
Flutter List View 概要
najeira
0
1.2k
Flutter / Google I/O 2018 報告会 信州
najeira
0
340
仕組みを知れば怖くない! Flutter入門
najeira
16
8.1k
FlutterでAndroid/iOS両対応のアプリ開発
najeira
0
4.7k
Google I/O 2017 報告会 Firebase/Cloud
najeira
1
190
Other Decks in Programming
See All in Programming
AIエージェントで 変わるAndroid開発環境
takahirom
2
520
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
310
どこまでゆるくて許されるのか
tk3fftk
0
470
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
140
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
360
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.3k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
210
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
370
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
0
190
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
Featured
See All Featured
Thoughts on Productivity
jonyablonski
76
5.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Facilitating Awesome Meetings
lara
57
7k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
220
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Why Our Code Smells
bkeepers
PRO
340
58k
Transcript
Cache Stampede 対策として セマフォを使う najeira @ Gunosy Cache Night
Cache Stampede キャッシュの有効期限切れによって オリジン(データベースなど)へ アクセスが殺到する問題 Stampede = 殺到
典型的な使い方 # キャッシュからデータを取得する data = get_cache(key) if not data: #
キャッシュがなければデータベースから取得する data = get_data_from_database(...) # 新しいデータをキャッシュに保存する set_cache(key, data, ttl=60) # ユーザーにレスポンスを返す send_response(data)
アクセスが少ないと
アクセスが多いと
呼び方? 他にも • Cache miss storm • Dog-piling と呼ばれたりするらしい Thundering
Herdと呼ばれることも?
対策 • ロック • 別プロセスで定期更新 • 確率的な期限切れ 今日はロック(セマフォ)について
有名OSSは? • Rails ActiveSupport::Cache::Store race_condition_ttl • nginx proxy_cache_lock • Varnish
Grace mode いずれもロック系の対策
考え方 新しいキャッシュの作成は 「ひとりだけ」が実行すればよい 他のプロセスは、 それを待つか、 古いキャッシュを使う
ひとりだけ更新
セマフォ 並列環境での複数の実行単位が共有す る資源にアクセスするのを制御するもの。 ある資源が何個使用可能かを示す記録 で、使用や解放の際に記録を安全に書き 換え、資源が使用可能になるまで待つ操 作が結びついている。 by https://ja.wikipedia.org/wiki/セマフォ
セマフォ Webサーバは複数台に分散、 同一のサーバでも複数プロセス OSの(プログラミング言語上の) セマフォを使うことはできない。
セマフォ キャッシュが共有資源なので、 キャッシュのシステム上に セマフォを実現すればよい
Memcached Add add: データが存在しない場合のみ 保存する。
コードで見ると data = memcache.get(key_for_data) if not data: memcache.add(key_for_semaphore, 1, ttl=60)
data = get_data_from_database(...) #データベースから取得 memcache.set(key_for_data, data, ttl=120) # キャッシュを保存 else: #セマフォの獲得を試みる ret = memcache.add(key_for_semaphore, 1, ttl=60) if ret: # セマフォを獲得した場合は新しいキャッシュを作る data = get_data_from_database(...) memcache.set(key_for_data, data, ttl=120) return data
ポイント セマフォ用のキーは データ用のキーより 短い有効期限にしておく セマフォ < データ
ポイント addできるのはひとり ⇒オリジンへのアクセスはひとり セマフォ用のキーに有効期限がある ⇒セマフォの解放が非同期で自動 ⇒解放されると次のアクセスが新しい キャッシュを作る