redisを使ってみる

redis を、セッションを保存したりといった用途に使うということは分かった。
でも、redis って何だ?どう使うのか試しました。

目次

実行環境

  • windows
    • Windows10 ver.1909
  • Mac
    • macOS Mojave 10.14.4

環境構築 - Windows -

Releases - microsoftarchive / redisにてインストーラを取得。

以下の以下の画面が出るので「Next」を順に押していきます。






「Install」を押します。

インストールした時点で、実行されます。

環境構築 - Mac -

以下のコマンドで、インストールを実施。

1
2
3
4
brew install redis
# インストール完了まで待つ
# 以下コマンドで開始
resis-server

コールバック関数で利用

実装 1

今回は、npm - redisを用いて redis を使ってみます。
サンプルを参考に、データ登録とデータの取得のプログラムを別で用意します。

data-set.js
1
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.js
1
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
# データ登録 
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.js
1
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.js
1
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
# データ登録 
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
# 以下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
#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.js
1
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.js
1
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.js
1
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.js
1
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.js
1
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を見つけました。
今度はこちらを使ってセッション管理を試みたいです。

ではでは。