
ãã³ãŒãå²åŠãšãã»ã€ã ãã£ãã·ã¥ã¯éãããéæ³ãããªã鮮床ã®åŠ¥åã ââ ãã€å€ããŠãããããæ±ºãã
æŽæ°ããã®ã«å€ããŸãŸ
äžæã®æŒäžããããšã¢ã³ã³ã®é¢šã ããéãã«åã£ãŠããã
Slack ã«äžè¡å±ãã
ããããŒãå·®ãæ¿ããã®ã«ãå€ãç»åã®ãŸãŸã§ãã
åã¯ããã« DB ãéããã
ã¬ã³ãŒãã¯æ°ããã
管çç»é¢ãæ°ããã
å£ããŠããã®ã¯ãèŠããªããšããã ãã ã£ãã
ãã©ãŠã¶ã®ãã£ãã·ã¥ã
CDN ã®ãšããžã
API ã®ã¡ã¢ãªã
ã©ãããæšæ¥ã®åãããšããããéããããããšçœ®ããéæ³ã®æ®ãã ã
éãããéæ³ã ãšæã£ãŠããé
è¥ãé ããã£ãã·ã¥ãšããèšèãèããšãé ã®ãªãã§ã¯ãã翻蚳ãããŠããŸããã
é ããšãããäžç¬ã§çŽãåªæã
Cache-Control ãè¶³ãã
Redis ãæãã
åãã¯ãšãªãäºåºŠå©ããªãã
æ°åã¯äžããã
ã¬ã¹ãã³ã¹ã¯è»œããªãã
èžã®ãããããå°ãã ã軜ããªãã
ããã³ãŒãå²åŠãšãã»ã€ãããã©ãŒãã³ã¹ã¯éããããªãäœéšã ãã§æžãããç·ã® Lighthouse ãæãåºãã
ãã®å€ããã£ãã·ã¥ã®ããããæŽããã
éãã®å²ç« ã¯æã«å
¥ã£ãã
ããã©ã鮮床ã®çŽæã¯ã©ãã«ãæžããŠããªãã£ãã
鮮床ã®ç·ãåŒããªãã£ãæ¥
ããªãŒã©ã³ã¹ã«ãªã£ãŠæ°å¹Žãå人éçºã®ããã·ã¥ããŒããçŽããã³ã«åããã¿ãŒã³ãç¹°ãè¿ããã
éèš API ãéãã
Redis ã«çµæãå
¥ããã
ããŒã¯ stats:dailyã
TTL ã¯âŠâŠãšãããã 3600ã
æåã¯è³¢ãèŠããã
ã°ã©ããäžç¬ã§åºãã
ãæé©åããããšèžã匵ããã
åé¡ã¯ãç·ãåŒããªãã£ãããšã ã
äžæéå€ããŠãããã®ãã
äžåã§ãå€ããšå°ãã®ãã
誰ãããã®å€ããèš±ãã®ãã
çãããªããã£ãã·ã¥ã¯éæ³ã ã
èšèšãããªãã
ããæ¥ãã¯ã©ã€ã¢ã³ããèšã£ãã
ã仿¥ã®æ°åããããããªãã§ããã
DB ã¯åã£ãŠããã
ç»é¢ã ãããäžæéåã®èªåãæ±ããŠããã
ãšã©ãŒã¯åºãªãã
ãã°ãéãã ã
é®®åºŠãæŽæ°ãããŠããªãç®±ã ãããæšæ¥ã®æ¯è²ãè¿ããŠããã
å·èµåº«ãšåžžæž©ã®æ£ã¯åãç®±ãããªã
ããŸã®åã¯ããã£ãã·ã¥ãããæããŠããŸãã
ããŒã¿ãæ¢ããŠããå·èµåº«ã§ã¯ãªãã鮮床ãéžãã§çœ®ãæ£ã ã
çä¹³ãšã也麺ãåãæ¥æ°ã§ç®¡çããªãã
ã¢ã€ã¹ã®è³å³æéãšã逿²¹ã®è³å³æéã¯éãã
ã³ãŒãã§ãåãã ã
人æ°èšäºã®äžèЧã¯ãååå€ããŠãå°ããªãããšãããã
åšåº«æ°ã¯ãå€ããšå°ãã
èªåãæŽæ°ããçŽåŸã®ãããŒã¯ãäžç§ã§ãå€ããšäžä¿¡ã«ãªãã
ãå
šéšãã£ãã·ã¥ããã°éããã¯ãå
šéšå·åããã°ä¿åã§ããã«äŒŒãŠããã
éããæ¥œã ã仿¥ã®ã¿ã¹ã¯ã¯æžãã
ãã®ä»£ããããã€è§£åããããæ±ºããŠããªããšã誰ãã®æŒäžãããå£ããã
å€ããŠãããããŒã¿ãšã å€ããŠã¯ãããªãããŒã¿
ãã£ãã·ã¥ã®æ¬è³ªã¯ãæ£ãããä¿åããããšãããªãã
å€ããããããããèš±ãããšã«è¿ãã
ããã³ãŒãå²åŠãšãã»ã€ãå ¬é API ã¯æ©èœãããªãçŽæã®çªã ãã§æžããããã«ãå€ã«æž¡ããã®ã«ã¯çŽæãããã
ãã£ãã·ã¥ã«ããåãæ§é ãããã
ãã®ããŒã¿ã¯ããã€ãŸã§å€ããŠãããã
å€ããªã£ããšãã誰ãå°ããã
æ°ããããææ®µã¯ãäœãã
äžã€ç®ãæãããšãTTL ã¯æ°åã®é£Ÿãã«ãªãã
max-age=31536000 ãæžããç¬éãäžå¹Žåã®åŠ¥åã誰ã«ãèããã«çœ²åããããšã«ãªãã
åã倱æããã®ã¯ãéãã®ããã«é®®åºŠãåŸåãã«ããããšã
劥åãå
ã«æ±ºãããçµæã ãåããããšã ã
ãã£ãã·ã¥ãè¶³ãåã«åã眮ãäžã€ã®åã
Redis ã®è¡ãæžãåã«ãHTTP ããããè¶³ãåã«ãåã¯äžã€ã ãåããŸãã
ãã®ããŒã¿ã¯ãäœç§å€ããŠããããã
å€ããªã£ããšãã誰ãæåã«æ°ã¥ããã
æŽæ°ããç¬éã«ãã©ããã£ãŠå€ãç®±ã空ã«ãããã
çããã¯ã£ããããªããªãããã£ãã·ã¥ã¯æ©ãã®ãããããªãã
ãŸã è¶³ããªãã
ã¯ãšãªãçŽãã
玢åŒã匵ãã
ãããç«æŽŸãªæé©åã ã
çãããããªããååãšæéãã»ããã§æ®ãã
ã³ã¡ã³ãäžè¡ã§ããã
ãäžèЧçšã5 åå€ããŠãããèšäºæŽæ°æã«ããŒåé€ã
// 鮮床ã®åŠ¥å: 5 åãŸã§å€ããŠãããæŽæ°æã¯ invalidate ãã
const CACHE_TTL_SECONDS = 60 * 5;
async function getArticleList() {
const cached = await redis.get('articles:list');
if (cached) return JSON.parse(cached);
const fresh = await db.article.findMany();
await redis.set('articles:list', JSON.stringify(fresh), 'EX', CACHE_TTL_SECONDS);
return fresh;
}EX ã®åã«ã誰ã®ããã® 300 ç§ããæžãã
ããã ãã§ãéæ³ã¯åŠ¥åã«è¿ã¥ãã
ç¡å¹åãå¿ãããšãã ç®±ã¯å庫ã«ãªã
ãã£ãã·ã¥ã®ä»äºã¯ãéãè¿ãããšã§çµãããªãã
å€ãç®±ããã¡ãããšç©ºã«ããããšã§æãç«ã€ã
èšäºãæŽæ°ããã
ç»åãå·®ãæ¿ããã
åšåº«ãæžãããã
ãã®ç¬éã«ããŒãæ¶ãã
CDN ã«ããŒãžãé£ã°ãã
Cache-Control: no-cache ããæ¬åœã«å¿
èŠãªå Žæã ãã«çœ®ãã
ããã§æãæããšããŸãå庫ãã§ããã
ããã€ãèªç¶ã«åããããã
ãæåãªããŒãããã°ããã
æåãªããŒããèŠæ±ããèšèšã¯ãçžæã®æéãé ãã£ãŠããã®ã«è¿ããŠããªãã
ããã³ãŒãå²åŠãšãã»ã€ãèšå®å€ã¯é ãå Žæãããªãå¢çã ãã§æžããã責任ã®åãæ¹ãšåãæž©åºŠã ã
éããåãããªãã鮮床ã®è¿æžèšç»ãã»ããã§æžãã
ããããéæ³ãšèšèšã®å¢ç®ã ãšæãã
å šéšéãããããšããŠããé ã®èªåãž
æ£çŽã«èšããšãé®®åºŠãæ±ºããäœæ¥ã¯é
ãã
ãšãããããã£ãã·ã¥ã¯ã仿¥ã®ã¿ã¹ã¯ããæ¶ããã
äŒè°ã§ããæ°åã¯ãããã«èŠããã
ããã§ããå¢çãé£ã°ãããšãã®ä»£åã¯ãã ãããä»äººã®æŒäžããã«ãã£ãŠããã
èªåã®ç»é¢ãªãã匷å¶ãªããŒãã§æžãã
ã¯ã©ã€ã¢ã³ãã®æ
åœè
ã¯ãåã®é ã®ãªãã«ã¯ããªãã
圌ãã«ãšã£ãŠãå€ããããŒã¯çªç¶ã®å€©æ°ã®å€åã ã
æŽããã®ããæã£ãã®ãã説æããªããã°åãããªãã
ããã³ãŒãå²åŠãšãã»ã€ãæ©èœãã©ã°ã¯éãéãããªããã§æžãããæéã®ãªãã¹ã€ããã
ãã£ãã·ã¥ã«ããæéã®ãªãç®±ãããã
ã©ã¡ãããæªæ¥ã®èªåãè¿·åã«ããã
äžæã®ãšãã£ã¿ã®åã§
äžåæã«å
¥ããè§Šããªããã®ãäžã€æ±ºããé±ããã£ãã
ãã®ãšããåã¯ããäžã€ãææŸããããªãè¡åã«æ°ã¥ãã
ãå šéšããã£ãã·ã¥ããã°ããã
ââäžæã®ç©ºæ°ã¯ãããåãã
ãã®ãšããæã®èªåã«å£°ããããŸãã
ãããã¯éãã®éæ³ãããããšãã鮮床ã®åŠ¥åãã
åŸè
ãªããå€ããŠãããç§æ°ãšã空ã«ããæé ãã»ããã§è¶³ãã
åè
ã«èŠãããããŸã ã¯ãšãªã®ã»ããèŠãã
ãã£ãã·ã¥ã¯ãæ£ãããè€è£œããè£
眮ãããªãã
å€ããéžãã§ãéããšåŒãæãã亀æžã ã
åãããã«ãTTL ãæ±ºããã« Redis ãè¶³ããŠããŸã£ã誰ãã«å±ãã°ããããã§ãã
ã²ãšãããš
éããªã£ãæ°åã ããèŠãŠããé ããã£ãã
鮮床ã®ç·ãåŒããªãã£ãèªåãžãããŸã¯å°ãã ãå³ãããªããã
äžæã®æŒäžãããå€ããããŒãå ±åããäžè¡ã¯ããŸã å±ãã
ããã§ããç§æ°ãšç¡å¹åãã»ããã§æžããæ¥ããå°ããã€å¢ããŠããã

