かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Azure Redis Cache を使ってみた

Azure Redis Cache

そういえばコレ触ってみたいと思ってたんですよね。

Redis Cache

作り方

ポータルからぽちぽちでいけました。ハマりどころはないでしょう多分。 今回は検証用なのでプランはBASICにしました。本番ではStandard以上を使うことになるんでしょうね。

node.js から使ってみよう

最近、不本意?ながら JavaScript(node.jsです。というかnode.jsまた分裂したけど大丈夫なんですかね…) やってるので、試しに node.js でやってみようと思います。

手順は、以下のサイトを参考にしてます。

Node.js で Azure Redis Cache を使用する方法

ということで

npm install redis

で node_redis を入れます。

接続に必要な情報の取得

ポータルから、Redis Cacheのアクセスキーからプライマリキーとプロパティからホスト名とSSLポートをメモっておきます。 node的には、環境変数あたりにセットしておいて process.env.*** からアクセスするのがコード内に埋め込まなくて済むのでいいんでしょうね。私はFunction Appを使うので、アプリケーション設定に埋め込んでおきます。

情報を書き込んでみる

では、先ほどの情報を元にアクセスしてみましょう。 私はFunction Appで試してみてるので適当に TimerTrigger の関数を作って関数が動いた時間の情報をキャッシュに書き込むようにしました。

const redis = require('redis');

module.exports = function (context, myTimer) {
    var client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOSTNAME, {
        auth_pass: process.env.REDIS_KEY,
        tls: {
            servername: process.env.REDIS_HOSTNAME
        }
    });

    client.set('timestamp', new Date().toISOString(), (err, reply) => {
        context.log('updated timestamp');
        client.quit();
        context.done();
    });
};

こいつを10秒間隔くらいで動かしてみるように function.json を構成します。

{
  "disabled": false,
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "*/10 * * * * *"
    }
  ]
}

func host start すると以下のようなログが延々と出続けるのでエラーなく動いてるっぽいですね。 (タイマーが動き出すまでに少し時間がかかります)

Function started (Id=44896ed1-2114-4697-950b-1514548e00ed)
Executing 'Functions.UpdateCache' (Reason='Timer fired at 2017-08-29T10:27:10.0229356+09:00', Id=44896ed1-2114-4697-950b-1514548e00ed)
updated timestamp
Function completed (Success, Id=44896ed1-2114-4697-950b-1514548e00ed, Duration=2342ms)
Executed 'Functions.UpdateCache' (Succeeded, Id=44896ed1-2114-4697-950b-1514548e00ed)

因みに、Redisの管理ツールは何を使うのがデファクトか知らないのですが Redis Desktop Manager を使って覗いてみたらちゃんと値が入っていることが確認できました。

参考: Redis Desktop Manager を使って Azure Redis Cache の管理を行ってみた

SSLでつなぐ方法はどうやるんだろう?

情報を読み込んでみる

ということで書けてることが確認できたので次は読んでみます。

redis の client を作って get するだけですね。

const redis = require('redis');

module.exports = function (context, req) {
    var client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOSTNAME, {
        auth_pass: process.env.REDIS_KEY,
        tls: {
            servername: process.env.REDIS_HOSTNAME
        }
    });

    client.get('timestamp', (err, reply) => {
        context.res = {
            status: 200,
            body: reply
        };
        client.quit();
        context.done();
    });
};

適当に実行して URL をたたくと以下のような結果が返ってきました。

"2017-08-29T01:39:10.016Z"

暫く時間をあけて URL をたたくとちゃんと更新された値が取れてるみたいです。

"2017-08-29T01:41:10.010Z"

有効期間

データには有効期間を指定できます。expireというメソッドを使うみたいですね。こんな感じ?

const redis = require('redis');

module.exports = function (context, myTimer) {
    var client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOSTNAME, {
        auth_pass: process.env.REDIS_KEY,
        tls: {
            servername: process.env.REDIS_HOSTNAME
        }
    });

    client.set('timestamp', new Date().toISOString(), (err, reply) => {
        context.log('updated timestamp', err, reply);
        client.expire('timestamp', 5, (err, reply) => {
            context.log('set expire', err, reply);
            client.quit();
            context.done();
        });
    });
};

これで timestamp の有効期限は5秒です。なのでキャッシュの値を返すHTTPTriggerの関数のほうは値を返したり返さなかったりするようになります。

まとめ

キャッシュのゲットとセットだけなら簡単でした。 なんか他にもいろんな機能があるみたいなので見てみたいと思います。