redis を、セッションを保存したりといった用途に使うということは分かった。
でも、redis って何だ?どう使うのか試しました。
目次
実行環境
環境構築 - Windows -
Releases - microsoftarchive / redisにてインストーラを取得。
以下の以下の画面が出るので「Next」を順に押していきます。
「Install」を押します。
インストールした時点で、実行されます。
環境構築 - Mac -
以下のコマンドで、インストールを実施。
1 2 3 4
| brew install redis # インストール完了まで待つ # 以下コマンドで開始 resis-server
|
コールバック関数で利用
実装 1
今回は、npm - redisを用いて redis を使ってみます。
サンプルを参考に、データ登録とデータの取得のプログラムを別で用意します。
data-set.js1 2 3 4 5 6 7 8 9 10 11
| const redis = require("redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
client.set("key", "value", (err, res) => { console.log(res); client.end(true); });
|
data-get.js1 2 3 4 5 6 7 8 9 10 11
| const redis = require("redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
client.get("key", (err, res) => { console.log(res); client.end(true); });
|
確認 1
1 2 3 4 5 6 7 8
| node data-set.js =>OK
node data-get.js =>value
|
set 関数で登録した文字列value
を get 関数で取得できました。
client.flushall()
を記述することで、すべての登録データを消すこともできました。
コールバック関数で処理は、避けたいので別の node パッケージを探しました。
async await で実装
実装 2
npm - async-redisを使ってみます。
今回も、データ登録とデータの取得のプログラムを別で用意します。
data-set-async.js1 2 3 4 5 6 7 8 9 10 11
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.set("key", "value2"); await client.end(true); })();
|
data-get-async.js1 2 3 4 5 6 7 8 9 10 11 12
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { const value = await client.get("key"); console.log(value); await client.end(true); })();
|
確認 2
1 2 3 4 5 6 7 8
| node data-set-async.js =>OK
node data-get-async.js =>value2
|
同期的な記述で redis にアクセスできました。
コマンドラインで確認
redis へのアクセスは、パッケージを介さずともできます。
以下のコマンドで直接アクセスしてみます。
1 2 3 4 5 6 7 8 9 10
| redis-cli
127.0.0.1:6379>get key2 (nil) 127.0.0.1:6379>set key2 value OK 127.0.0.1:6379>get key2 "value" 127.0.0.1:6379>quit
|
そのほか機能
redis-cli のコマンドについて、qiita - redis-cli コマンド操作まとめを調べていました。
npm では確認できなかったset,get
以外にsetnx,setex,psetex,ttl,mset,msetnx,mget,strlen,keys
等々を見つけました。
こちらが Node.js から扱えるのか確認します。
以降、データの設定と取得を 1 つのファイルで行います。
実装 - setnx - 上書き禁止
data-async-nx.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.setnx("key", "value0"); await client.setnx("key", "value1"); await client.setnx("key", "value2"); const value = await client.get("key"); console.log(value); await client.end(true); })();
|
確認 - setnx - 上書き禁止
以下のコマンドで実行。
1 2
| node data-async-nx.js =>value0
|
後からキーkey
に対して上書きした値ではなく、最初に設定した value0 が取得されています。
実装 - setex - 有効期限
data-async-ex.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.setex("key", 10, "value"); while (true) { const value = await client.get("key"); const ttl = await client.ttl("key"); console.log(`${value}:${ttl}`); if (value != "value") { break; } } await client.end(true); })();
|
確認 - setex - 有効期限
以下のコマンドで実行。
1 2 3 4 5 6 7
| node data-async-ex.js =>value:10 =>value:10 =>value:10 =>value:10 ~~省略~~ =>null:-2
|
キーkey
に対して設定したvalue
を 10 秒間維持するようにclient.setex("key", 10, "value");
を記述しました。
ttl
で残り有効時間を秒単位で取得できます。
取得した値がvalue
ではなくなるとループから抜けます。
有効期限が設定できていることがわかりました。
実装 - mset,mget - 複数設定・取得
data-async-mset-mget.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.mset("key0", "value0", "key1", "value1"); const value0 = await client.get("key0"); const value1 = await client.get("key1"); console.log(value0); console.log(value1);
const values = await client.mget("key0", "key1"); console.log(values); await client.end(true); })();
|
確認 - mset,mget - 複数設定・取得
以下のコマンドで実行。
1 2 3 4
| node data-async-mset-mget.js =>value0 =>value1 =>[ 'value0', 'value1' ]
|
mset
を使うことで、まとめて設定できました。
値の取得は、個別にget
してもmget
でも可能です。
mget
の場合は配列として取得できます。
mset は次のような 2×X 個の 1 次元配列で引数の渡し方ができました。
1
| client.mset(["key3", "value3", "key4", "value4"]);
|
msetnx
もあるが、動作としてはsetnx
と同じく上書き禁止機能を提供する。
msetex
は確認できなかった。
実装 - strlen - 長さ取得
data-async-len.js1 2 3 4 5 6 7 8 9 10 11 12 13
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.set("key", "value"); const value = await client.strlen("key"); console.log(value); await client.end(true); })();
|
確認 - strlen - 長さ取得
以下のコマンドで実行。
1 2
| node data-async-len.js =>5
|
keykey
に対して設定したvalue
の文字列長の5
を取得できました。
実装 - keys - key 一覧取得
data-async-mset-keys.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const redis = require("async-redis"); const client = redis.createClient();
client.on("error", function (error) { console.error(error); });
(async () => { await client.mset([ "key1", "value1", "key2", "value2", "kei1", "value1", "kei2", "value2", ]);
const allkeys = await client.keys("*"); const keys = await client.keys("key*"); console.log(allkeys); console.log(keys);
await client.end(true); })();
|
確認 - keys - key 一覧取得
以下のコマンドで実行。
1 2 3
| node data-async-mset-keys.js [ 'kei2', 'key1', 'kei1', 'key2' ] [ 'key1', 'key2' ]
|
client.keys("*");
によってすべての key を取得し、client.keys("key*");
では、該当するものだけ取得できました。
今回は redis を使ってみました。
key-value 形式のデータ保存する NoSQL データベースを初めて触りました。
アプリケーションを作るときに、配列に情報を抱えるたままにすることや SQL で保管するのではない選択肢を得たことがよかったと感じます。
express のセッション管理に redis を使用するパッケージconnect-redisを見つけました。
今度はこちらを使ってセッション管理を試みたいです。
ではでは。