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
Javaユーザに伝えたいGuava Cache入門
Search
Hiroto YAMAKAWA
January 15, 2017
Technology
0
1.5k
Javaユーザに伝えたいGuava Cache入門
Java Do #08
https://javado.connpass.com/event/47668/
Hiroto YAMAKAWA
January 15, 2017
Tweet
Share
More Decks by Hiroto YAMAKAWA
See All by Hiroto YAMAKAWA
開発環境構築の共通要素:必要なものを手元に持ってきて使えるようにする/JavaDo28
gishi_yama
0
100
ドメイン層×日本語プログラミング/seb_sapporo_04
gishi_yama
1
140
Javaへの新たなHello, World / yuruchitose-04
gishi_yama
0
54
JSR381、知っていますか?Javaの画像認識APIのはなし / SC4Y23-05
gishi_yama
0
240
jPeekでのクラスの凝集度計測の試行 / mild-web-sapporo#24
gishi_yama
0
390
Github CopilotとChatGPTを使って感じた使い分けの糸口 / JavaDo #22
gishi_yama
1
1.7k
子ども向けプログラミング体験教室でのHololens2利用事例 / IoTLT#97
gishi_yama
0
110
AWS Serverless Java Container, Spring Bootで試してみた / javado22
gishi_yama
1
770
Hololens2と 小中高プログラミング教育の利用にむけた試行 / XRMTG 2023-1-18
gishi_yama
0
320
Other Decks in Technology
See All in Technology
Delegating the chores of authenticating users to Keycloak
ahus1
0
120
より良いプロダクトの開発を目指して - 情報を中心としたプロダクト開発 #phpcon #phpcon2025
bengo4com
1
3.1k
rubygem開発で鍛える設計力
joker1007
2
220
【PHPカンファレンス 2025】PHPを愛するひとに伝えたい PHPとキャリアの話
tenshoku_draft
0
120
AIとともに進化するエンジニアリング / Engineering-Evolving-with-AI_final.pdf
lycorptech_jp
PRO
0
110
CI/CD/IaC 久々に0から環境を作ったらこうなりました
kaz29
1
180
なぜ私はいま、ここにいるのか? #もがく中堅デザイナー #プロダクトデザイナー
bengo4com
0
470
Yamla: Rustでつくるリアルタイム性を追求した機械学習基盤 / Yamla: A Rust-Based Machine Learning Platform Pursuing Real-Time Capabilities
lycorptech_jp
PRO
3
120
Oracle Audit Vault and Database Firewall 20 概要
oracle4engineer
PRO
3
1.7k
"サービスチーム" での技術選定 / Making Technology Decisions for the Service Team
kaminashi
1
150
ひとり情シスなCTOがLLMと始めるオペレーション最適化 / CTO's LLM-Powered Ops
yamitzky
0
440
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
400
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
5.6k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
The Language of Interfaces
destraynor
158
25k
Optimizing for Happiness
mojombo
379
70k
Into the Great Unknown - MozCon
thekraken
39
1.9k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Making the Leap to Tech Lead
cromwellryan
134
9.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
700
KATA
mclloyd
29
14k
Transcript
!HJTIJ@ZBNB +BWBϢʔβʹ͍͑ͨ (VBWB$BDIFೖ
IUUQTDPEFSEPKPTBQQPSPDPOOQBTTDPNFWFOU
&BSMZ IUUQXXXUPPDPNTVQQPSUBQQMFOFXTIUNM জᢣᦍᣀ
όεϩέʔγϣϯγεςϜͷ։ൃʹͯ ᣪఞⷭӒҵヹ➥ᕕӒҵѬᥥ㛯ᏌҶ৵ҮԯդԧӼ Ტ༪%#ҵӳ4FMFDUҿӅӵԛԡӬӍӉҮӔҮӲҰӔҶӃӵ ȤѫԕՋԫԟՍӁӐөӵҵ
ǖ +BWBӘԕՋԫԟՍՑԌԾՑՒ (PPHMFӘ+BWB᳣⇹ՑԌԾՑՒ(VBWBӘकᮿ⥎㮣 ǖ ⼀ᇰԽԉԌՓՔԡ㮢ԛդԱञӑ⼀ᇰ㮣ӑಌਃ ǖ IUUQTHJUIVCDPNHPPHMFHVBWBXJLJ$BDIFT&YQMBJOFE ǖ NBWFO (VBWB$BDIF
EFQFOEFODZ HSPVQ*EDPNHPPHMFHVBWBHSPVQ*E BSUJGBDU*EHVBWBBSUJGBDU*E WFSTJPOWFSTJPO EFQFOEFODZ
αϯϓϧɿΩʔΛ༩͑ΔͱࣗಈతʹΩϟογϡσʔλΛੜ LoadingCache<String, Integer> randomIntCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(new CacheLoader<String,
Integer>() { @Override public Integer load(String key) throws Exception { return getRandomInt(); } }); HFU ǒGPPǒ ӑѬMPBE ǒGPPǒ Әᇴ✿᧠ӼǒGPPǒӒҮҰԕդӑԕՋԫԟՍӃӵѭ ⓬ᒁӉӍӉӳѬԕՋԫԟՍӁӉԌ՛ԡԧ՛ԡӼ⏺᪨Ӄӵ Integer v1 = randomIntCache.get(”foo”); ← (1) loadϝιουΛ࣮ߦ͠ɺ݁ՌΛΩϟογϡ Integer v2 = randomIntCache.get(”foo”); ← (2) (1)ͷ࣮ߦ݁Ռͱશ͘ಉ͡ΠϯελϯεΛฦ͢
LoadingCache<String, Integer> randomIntCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(new CacheLoader<String, Integer>()
{ @Override public Integer load(String key) throws Exception { return getRandomInt(); } }); ԕՋԫԟՍӘ⻎ᠶᦴঽӔӓ LFZ 7BMVF ԕՋԫԟՍӃӵ7BMVFྞԌ՛ԡԧ՛ԡӘ⇰ᘻᢅᴿѭ,FZӼਜӍӉⅈӑ⇰ᘻӬ൧⥎ѭ ,FZ 7BMVFәԗՑԡѭ $BDIF-PBEFSәѬ,FZҾӒӕԕՋԫԟՍӃӵ7BMVFԌ՛ԡԧ՛ԡӘ⇰ᘻᢅᴿӼఙᒐӃӵѭ ԕՋԫԟՍӘ⻎ᠶᦴঽӔӓә⹋ᡔ⼀ᇰӑҷӵѭ㮢ఙ㖟ᣪ㔿ѬԕդӘᡔӔӓ㮣 $BDIF-PEFSӼ ਜҰӒҷә -PBEJOH$BDIF αϯϓϧɿΩʔΛ༩͑ΔͱࣗಈతʹΩϟογϡσʔλΛੜ LFZ 7BMVF LFZ 7BMVF
αϯϓϧɿΩʔΛ༩͑ΔͱࣗಈతʹΩϟογϡσʔλΛੜ LoadingCache<String, Integer> randomIntCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(CacheLoader.from(() ->
getRandomInt())); +BWBӘMBNCEBᐛ㮢'VODUJPO 4VQQMJFS㮣ӼਜӍӐ$BDIF-PBEFSӼਃӶӵѭѫ 'VODUJPO LFZ LFZӼਜҰⅈ 4VQQMJFS LFZӼਜӹӔҮⅈ -BNCEBᐛӼਜҰ൶Ѭ&YDFQUJPOҶԡՕդҿӶӔҮӘӑѬHFU6ODIFDLFE ,FZ ӼਜҰѭ 㮢⼳✦әᒁ㈨ѭӉӊӁHFUӘӨӨӑӬහӝ௲ӁӕਦႌⅈҶᒨ⺙ӔҽӒলႌәใ㛸әᾩҮ㮣 Integer v1 = randomIntCache.getUnchecked(”foo”); ← ExceptionͷνΣοΫΛ͠ͳ͍߹ Integer v2 = randomIntCache.getUnchecked(”foo”);
ΩϟογϡͰ͖Δσʔλͷߏɿ&OUSZ ,FZԌ՛ԡԧ՛ԡ 7BMVFԌ՛ԡԧ՛ԡ Ǒ"ǒ ǑҴәӲҰǒ Ǒ#ǒ ǑҽӽӕӋәǒ Ǒ$ǒ ǑҿӲҰӔӳǒ ,FZԌ՛ԡԧ՛ԡ
7BMVFԒԾԠԏԗ ǑBǒ ǑCǒ ǑDǒ ǑFǒ ǑGǒ ǑHǒ ǑIǒ ǑJǒ ǑKǒ ,FZԌ՛ԡԧ՛ԡ㮴7BMVFԌ՛ԡԧ՛ԡӘՂԊӼԐ՛ՒӒӁӐᩈ✊ӑҷӵѭ 㮢.BQӒൺӂ㮣 ȔԐ՛Ւ
ΤϯτϦͷഁغ݅ɿ&WJDUJPO ǖ FYQJSF"GUFS8SJUF MPOHEVSBUJPO 5JNF6OJUVOJU Ԑ՛ՒӼਃᘻӁӐҵӳ⏺᪨ҿӶӵӨӑӘᦆ㖟ѭ ǖ FYQJSF"GUFS"DDFTT MPOHEVSBUJPO
5JNF6OJUVOJU Ԑ՛ՒӕᥰᒁӘԊԗԣԡҶҬӍӐҵӳ⏺᪨ҿӶӵӨӑӘᦆ㖟ѭ ǖ NBYJNVN4J[F MPOHTJ[F Ԑ՛ՒӼᛝӃӵᡔѭᛡᇰᡔলञӘԐ՛ՒᡔӕӔӵӒѬ'*'0ӑ⏺᪨ѭ ǖ NBYJNVN8FJHIU㮢MPOHTJ[F Ԑ՛ՒӼᛝӃӵᡔѭৼҵҶᛡᇰলञӘᡔӕӔӵӒѬ'*'0ӑ⏺᪨ѭ ѷৼҵѸӘ☑௲ՓդՓә8FJHIFSԒԾԠԏԗӑḉӃѭ 㮢ਦҲӚѬԕՋԫԟՍӃӵ7BMVFӘ➜൶ᡡᆻᡔѬ-JTUᡔӔӓ㮣
ΤϯτϦͷഁغ݅ɿ3FGSFTI ǖ SFGSFTI"GUFS8SJUF MPOHEVSBUJPO 5JNF6OJUVOJU Ԑ՛ՒӼਃᘻӁӐҵӳӉӕ7BMVFӼᥥӁ⍃ӃӨӑӘᦆ㖟ѭ FYQJSF9999ӒӘ㉹Ү㮴 FYQJSFәѬᦴঽӼṅӉӃӒԐ՛ՒӼ⏺᪨Ӄӵ
⏺᪨ӘҬӒѬൺӂԕդӑHFUҿӶӵӒѬ7BMVFҶṍ૨ҿӶӵӨӑ⽠ө㈆өᑻӋӕӔӵ SFGSFTIәѬԕդӕሽӁӐӁҮ7BMVFӼṍ૨ӃӵӨӑѬ൜Ү7BMVFӼ㈘Ӂ❰һӵ 㮢⽠ө㈆өᑻӋӕӁӔҮ㮣
ͦͷ΄͔ͷઃఆɿΨϕʔδίϨΫγϣϯͱͷ݉Ͷ߹͍ ǖ TPGU7BMVFT WBMVFӼ4PGU3FGFSFODFӕӃӵ ǖ XFBL,FZT ,FZӼ8FBL3FGFSFODFӕӃӵ ǖ
XFBL7BMVFT WBMVFӼ8FBL3FGFSFODFӕӃӵ ԕդӬӁҹә7BMVFӼᐹീ῍㮢($ҿӶӮӃҹ㮣ӕӃӵѭ 8FBLӒ4PGUӘ㉹ҮәতӘねᡭӔӓӕ⽟ᣀӼӴӉҮҶѬ Ԍ՛ԡԧ՛ԡҶീ῍ҿӶӔҹӔӍӉ㗖Ә($ҿӶӮӃҿӒ⢰ҲӶӚӲҮ 㮢8FBLӘᢅҶ($ҿӶӮӃҹѬ4PGUӘᢅҶԕՋԫԟՍൿҷ㮣
αϯϓϧɿࣗͰΤϯτϦΛొ͢Δ Cache<String, Integer> origCache = CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(); ⧞ಌ⋵ӕ7BMVFӼՕդԱӁӔҮ$BDIFԌ՛ԧդԽԏդԡྞӘԕՋԫԟՍӼਃӴѬ
QVU LFZ 7BMVF㮣ӑѬ⧞ӑԐ՛ՒӼ⋭㑤ӃӵҽӒӬӑҷӵ &YQJSFӔӓӘ⼀ᇰӬ-PBEJOH$BDIFൺ᭦ѭ origCache.put(”foo”, 1); origCache.put(”bar”, 2); Integer v1 = origCache.getIfPresent(”foo”); $BDIF-PEFSӼਜӹӔҮӒҷә$BDIF
ΤϯτϦͷഁغɿJOWBMJEBUF $BDIF-PBEJOH$BDIFӘႁᡔӕᇴӑҷӵ ǖ JOWBMJEBUF LFZ ᛡᇰҿӶӉԕդӘԐ՛ՒӼ⏺᪨Ӄӵ ǖ JOWBMJEBUF"-- LFZT
ᛡᇰҿӶӉӐӘԕդӘԐ՛ՒӼ⏺᪨Ӄӵ ǖ JOWBMJEBUF"-- ӐӘԐ՛ՒӼ⏺᪨Ӄӵ
HFUͷछྨͱ͍͚ ǖ HFU ,LFZ -PBEJOH$BDIFӑѬLFZӕሽӃӵ7BMVFӼᒉӃӵѭ 7BMVFӘՕդԱसӕԐՑդҶ⋬⇰ӃӵӒѬ&YFDVUJPO&YDFQUJPOӼUISPXӃӵѭ ǖ HFU6ODIFDLFE ,LFZ
-PBEJOH$BDIFӑѬLFZӕሽӃӵ7BMVFӼᒉӃӵѭ HFUӒൺӂӊҶѬ$BDIF-PBEFSӑԩԏԫԗਦႌӼ⋬ӁӔҮ൶ӕਜҲӵѭ ਦ㮣$BDIF-PBEFSӑMBNCEBᐛӼਜҰᣪ ǖ HFU*G1SFTFOU 0CKFDULFZ $BDIFӑѬLFZӒӁӐᢡӕᆼཡӁӐҮӵӬӘҶҬӶӚ7BMVFӼᒉӃӵѭᾩһӶӚOVMMѭ ӇӘӥҵѬӐӘԐ՛ՒӼ.BQӒӁӐ㈘ӃBT.BQ HFU"MM1SFTFOUӔӓӬҬӵѭ
·ͱΊ (VBWB$BDIFӼਜҰӒѬᡔӑԊԿՒӕԕՋԫԟՍӘণ✵өӼ⇹ᖌӑҷӵѭ Ԑ՛Ւ㮢LFZӒWBMVFӘՂԊ㮣ҶԕՋԫԟՍҿӶѬLFZӑWBMVFӼහӝ௲Ӄѭ -PBEJOH$BDIFӑәѬLFZӕሽӃӵWBMVFӼ$BDIF-PBEFSӑ⇰ᘻӃӵѭ $BDIFӑәѬ⧞ӑLFZӕሽӃӵWBMVFӼQVUӃӵѭ FYQJSF9999 NBYJNVN9999SFGSFTI9999ӔӓӑѬ Ԑ՛ՒӘ⏺᪨ӮᥥӘᦆ㖟ӮᦴঽӼᴀӫӵҽӒҶ௲ᦸӵѭ
$BDIFӘ┣㜇Ӯ$BDIF-PBEFSӘਃӴᢅ ਦႌӘᾩ㮣ӑHFUӘᢅᴿҶႁӹӵ
αϯϓϧίʔυ IUUQTHJUIVCDPNHJTIJZBNBKBWBEP 4UBSUԗՑԡӼゼಌӁӐԾՑԎԞӑ⽇ӃӵҵѬ 0UIFS4BNQMFTԗՑԡӼಌਃҿӅӐҹӊҿҮѭ ⋬ⷭሉӘӐә➃⡣ӁӐҮӨӅӽҶѬᒁӑԝ՛ԿՓӒӁӐビӁӉҮӔӒᓤӍӐҮӨӃѭ ӨӉѬീ⢰ᡡ⃀ӘҶѬ⪙⽓ӑӃҶԛդԱਦҶӹҵӴӮӃҹ୦ᇴӁӐӨӃѭ
ࢀߟจݙ !LB[VIJSB@S+BWBӑਜҲӵԒդԿ՛ԥդԡգԕՋԫԟՍՑԌԾՑՒ IUUQEIBUFOBOFKQ,B[VIJSB !BLJSBLPZBTV㉜ೂӃӵ+BWBՑԌԾՑՒѬ(VBWB IUUQXXXBLJSBLPZBTVOFUHVBWBKBWB MJCSBSJFTFWPMWJOH !CBFMEVOH(VBWB$BDIF IUUQXXXCBFMEVOHDPNHVBWBDBDIF HPPHMF$BDIFT&YQMBJOFE IUUQTHJUIVCDPNHPPHMFHVBWBXJLJ$BDIFT&YQMBJOFE