こんにちは、かつコーチです。
前回の記事で、RedisがインメモリKVS(メモリ上でキーと値のペアを管理する仕組み)であることを解説しました。
今回は実際に手を動かして、Redis 7.x系をインストールし、基本コマンドであるGET・SET・EXPIREを使ってみます。
「習うより慣れろ」で、まずはコマンドを叩きながらRedisの感覚を掴んでいきましょう。
Redisのインストール方法
Dockerを使ったインストール(推奨)
ローカル環境を汚さずに試すなら、Dockerを使うのが最も手軽です。
# Redis 7.x系の公式イメージを取得して起動
docker run --name my-redis -p 6379:6379 -d redis:7
# コンテナが起動しているか確認
docker ps
起動が確認できたら、コンテナ内のredis-cli(Redisに付属する対話型コマンドラインツール)に接続します。
docker exec -it my-redis redis-cli
127.0.0.1:6379>というプロンプトが表示されれば接続成功です。
macOSでHomebrewを使う場合
Dockerを使わずローカルに直接インストールしたい場合は、Homebrewが便利です。
# Redisをインストール
brew install redis
# バージョンを確認(7.x系であることを確認)
redis-server --version
# バックグラウンドサービスとして起動
brew services start redis
# redis-cliで接続
redis-cli
Ubuntu/Debian系での導入
サーバー環境でよく使われるUbuntu系では、aptでインストールできます。
sudo apt update
sudo apt install redis-server
# バージョン確認
redis-server --version
# 起動状態を確認
sudo systemctl status redis-server
いずれの方法でも、最後にredis-cliで接続できることを確認してから次に進んでください。
基本コマンドを使ってみる
SETとGET:値の保存と取得
Redisの最も基本的な操作が、値を保存するSETと、値を取得するGETです。
# キー "user:1:name" に値 "katsu" を保存する
127.0.0.1:6379> SET user:1:name "katsu"
OK
# キーを指定して値を取得する
127.0.0.1:6379> GET user:1:name
"katsu"
# 存在しないキーを取得すると nil が返る
127.0.0.1:6379> GET user:1:age
(nil)
MySQLでいえば、SETがINSERTやUPDATE、GETがSELECTに近い役割です。
ただしRedisには「テーブル」の概念がないため、user:1:nameのようにコロン区切りでキーに名前空間を持たせるのが慣習になっています。
キーの存在確認と削除
キーが存在するかどうかはEXISTS、削除にはDELを使います。
# キーの存在確認(1なら存在、0なら存在しない)
127.0.0.1:6379> EXISTS user:1:name
(integer) 1
# キーを削除する
127.0.0.1:6379> DEL user:1:name
(integer) 1
# 削除後は存在しないので0が返る
127.0.0.1:6379> EXISTS user:1:name
(integer) 0
DELは成功すると削除した件数を返します。
複数のキーをまとめてDEL key1 key2 key3のように指定することも可能です。
EXPIRE:キーに有効期限を設定する
Redisをキャッシュとして使う上で欠かせないのがTTL(Time To Live、キーの有効期限)の設定です。
EXPIREコマンドで、既存のキーに有効期限(秒単位)を設定できます。
# キーを作成
127.0.0.1:6379> SET session:abc123 "user_id=1"
OK
# 60秒後に自動削除されるよう設定
127.0.0.1:6379> EXPIRE session:abc123 60
(integer) 1
# 残り有効期限を確認(秒単位)
127.0.0.1:6379> TTL session:abc123
(integer) 55
# 60秒経過後に取得すると、キーごと消えている
127.0.0.1:6379> GET session:abc123
(nil)
TTLコマンドは残り秒数を返しますが、有効期限が設定されていないキーに対して実行すると-1、存在しないキーに対して実行すると-2が返ります。
私が初めてこの挙動を確認したとき、TTLが-1を返すキーがあり「期限切れのバグでは」と一瞬疑いましたが、実際は単にEXPIREを設定し忘れていただけでした。
-1と-2の違いを知らないと、こうした勘違いにつながるので覚えておいてください。
SETコマンドでTTLを同時指定する(EX / PX オプション)
SETのあとにEXPIREを毎回呼ぶのは手間なので、実務ではSETコマンドのEXオプションでTTLを同時に指定するのが一般的です。
# SET と同時に、有効期限(秒)を指定する
127.0.0.1:6379> SET session:xyz789 "user_id=2" EX 3600
OK
# ミリ秒単位で指定したい場合は PX を使う
127.0.0.1:6379> SET cache:temp "value" PX 500
OK
EX 3600は3600秒(1時間)、PX 500は500ミリ秒を意味します。
キャッシュやセッションを扱う際は、キーを作る瞬間に必ずTTLをセットする習慣をつけておくと、有効期限の設定漏れによる「消えるはずのデータが消えない」というトラブルを防げます。
つまずきやすいポイント
❌ Before:TTLを設定せずに永続化してしまう
# TTLを指定せずにSETすると、そのキーは永久に残り続ける
127.0.0.1:6379> SET temp:calculation:result "42"
OK
127.0.0.1:6379> TTL temp:calculation:result
(integer) -1
一時的な計算結果のつもりで保存したキーにTTLを設定し忘れると、Redisのメモリを圧迫し続ける原因になります。
私も検証環境で、TTLを設定し忘れたキーが数万件溜まっていて、INFO memoryコマンドで確認したメモリ使用量が想定より大きく膨らんでいたことがありました。
✅ After:一時データには必ずTTLを設定する
# 一時的なデータには必ずEXオプションでTTLを設定する
127.0.0.1:6379> SET temp:calculation:result "42" EX 300
OK
127.0.0.1:6379> TTL temp:calculation:result
(integer) 300
「このキーは永続化すべきデータか、それとも一時データか」を保存する瞬間に判断し、一時データであれば必ずTTLを設定する。
この習慣が、Redisのメモリ管理におけるトラブルを未然に防ぐ基本の考え方です。
まとめ
この記事のポイント
- Redis 7.x系はDocker・Homebrew・aptなど複数の方法で手軽にインストールできる
SET/GETが基本の値の保存・取得、DEL/EXISTSでキーの削除・存在確認ができるEXPIREまたはSETのEX/PXオプションでTTL(有効期限)を設定できるTTLコマンドの戻り値は、-1が期限未設定、-2が存在しないキーを意味する- 一時データには保存の瞬間に必ずTTLを設定する習慣をつける
次に読むべき記事
- Redisとは?インメモリKVSを初心者向けに解説
- Redisのデータ構造(List・Hash・Set・Sorted Set)の使い分け
- Redisをキャッシュとして使う:TTL戦略の基本
タグ: Redis, 初心者向け, 基本操作