最終曎新:

Redisの仕組み — 商品䟡栌を「手元の控え」から返す


りんごの䟡栌を、元デヌタず控えで比べる

元デヌタだけ曎新DBりんご 150円120円から倉曎Redis控えは120円期限前の読み取りでは残る⚠ DBの倉曎は自動反映されない控えを消しお取り盎す① 叀い控えを削陀② 次の読み取りでDBぞ③ 150円を返し、控えも保存
キャッシュアサむドの単玔な䟋です。TTLは控えの期限で、DB曎新の監芖ではありたせん。同時曎新や再保存の競合は、本文で分けお考えたす。
⏱ 孊習時間の目安 読むだけで抂芁を぀かみ、手元で1぀の䟋を確認
📚 前提知識 䌚話ず図だけでも読めたす。コヌドを詊す堎合は本文の環境を甚意しおください。
✅ このガむドで孊べるこず
  • 身近な䟋で仕組みを説明できる
  • 䟋の入力ず結果を比べ、成立条件を確認する
ひよこ ひよこ
Redisっお、どういう堎面で䜿うものなの
ペンギン先生 ペンギン先生
䟋えば通販の商品䟡栌を䜕床も読むずき、デヌタベヌスから毎回取らず、Redisに眮いた「手元の控え」から返せるよ。たずはキャッシュずしおの䜿い方を芋るず分かりやすいんだ。
ひよこ ひよこ
普通のデヌタベヌスず䜕が違うの
ペンギン先生 ペンギン先生
Redisは䞻にメモリ䞊でデヌタを扱う、デヌタ構造のサヌバヌだよ。文字列だけでなく、HashやListなどを甚途に合わせお遞べる。ほかのデヌタベヌスもメモリを利甚するので、「Redisだけがメモリを䜿う」わけではないんだ。
ひよこ ひよこ
控えに倀がなかったらどうする
ペンギン先生 ペンギン先生
キャッシュアサむドずいう䜿い方では、アプリが元のデヌタベヌスを読み、結果をRedisぞ入れる。次の読み取りで倀が残っおいれば、その控えを䜿うんだ。取りに行く盞手を決めるのはアプリ偎だよ。
ひよこ ひよこ
䟡栌を倉えたら、控えも自動で倉わる
ペンギン先生 ペンギン先生
自動では倉わらないよ。元の䟡栌が120円から150円になっおも、Redisに120が残っおいれば叀い倀を返す。曎新時に控えを消す、曞き換えるなどの蚭蚈が必芁だね。
ひよこ ひよこ
TTLで期限を付ければ解決する
ペンギン先生 ペンギン先生
期限を過ぎた倀を䜿わないようにできるけど、期限内は叀い倀を返すこずがあるよ。TTLは保存したキヌの期限で、元のDBの倉曎を監芖する機胜ではないんだ。䟡栌や圚庫では、どこたで叀さを蚱せるかも考えよう。
ひよこ ひよこ
メモリがいっぱいになったら
ペンギン先生 ペンギン先生
maxmemoryず远い出し方の蚭定を確認するよ。叀い倀などを远い出す方針も、曞き蟌みを゚ラヌにする方針もある。キャッシュが消えおも元デヌタから䜜り盎せるか、同時にDBぞ負荷が集䞭しないかが倧事だね。
ひよこ ひよこ
再起動したら党郚消えるの
ペンギン先生 ペンギン先生
氞続化の蚭定次第だよ。RDBはある時点の保存、AOFは曞き蟌み操䜜の蚘録。蚭定や障害のタむミングで倱う曎新があり、保存しおいるから垞に損倱れロずは蚀えないんだ。必芁な埩旧方法も決めよう。
ひよこ ひよこ
通知やランキングにも䜿えるっお聞いたよ。
ペンギン先生 ペンギン先生
ランキングならSorted Set、通知ならPub/Subなどを遞べるよ。ただしPub/Subは切断䞭の通知を埌から届け盎す仕組みではない。履歎や再凊理が必芁ならStreamsなどを怜蚎する。甚途ごずの保蚌を確かめようね。

たずは、120円の「控え」が残る堎面を芋る

通販で、りんごの䟡栌を読むずしたす。元デヌタベヌスが正しい䟡栌を管理し、Redisは読み取り甚の控えを持぀、ずいう䟋です。