ããããŠèªã¿ãã
⌠éãã®è©±ã®ãé£ã®æ£ãšããŠ
ãã£ãã·ã¥ãå¹ãããããŠäœéšãå£ããããšããäžæãããã
ä»åã®é®®åºŠã®è©±ã¯ããã®ç¶ããšããŠèªããŸãã
⌠å€ã«æž¡ãçŽæãšããŠã®ããŒã¿
äžæã®ã³ãŒãå²åŠãšãã»ã€ã®æµãã
ãã£ãã·ã¥ã«ããçŽæã®çªãšåãæ§é ããããŸãã
⌠責任ãåãæ¿ããç·ã®åŒãæ¹ãšããŠ
TTL ãç¡å¹åããå¢çã®äžçš®ã§ãã
次ã®äžæ©ãäžç·ã«æ±ºããäœæŠäŒè°å®€ãž
ãã£ãã·ã¥ã®ä»ãæ¹ãã鮮床ã®ç·ã®åŒãæ¹ã
äžäººã§æ±ãããšãéãã®æ°åã ããåã¡ãããã
äœæŠäŒè°å®€ã§ã¯ãçŸå Žã§äœ¿ããåãæ¹ãå°ããåãåããå Žæã«ãããã§ãã
å€ããŠãããç§æ°ãäžç·ã«æ±ºãããæ¹ã¯ãã®ãããŠã¿ãŠãã ããã
ãnote 質åç®±ãâ» æ°æ©èœ
ãèããããã©ãèããªãã
ãããã質åã»ã©ã
å®ã¯èª°ãã®åœ¹ã«ç«ã€ã
note質åç®±ã
éããŸããã
ããªãŒã©ã³ã¹ 15 幎ç®ã®ãšã³ãžãã¢ã«
ãªãã§ãèããŠã¿ãŠãã ãã ð®
ðïž ãã©ãã¯ãŒéå®
ïŒåŸã ãã¡ã³ããŒã·ããã®ã¿ã«ãªãäºå®ïŒ
https://note.com/qa/digiangler777
Substack ã¯ãããŸãã
ãããŸã§èªãã§ãã ãããããããšãããããŸããã
X ã§ã¯çãèšèã§ãnote ã§ã¯æŽçããæç« ã§çºä¿¡ããŠããŸãããSubstack ã§ã¯ããã£ãšéäžçµéã®æèãåããããªãã£ãèè€ãæè¡è ãšããŠæ¥ã èããŠããããšãæžããŠããŸãã
ããèå³ãããã°ãèŠããŠã¿ãŠãã ããã
äŒç€Ÿå¡ïŒå
ã·ã¹ãã ãšã³ãžãã¢ïŒããããªãŒã©ã³ã¹ãšãªãã
15 幎ç®ã«çªå
¥ããŸããã
çŽæãšé害察å¿ã«è¿œãããæ¯æ¥ã®äžã§ã
ããã£ãšèªç±ã«ããã£ãšæ¬è³ªçã«ãã®ã¥ããããããã
ããæã£ãã®ãç¬ç«ã®ãã£ããã§ãã
çŸåšã¯ãæè¡ãšæç« ã軞ã«ã
ä»äºãã©ã¯ã«ãªãä»çµã¿ãç¶ããããåãæ¹ãçºä¿¡ããŠããŸãã
ãããªãŒã©ã³ã¹ã«ãªã£ãŠ15幎ç®çªå ¥ã
â ãããšãïœããªãŒã©ã³ã¹éçºè à ã¹ããŒãªãŒãã©ãŒ (@digiangler) March 3, 2026
14幎ãšããææ¥ã¯é·ãããã§ã
ãã£ãšããéã ã£ãã
æåãããšèšããã»ã©ã®æŽŸæãã¯ãªãããã©ã
仿¥ãŸã§ãšã³ãžãã¢ãšããŠã飯ãé£ã¹ã
æ°ããã³ãŒããæžããŠããã
ããã ãã§åå幞ããªããšãªãã ãšæãã
ææ¥ã¯ææ¥ã§ããŸãæ·¡ã ãšãâŠ