Node.jsでredisを利用するにあたり、いいライブラリを探していたところ、ioredisがよさそうだったので実際に使ってみました!
環境
今回実施した環境は以下の通りです。
- Windows 10 Pro 64bit
- Node.js 14.16.0
- ioredis 4.23.0
※RedisはDockerコンテナで動作させます。
実際に動かしてみる
準備
npmでioredisをインストールします。
npm install ioredis
Redisへの接続
ioredisではnewすることで接続できます。
引数にはRedisの接続設定を渡します。
const Redis = require("ioredis");
const config = {
host: "localhost",
port: 6379
}
const client = new Redis(config); // 接続
※接続時のオプションはいろいろなものがあります。もっと知りたい方は以下のURLを参考にしてください。
https://github.com/luin/ioredis/blob/master/API.md#new_Redis
Redisの操作
ioredisではコマンド名と同じメソッドが用意されています。
ここでは代表的なものを試してみました。
※値を取得するメソッドは非同期なので、awaitなどの実装をする必要があります。
// set
client.set("testKey", "aaa");
// get
var value = await client.get("testKey") // return "aaa"
// Setを追加
client.sadd("setKey","111");
client.sadd("setKey","222");
client.sadd("setKey","333");
// Setを全取得
var values = await client.smembers("setKey"); // return ["111","222","333"]
Redisからの切断
以下のメソッドを実行すればRedisから切断できます。
client.disconnect();
応用編
ログ出力
接続・切断時やワーニング・エラー時のログを出す場合は以下のようにします。
client.on("connect", () => { // 接続時
console.log("Redis connected.");
});
client.on("end", () => { // 切断時
console.log("Redis disconnected.");
});
client.on("warning", (warning) => { // ワーニング
console.log(warning);
});
client.on("error", (error) => { // エラー
console.log(error);
});
※上記以外にも補足できるイベントがあります。
参考URL:https://github.com/NodeRedis/node-redis#connection-and-other-events
Pub/Sub
それぞれ、publish, subscribeメソッドが用意されています。
publish
// channel1にpublish
client.publish("channel1", "hello");
subscribe
subscribe時のメッセージ受信時の処理はmessageイベントに関数を登録することで実現します。
// subscribe 複数チャンネルの指定が可能
client.subscribe("channel1", "channel2", (err, count) => {
if (err) {
console.error("Subscribeに失敗しました: %s", err.message);
} else {
console.log("Subscribeに成功しました.現在${count}チャンネルにsubscribeしています);
}
};
// 受信時
client.on("message", (channel, message) => {
console.log(${channel}からメッセージを受信しました:${message});
});
luaスクリプト実行
ioredisではluaスクリプトをコード上に定義し、実行することができます。
// luaスクリプトを定義
const luaScript = `
local key1 = KEYS[1]
local key2 = KEYS[2]
local value1 = ARGV[1]
local value2 = ARGV[2]
redis.call('set', key1, value1)
redis.call('set', key2, value2)
return 1
`;
// luaスクリプトをコマンドとして定義
client.defineCommand("executeLua", {
numberOfKeys: 2,
lua: luaScript
});
// 実行
/*
defineCommandの第一引数がメソッド名になる
引数はluaのKEYSとARGVに渡される。
defineCommandのnumberOfKeysで指定したキーの数以降の引数はARGVとして扱われる
*/
var result = await client.executeLua("testKey1", "testKey2", "aaa", "bbb");
redisにスクリプトを登録しなくてもいいので、コード管理も楽ですね(^ ^)
上記ソースにも記載していますが、lua上でredisコマンドを実行する際はredis.callを利用します。
まとめ
今回紹介したioredisは直感的に使いやすいライブラリで、初めてredisを触る人にもオススメです!
使っている人も多いようで、検索するといろいろなナレッジが見つかります。
わからない点があっても解決しやすいのもメリットですね。(ただし、英語が多いですが・・・)
興味のある方はぜひ触ってみてください(^ ^)












Redisの操作
のコード、一律で「redis.」になってますが、「client.」ではと
// set
redis.set(“testKey”, “aaa”);
ご指摘ありがとうございます!
確かに間違ってますね・・・修正しました!