Redis Desktop Managerを使ってみる


## やりたいこと / 理由

Redisを使い始めたばかり....と言っても、現在フロントが中心なので、実際にDBにデータを格納したりするバックエンドを作っているわけではありません。

今回のQiitaメモは、以下のような目的、背景で書いております。

- バックエンドAPIとの結合時に、フロントからの操作でちゃんとデータが入っているか確認したい
- redis-cliではなく、GUIでデータを確認したい
- データをGUIで更新して、フロント側でどうなるか確認したい
 - API経由や、CLIでの更新に明るくないのがその理由
 - もちろんちゃんと勉強しないといけませんが....

なにかお手軽なツールが無いかなと思っていたところ、同僚に教えてもらったのが、Redis Desktop Manager (以下、RDM) です。

ちなみに、普段はDB (RDB)のデータを確認する場合はRubyMineやIntelliJのDBマネージャを利用しています。最初は、IntelliJでRedis用のプラグインが無いか探してしまいました^^;

## RDMを使ってみる

...ということで、早速インストール。


- [Redis Desktop Manager](http://redisdesktop.com)

*"Available for all platforms"* と書いてある通り、Mac版だけでなく、Windows版 / Ubuntu版 + ソースコードでの取得ができます。
わたしはMac版ですが、dmgイメージを使ってインストールしました。
brewでのインストールも出来るようです :)


### Redisの起動

