最近、Redisを学んでみたので、基本操作やよく使うデータ構造ごとのコマンドをまとめてみました。
Macでのインストールから、リスト・セット・ハッシュ操作までざっくり解説します。
Redisのインストール(Macの場合)
# Homebrewでインストール
brew install redis
# サーバー起動
redis-server
# Redis専用のターミナルに接続
redis-cli
基本操作
1.データの登録
SET <キー> <値>
2.データの取得
GET <キー> <値>
3.データの削除
DEL <キー> <値>
4.キーの存在確認
EXISTS <キー> <値>
5.キー一覧の取得
KEYS <パターン>
6.キーの有効期限を設定
EXPIRE <キー> <秒数>
7.TTL(残り有効時間)確認
TTL <キー>
8.登録と同時に有効期限を設定
SETEX <キー> <秒数> <値>
リスト型(List)の操作
Redisのリストは配列のように扱え、スタックやキューとしても利用可能です。
1.LRANGE — リストの中身を確認
LRANGE friends 0 -1
2.LPUSH — 先頭に要素を追加
LPUSH friends sally
3.LPOP — 先頭から要素を取り出す
LPOP friends
4.RPOP — 末尾から要素を取り出す
RPOP friends
セット型(Set)の操作
セットは重複を許さず、順序を持たないコレクションです。
1.SADD — セットに要素を追加
SADD hobbies "weight lifting"
2.SMEMBERS — セットの全要素を取得
SMEMBERS hobbies
3.SREM — セットから要素を削除
SREM hobbies "weight lifting"
ハッシュ型(Hash)の操作
ハッシュはキーとフィールド、値の組み合わせでデータを管理します。
- フィールドに値をセット
HSET <キー> <フィールド> <値>
- フィールドの値を取得
HGET <キー> <フィールド>
- 全フィールドと値を取得
HGETALL <キー>
- フィールドの削除
HDEL <キー> <フィールド>
- フィールドの存在確認
HEXISTS <キー> <フィールド>
活用事例「Node.js + Expressで作るAPIにRedisキャッシュを追加して高速化
1. はじめに
- Node.jsでAPIを作るとき、外部APIやDBに毎回アクセスすると時間がかかる
- そこで Redisをキャッシュとして利用 することで高速化できる
- この記事では「修正前の単純API」と「Redisキャッシュ追加後のAPI」を比較して解説
2. 修正前のコード
const express = require("express");
const axios = require("axios");
const cors = require("cors");
const app = express();
app.use(cors());
app.get("/photos", async (req, res) => {
const albumId = req.query.albumId;
const { data } = await axios.get(
"https://jsonplaceholder.typicode.com/photos",
{ params: { albumId } }
);
res.json(data);
});
app.get("/photos/:id", async (req, res) => {
const { data } = await axios.get(
`https://jsonplaceholder.typicode.com/photos/${req.params.id}`
);
res.json(data);
});
app.listen(3000);
修正前の特徴
- 外部APIを毎回呼び出す
- /photos にアクセスするたびに遅くなる可能性がある
- /photos/:id は単純にAPIを返すだけ
- キャッシュなし
3. 修正後のコード(Redis追加)
const express = require("express");
const axios = require("axios");
const cors = require("cors");
const Redis = require("redis");
const redisClient = Redis.createClient();
redisClient.connect();
const DEFAULT_EXPIRATION = 3600;
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(cors());
app.get("/photos", async (req, res) => {
const albumId = req.query.albumId;
try {
const cachedPhotos = await redisClient.get("photos");
if (cachedPhotos) {
return res.json(JSON.parse(cachedPhotos));
}
const { data } = await axios.get(
"https://jsonplaceholder.typicode.com/photos",
{ params: { albumId } }
);
await redisClient.setEx("photos", DEFAULT_EXPIRATION, JSON.stringify(data));
res.json(data);
} catch (error) {
console.error(error);
res.status(500).send("Server Error");
}
});
app.get("/photos/:id", async (req, res) => {
try {
const { data } = await axios.get(
`https://jsonplaceholder.typicode.com/photos/${req.params.id}`
);
res.json(data);
} catch (error) {
console.error(error);
res.status(500).send("Server Error");
}
});
app.listen(3000, () => {
console.log("Server running on http://localhost:3000");
});
4. 修正後のポイント
1. Redisを使ったキャッシュ
- redisClient.get("photos") で既存データを確認
- 既にあれば即返す → 高速化
2.データ保存
- setEx("photos", 3600, JSON.stringify(data)) で1時間キャッシュ
3. 外部API呼び出し回数を減らせる
- 高頻度アクセスに最適
4. /photos/:id はキャッシュなし(単純取得のみ)
5. 修正前と修正後の違い
| 項目 | 修正前 | 修正後 |
|---|---|---|
| 外部APIアクセス | 毎回実行 | キャッシュにあればスキップ |
| 処理速度 | 遅くなる可能性あり | 同じデータは即返すので高速 |
| Redis | なし | あり(キャッシュ) |
| データ永続性 | なし | Redisで1時間だけ保持 |
| コード複雑度 | 簡単 | 少し増えるがパフォーマンス向上 |
6. まとめ
- Redisを使うとAPIレスポンスを高速化できる
- キャッシュを使う場合は「データの有効期限」を設定して古いデータを自動削除
- 高頻度アクセスされるAPIやDB負荷が高い処理に最適