Node.js + Express サーバから、Docker(+Docker-Compose) + Redis サーバーにデータを送る・削除する

# Node.js サーバーから、Docker サーバにデータを送る
- Ubuntuサーバー環境は２つ使ってます
   - マシンA 
     - Node.js + Express + express-session + connect-redis + Redis
   - マシンB
     - Docker + Docker-Compose + Redis 
 
マシンA から マシンB を参照してデータを表示したかったので、こんな構成になってます。
色々サイト見てたけど、実際にやってみないとコレわかんねーわって思った。

## マシンAの下準備
### 色々インストールする
Ubuntu と Node.js は既に導入済を想定

#### 必要なものをインストールする

```bash
$ mkdir exp_redis_test
$ cd exp_redis_test
$ npm install --save express \
                     express-session \
                     connect-redis \
                     redis
```

## マシンBの下準備
[前回](https://qiita.com/bonkoturyu/items/5e7e743b359ce63767a2)作ってたので、それを使う

### マシンBのRedis起動しておく

```bash
docker-compose up -d --build
```

## マシンAで index.js を作る
### node で実行するファイルを作成する
var と const と let が混じってるけど気にしない。

```javascript:index.js
var express = require('express');
var app = express();
var session = require('express-session');
var RedisStore = require('connect-redis')(session);

const REDIS_HOST_NAME = '192.168.123.223';
const REDIS_PORT_NO = 6379;
var redis = require('redis');
let redisClient = redis.createClient(REDIS_PORT_NO, REDIS_HOST_NAME);

app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: true,
    store: new RedisStore({ client: redisClient }), // Redisの設定
    cookie: {
      path: '/',
      maxAge: 5 * 1000,
    }
}));

app.get('/', (req, res) => {
    // セッションデータが無ければランダム値を取得
    var begginer = req.session.value || Math.random();
    // valueという名前でセッションデータを生成
    req.session.value = begginer;
    res.send('Begginer value: ' + begginer);
});

app.get('/session-delete', function(req, res) {
  delete req.session.value;
  res.send('session variable deleted');
});

app.listen(3000, () => {
    console.log('Example app listening on port 3000!');
});
```

### 作ったら保存して起動する

```bash
$ node index.js
Example app listening on port 3000!
```

ブラウザで http://192.168.123.223:3000/ を起動すると、
数字は同じにはならないが、↓こんな感じになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194966/cd8fc0f5-943b-e8bc-703a-dd0ca79d95a6.png)


この状態のままで、マシンBを確認する

```bash
$ docker exec -it mysqltest_redis_1 bash
root@09a7f47d4784:/data# redis-cli
127.0.0.1:6379> keys *
1) "sess:VKmVo2FPTXAlspqLyLHgENmEdHhzK_pS"
```

データが入力されてるのが確認できる。中身を見ると、

```bash
$ docker exec -it mysqltest_redis_1 bash
root@09a7f47d4784:/data# redis-cli
127.0.0.1:6379> keys *
1) "sess:VKmVo2FPTXAlspqLyLHgENmEdHhzK_pS"
127.0.0.1:6379> get sess:VKmVo2FPTXAlspqLyLHgENmEdHhzK_pS
"{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"value\":0.016689389693930634}"
127.0.0.1:6379>
```

こんな感じに、Valueが入力されているのが確認できる。
index.js を再確認したら、session-delete が出来るようにしてあるので、
http://192.168.123.223:3000/session-delete/ にアクセスしてみる。
↓こうなるので、またマシンBを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194966/4096b7cf-1bf7-b14a-3bef-cfc3981c373d.png)

```bash
$ docker exec -it mysqltest_redis_1 bash
root@09a7f47d4784:/data# redis-cli
127.0.0.1:6379> keys *
1) "sess:VKmVo2FPTXAlspqLyLHgENmEdHhzK_pS"
127.0.0.1:6379> get sess:VKmVo2FPTXAlspqLyLHgENmEdHhzK_pS
"{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}"
127.0.0.1:6379>
```

Valueが削除されているのが確認できる。

# 参考
- ざっくり分かるRedis入門
  - https://qiita.com/t-kuni/items/c00d0994c2eb20681cb1
- Node.js + Express 4.xで、セッション管理にRedisを使う
  - https://s8a.jp/node-js-express-redis
- ExpressのSessionデータをRedisで管理する
  - http://dim5.net/nodejs/using-express-session-redis.html
- 【入門】Redis
  - https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71
- redis-cli コマンド操作まとめ
  - https://qiita.com/rubytomato@github/items/d66d932959d596876ab5
- Redisのインストール・セットアップ
  - https://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921
- Redisの説明
  - https://github.com/NodeRedis/node-redis
- RedisとElastiCacheを分かりやすくまとめてみた
  - https://qiita.com/gold-kou/items/966d9a0332f4e110c4f8
- システム開発で得たRedis利用ノウハウ
  - ttps://future-architect.github.io/articles/20190821/
- RedisサーバのCPU負荷対策パターン
  - https://blog.yuuk.io/entry/redis-cpu-load
- Commands Introduction
  - http://redisgate.jp/redis/command/commands.php