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”);
ご指摘ありがとうございます!
確かに間違ってますね・・・修正しました!