まずはRedisを起動しておきます。
[前回](http://qiita.com/akiko-pusu/items/6602198a0cbbb3acffaf) 使ったデータを利用して、redis-server で起動。

### RDMで接続

RDMを起動すると、シンプルな画面が出てきます。
画面下部の *"Connect to Redis Server"* のボタンを押して、データソースの登録をします。

ローカル環境で起動しているRedisに接続するので、localhost (127.0.0.1) / port: 6379 を入力。Test connectionで接続確認ができます。 

![connect-local-redis.png](https://qiita-image-store.s3.amazonaws.com/0/27976/6af7cfb7-eb95-6444-7061-d4d98637db82.png "connect-local-redis.png")


### もっとデータを入れて確認してみる

簡単な確認はできましたが、データが少ないのでちょっと寂しい。

Redisの[Development Guide](https://github.com/uglide/RedisDesktopManager/wiki/Development-Guide) 上のサンプルコマンドで、テストデータを登録してみます。

※ 以下は、RDMではなくて、CLI (redis-cli) からの操作です。
（実際はCLIのプロンプトのあとに入力しています）


```
eval "for index = 0,100000 do redis.call('SET', 'test_key' .. index, index) end" 0
eval "for index = 0,100000 do redis.call('SET', 'test_key:' .. math.random(1, 100) .. ':' .. math.random(1,100), index) end" 0
eval "for index = 0,100000 do redis.call('HSET', 'test_large_hash', index, index) end" 0
eval "for index = 0,100000 do redis.call('ZADD', 'test_large_zset', index, index) end" 0
eval "for index = 0,100000 do redis.call('SADD', 'test_large_set', index) end" 0
eval "for index = 0,100000 do redis.call('LPUSH', 'test_large_list', index) end" 0

# 投入完了
# 0番のDBにキーがどれだけ登録されているか確認

eval "return #redis.call('keys', 'prefix-*')" 0
eval "return #redis.call('keys', '*')" 0
(integer) 100003
(2.78s)

# スクリプトで投入したキーにしぼって確認
eval "return #redis.call('keys', 'test_*')" 0
(integer) 100001
```

ファイルサイズは以下の通りになりました。

 - 1.8M  9 26 10:36 dump.rdb

### データ登録後にRDMで確認

では、さっそくテストデータ登録後にRDMで確認してみます。
有り難いことに、データの登録件数も表示されています。


![after-register-test-data.png](https://qiita-image-store.s3.amazonaws.com/0/27976/61eca1b2-57e2-eeb8-f7e1-45eb158f92fa.png "after-register-test-data.png")


表示データのフィルタリングが可能で、さらに、コンソール（cli) の起動も可能でした:)
これは有り難いですね。


![use-console-from-rdm.png](https://qiita-image-store.s3.amazonaws.com/0/27976/c0f192c1-292a-a413-ed89-70475dc0539b.png "use-console-from-rdm.png")

## SSH経由でRedisに接続

実際の環境では、直接リモートのRedisのポートに繋がらないことも多々あります。この場合でも、SSH Tunnelでの接続設定ができます。
この機能があるのはとっても有り難いです^^ 

ローカルと言いつつVagrantやdocker上で動かしている場合にも助かります。
（※ただし、多段になってしまうと自分でsshポートフォワードしないとダメ）

### SSH Tunnelの準備

こんな環境で試してみます。

- RDMはMacOS内で起動
- リモートのRedisはVirtualBox上のUbuntuで起動
 - ホストオンリーネットワーク (192.168.33.1)上 に 192.168.33.15を割り当て
 - ufwでPort 22 (ssh) のみ許可
 - Ubuntu内でのRedisはport: 7777で起動


![enabled-ufw.png](https://qiita-image-store.s3.amazonaws.com/0/27976/dfce5ffa-c70b-8d55-45d5-e2d0db7e3a39.png "enabled-ufw.png")


ufw (Firewall）を有効にしているので、redis-cli -h 192.168.33.15 -p 7777 しても接続できませんし、RDMの接続設定で普通にしても接続できません。

```
# ufwは無効の場合、すぐ繋がる
% redis-cli -h 192.168.33.15 -p 7777
192.168.33.15:7777> 

# ufw有効の場合、だいぶ待ってタイムアウト
% redis-cli -h 192.168.33.15 -p 7777
Could not connect to Redis at 192.168.33.15:7777: Operation timed out
not connected> 
```

### 設定例

では、実際のSSH Tunnelの場合の設定を。

#### 1. Connection設定

- 識別しやすい名前を付ける
- 接続したいサーバの名前（かIP)を入れる
- 接続したいRedisのポートを指定する
 - 今回は 7777　を入力する

#### 2. SSH Tunnel設定
 
- Use SSH Tunnelにチェックを入れる
- 踏み台にしたいリモートホスト名（IP) を入れる
- SSHポートを指定（通常22)
- 踏み台ホストにログインするためのアカウント・パスワードを指定

※ 今回は、踏み台に当たるホスト内で稼働しているRedisをトンネリングする形ですが、踏み台から実際のRedisが稼働しているホストに繋がればいいです...。

Test connectionで上手く接続できればOKです。


![use-ssh-tunnel.png](https://qiita-image-store.s3.amazonaws.com/0/27976/c8af0674-5938-4a19-4d6f-8b52f194ccf8.png "use-ssh-tunnel.png")


#### 操作画面

接続した際の画面はこちら。
ローカルのRedisと同じように、コンソールの利用もできます。

RDMのコンソール内でbgsaveと入力すると、VirtualBoxで稼働中のRedisの出力にも、その旨が表示されました。


![exec-bgsave.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5f0d08e6-b28a-bb08-129c-f20e2cc50dfb.png "exec-bgsave.png")

RDMから登録したデータも、リモートのRedisのダンプ結果を確認すると、ちゃんと入っておりました。

![show-dump-from-virtualbox.png](https://qiita-image-store.s3.amazonaws.com/0/27976/aa592909-0152-ea5b-faaa-c92ad806811a.png "show-dump-from-virtualbox.png")

こんな感じで、リモートでも大丈夫そうです。

### 接続設定の書き出し

RDMは、その他にはごちゃごちゃしたメニューは無く、いたってシンプル。

RDM用の接続設定は、ファイルへ書き出し/取り込みができるようなので、確認してみました。
今回試した分は、下記のような設定になります。

2つめが、SSH Tunnelを使ったケースです。

```
% cat ~/Documents/connect-redis-conf.json 
[
    {
        "host": "127.0.0.1",
        "keys_pattern": "*",
        "name": "local",
        "namespace_separator": ":",
        "port": 6379,
        "ssh_port": 22,
        "timeout_connect": 60000,
        "timeout_execute": 60000
    },
    {
        "host": "192.168.33.15",
        "keys_pattern": "*",
        "name": "virtualbox-test",
        "namespace_separator": ":",
        "port": 7777,
        "ssh_host": "192.168.33.15",
        "ssh_password": "--------",
        "ssh_port": 22,
        "ssh_private_key_path": "",
        "ssh_user": "vagrant",
        "timeout_connect": 60000,
        "timeout_execute": 60000
    }
]
```

なお、実際には、Macの場合は $HOME/Library/Preferences/rdm/connections.json が設定ファイルになるとのこと。

- [FAQ: Where stored config with connections? ](https://github.com/uglide/RedisDesktopManager/wiki/FAQ)

## まとめ / 雑感など

ささっと確認するには大変便利！
機能もドキュメントも分かりやすくてほとんど迷う必要はありませんでした。

おかげさまで、Redis（も含めたkey-value型DB) に対する苦手意識がだいぶ軽減されました！

次は、もうちょっとちゃんとアプリケーションからデータをやり取りできるようにしたいです....

## 参考情報

RDM本家を始め、以下のサイトにお世話になっております。
ありがとうございます！

- [Redis Desktop Manager](http://redisdesktop.com)
- [redis-cliの使い方](http://qiita.com/sawada_masahiko/items/1f60936c421ecab8dfbf) 
- [dot.install Redis入門](http://dotinstall.com/lessons/basic_redis)