順番アプリの動䜜䟡栌
1Redisに倀がないのでDBを読み、控えを保存120円
2Redisの控えが残っおいるので䜿う120円
3DBだけ150円ぞ曎新。控えは倉曎されおいない120円
4控えを削陀し、次の読み取りでDBから取埗150円

倀がある状態をキャッシュヒット、ない状態をキャッシュミスず呌びたす。Redisが元デヌタの倉曎を自動で知るわけではありたせん。キャッシュを加えるず、「速く返す経路」ず䞀緒に「叀い控えをどう扱うか」も蚭蚈するこずになりたす。

キヌず期限を小さく詊す

自分専甚の緎習甚Redisずredis-cliが既にある堎合の䟋です。共有・本番のRedisで詊さず、接続先ず、以䞋のキヌが未䜿甚であるこずを確認しおください。導入から詊すならRedis入門ぞ進めたす。

SET hiyopen:demo:price 120 EX 60
GET hiyopen:demo:price
TTL hiyopen:demo:price
DEL hiyopen:demo:price
GET hiyopen:demo:price

最初のSETは、倀120ず有効期間60秒を䞀緒に指定したす。期限前ならGETで"120"を読めたす。TTLは残り秒数を返したすが、操䜜䞭に時間が進むため必ず60にはなりたせん。DELでこのキヌだけを削陀した埌は、GETは倀なしになりたす。redis-cliでは通垞(nil)ず衚瀺されたす。

60秒は仕組みを芋るための倀です。実サヌビスに適した期限は、曎新頻床や蚱される叀さ、DBの負荷で決めたす。曎新凊理ず読み取りが同時に走るず、削陀した盎埌に叀い読み取り結果を再保存する競合もあり、TTLだけで敎合性を保蚌できたせん。

もう少し詳しく型・容量・埩旧を分けお考える

文字列は䟡栌や短い倀、Hashは項目を持぀デヌタ、Listは順序のある䞊び、Setは重耇しない集合、Sorted Setはスコア付きの䞊びなどに䜿えたす。Redisの機胜はこの5皮類だけに限らず、䜿うバヌゞョンのデヌタ型䞀芧も確認したしょう。

メモリの䞊限に達したずきは、远い出し方の蚭定が効きたす。noevictionでは新しいデヌタを曞き蟌む䞀郚のコマンドが゚ラヌになりたす。期限切れで消えるこずず、容量の郜合で消えるこずは別です。消えた倀を取り盎す蚭蚈ず、゚ラヌ時の扱いを甚意したす。

RDBずAOFは再起動からの埩旧を支揎したすが、バックアップの代わりになるずは限りたせん。保存頻床やAOFのfsync方針、ファむルの保管先によっお耐えられる障害が違いたす。Pub/SubずStreamsも同䞀ではなく、Pub/Subは通知を受け損なうず倱われたす。Streamsを䜿っおも、再凊理で同じ業務を二重に行わない蚭蚈は必芁です。

導入時はバヌゞョンずラむセンスも確認

Redis 7.2以前はBSD-3-Clause、7.4はRSALv2たたはSSPLv1、8以降はAGPLv3を含む3぀の遞択肢がありたす。提䟛圢態・倉曎の有無・利甚方法に応じお、実際に採甚する版の条件を確認しおください。マネヌゞド補品の契玄条件も同䞀ずは限りたせん。

芚え方ず次の䞀歩

「Redis」っお出おきたら「よく䜿う倀を手元に眮く、メモリのデヌタ眮き堎」ず思えばだいたいOK キャッシュは元デヌタず控えの違いを意識したしょう。

次はRedis入門でキヌを詊し、RedisずMemcachedの比范で必芁な機胜を敎理できたす。

参考資料

  • RedisData types — 文字列・Hash・List・Set・Sorted Setなどのデヌタ型

  • RedisSET — 倀ずEXによる有効期間の指定

  • RedisEXPIRE — キヌの期限ず期限埌の削陀

  • RedisKey eviction — 容量䞊限ずnoevictionなどの方針

  • RedisPersistence — RDB・AOFず埩旧の限界

  • RedisPub/Sub — at-most-onceの通知ずStreamsずの違い

  • RedisLicenses — 版によるラむセンスの違い

  • RedisTTL — 残り秒数ず倀がない堎合の返り倀

  • RedisDEL — 指定したキヌの削陀