Azure Redis Cache をはじめよう

まーやです。

最近お仕事でAzure の利用が増えてきました。「AzureでRedis使いたいなーElastiCacheみたいなサービスないかなー」と調べてみたら、ちゃんと存在してました。[Azure Redis Cache](https://azure.microsoft.com/ja-jp/services/cache/)さん。
使い始めるにあたって調べた内容をまとめます。
本投稿は「すでにローカル環境や外部Linux環境、AWS ElastiCacheなどでRedisを使ったことある人」が読む前提で書きたいと思います。
Redisそのものについて知りたい方は[本家サイトなど](http://redis.io/)で知見を得た上で読んでいただければ幸いです。


# 概要
[Azure Redis Cache](https://azure.microsoft.com/ja-jp/services/cache/) はその名の通り[Redis](http://redis.io/)をサービス化したものです。当然Redisの主な機能はちゃんと使えます。ちなみに、今まではAzure Managed Cache というサービスがあったようですが、[こちらの記事にある通り](https://azure.microsoft.com/ja-jp/blog/azure-managed-cache-and-in-role-cache-services-to-be-retired-on-11-30-2016/)2016年11月30日でサービス終了となるそうです。Managed CacheからRedis Cacheへサービス移行が促されています。今現在Managed Cacheを使ってる方がいらっしゃれば、Redis Cacheへの移行をすぐすぐ検討しましょう。

## Azure Redis Cacheで使える機能（抜粋）

- List型やSet型etc.を使ったKVS機能
- 時限付きデータ保持(Redisの中で私が一番好きな機能!)
- Publish/Subscribe
- Redis-cli などRedisクライアント各種を使ってどこからでも接続可

Azureのシステムとはいえ、Redis-cliやJedisなどを使って接続できるので、自前で立てた時と利用方法は変わりませんね。運用場所がAzureの中にある、というだけです。

## Azure Redis Cacheをつかうメリット
私自身がメリットだな、と感じることの中で大きなものを3つ挙げてみます。

1. 無停止スケールアップ・スケールアウト   
これが一番大きな理由です。Redisはメモリ上で動いているため、一旦停止させてしまうと保存されているデータが消えてしまいます(※1)。データを消さないためにデータをバックアップして、停止して、再起動後データ戻して・・・なんてことをする必要はAzure Redis Cacheでは不要です。Redis Clusterのシャード数の変更もスライダーで簡単に作業できます。
![cluster.png](https://qiita-image-store.s3.amazonaws.com/0/60850/ba8e069b-8c1a-4665-c9bc-25a1e30ec50b.png)   
    
2. データのインポート・エクスポートがボタン1つ
です。日常的に使うような機能ではありませんが、ちょっと状態を見たいとか、何かデータ不備がありそうだから確認したい、ダミーデータ入れてテスト用Redis作ろう、みたいなときにとても便利です。

3. Redis Cache Advisor
キャッシュの使い方がいまいちな部分に対して改善を提案してくれる機能が最近追加されました。[公式の機能説明についてはこちら](https://azure.microsoft.com/ja-jp/documentation/articles/cache-configure/#redis-cache-advisor)。とても便利そうだと思って使い始めているんですが、今のところこの機能から改善提案がなく。。。うまく使えてる(?)ということで喜びたいところですが、どんな提案が出てくるのかこの目で見てみたいものです。またこの機能についていろいろ遊んでみたらその時は別途共有します。

## Azure Redis Cacheをつかうデメリット
個人的には「Azure Redis Cache特有の」デメリットというのはほとんどないのではないかなと思います。少なくとも今ぱっとは思いつきません。Redis 自体の細かい設定ができる人にとっては、「本当はこれも設定しておきたいのに」みたいな(;＾ν＾)ｸﾞﾇﾇ...感はあると思います。Azure側の障害などが発生した場合に利用側としては何もできなくてばたばたするということも稀にあります。
これは本サービスに限らず、PaaS/SaaSを使うときは必ず発生するトレードオフ的な部分なので大きなデメリットは今のところ(私的には）ないです。

## 料金体系
[公式の料金体系](https://azure.microsoft.com/ja-jp/pricing/details/cache/)
日本リージョン(西日本/東日本)の両方にRedis Cacheがあります。1時間ごとの利用料計算になります。インスタンスのサイズとプラン(プランについてはこの後詳しく)によって時間あたりの料金が変わりますが、一番小さい250MBのキャッシュ領域のインスタンス(Basicプラン)で1時間2.244円、1ヶ月丸々動かして1700円弱です。AWS ElastiCache利用時とそこまで大きく変わらないかなという印象です。※2

「プラン」というのは機能に対する料金表です。Azure Redis Cacheではこの機能に対する料金であるプランとメモリに対する料金で値段が決定します。現在BASIC/STANDARD/PREMIUMの3プランが用意されています。各プランで使える機能が変わるので、詳細については↑のURLから公式ページを確認していただきたいですが、気を付けなければいけないのは、以下機能はPREMIUMにしかついていないということです。

- データの永続
- クラスター
- 複数のキャッシュ ユニットにスケールアウト
- データインポート・エクスポート
- reboot
- アップデートスケジュール管理

特にデータのスケールアウトや永続化あたりは本番運用するときに必要な機能になることが多いと思うので、商用本番利用時のプランはPREMIUM一択かなと思います。個人でちょっとお勉強に使ったりテスト用に、なんて時はBASICで十分です。

# 実際に使ってみる
では実際に使ってみます。(※3)

①Redis Cacheの構築
ポータルから新規作成を選び、Redis Cacheを選択します。その後DNSやリソースグループ(リソースグループについてはまた別の機会に)、リージョンや料金プランの設定をすればそれだけでOK。後はRedisが立ち上がるまで待ちます。私が作業したときはこの待ち時間が10分ちょっとありました。結構長いですね。<img class="alignnone size-full wp-image-1460" src="https://hotchpotchj37.files.wordpress.com/2016/08/1.png" alt="1.png" width="979" height="951" /><img class="alignnone size-full wp-image-1462" src="https://hotchpotchj37.files.wordpress.com/2016/08/2.png" alt="2.png" width="655" height="949" />

②アクセスポートの設定
出来上がったRedis Cacheをクリックします。初期設定ではSSLポート(6380)のみ接続可能になっています。Redisクライアントによっては非SSLポート(6379)のみにしか対応していないものもあるので、自分が使っているRedisクライアントに合わせて非SSLポートを許可するか否かを設定してください。ポートの設定は「詳細設定」というメニューから設定できます。設定を変更したら上部にある保存ボタンを押すの忘れずに。
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/60850/5a071493-c9f0-6f91-ae3b-fbbf95507465.png)


③接続情報の取得
「アクセスキー」のメニューを選択すると認証に必要なキーを取得できます。redis-cliやJedisで使う場合は一番上のプライマリキーが必要です。接続ホスト名は「プロパティ」のメニューから取得できます。

④さぁ接続です
お好きなRedisクライアントを使って接続してみましょう～。
【redis-cli】

```
> redis-cli -h [自分のホスト].redis.cache.windows.net -p 6380 -a [プライマリキー]
# もしくは
> redis-cli -h [自分のホスト].redis.cache.windows.net -p 6379
> auth [プライマリーキー]
```
【Jedis】

```
JedisShardInfo settings = new JedisShardInfo("ホスト名", ポート番号);
settings.setPassword("プライマリーキー");
Jedis jedis = new Jedis(settings);
```

うごきましたか？後はいつも通りRedisを使ってもらえれば大丈夫です。Redisの冗長化とかを(ある程度の接続数までは)自分で考えなくてよいのはいいですね。


-------------------------------------------
※1 消さないための方法もありますが、”特性としては” という意味で記載しています。
※2 t2.micro(0.555GiB)1か月1900円くらい。その他細かいオプションなどに違いがあります。
※3 今回は 2016/09/14時点でのキャプチャと手順で記載しています。ダッシュボードのUI変更はちょくちょく行われます。ご留意ください。