Azure Redis Cache の使用 (.NET, PHP, Node.js)

こんにちは。

Cache を使うことで、マルチ インスタンス構成 (ロード バランサー構成など) においてマシン間で情報 (session 情報など) を共有したり、頻繁に使用するデータの IO (入出力) 高速化などが期待できますが、これまで Azure で提供されてきた Cache (Managed Cache) は、主に .NET で使うことが想定されていました。(厳密には memcache プロトコルをサポートしていたので他言語でも使えましたが、あくまでもオプションの機能でした。)

新しく Azure に Built-in された Redis Cache のサービスを使うと、Redis による高いパフォーマンスを享受しながら、PHP, Python, Node.js など、さまざまな言語環境からストレスなく使うことができます。
ここでは、この Redis Cache の使い方を (session における利用方法も含め) 紹介したいと思います。(今後、数多くのハンズオンで使用するため、準備 (リファレンス) としてメモしておきます。)

 

Redis Cache の作成と構成

プログラミングの前に、まず、Azure Portal を使用して Redis Cache を作成します。

Redis Cache は、現行の Azure Management Portal (https://manage.windowsazure.com) では作成できないので、新しい Portal (https://portal.azure.com) を使用して新規作成してください。([New] – [Data + storage] – [Redis Cache] を選択して作成できます。)

Redis Cache の作成が完了したら、この後のプログラミングのために、Host name, Port number をコピー (メモ) しておきましょう。

また、access key もコピー (メモ) しておきましょう。

eviction policy (LRU など データが増えてきた場合の削除方針や優先度) をはじめとした構成作業は、redis.conf ではなく、Azure Portal を使用します。(下図)

また、現時点では persistence は提供されていないので、Read 主体のデータや、Session 情報のような揮発的なデータなど、使い方に注意してください。(RDB とプログラムの中間層として使用したい場合、現状は、Azure Virtual Machines に自身で Redis を立てるほうが無難かもしれません。。。)
また、Azure Managed Cache の頃のような 3 node による HA option は提供されていませんが、Azure Redis Cache の Standard 版を使用した場合、Master / Slave の 2 node 構成となり、failover がおこなわれるようなので、Critical な処理では Standard 版を使用すると良いでしょう。

補足 (2015/09) : Azure Redis Cache の Premium 版を使って、Max 10 台までの Sharding (Cluster 構成) が可能になりました

 

.NET (C#) から使う

.NET から使用する場合には、NuGet の StackExchange.Redis が使用できます。

上記の NuGet パッケージを取得したら、以下の通りプログラミングします。(下記は ASP.NET MVC のサンプル コードです。)
なお、下記の password には、上記で取得した access key を設定してください。(Host 名、Port 番号も同様に、皆さんの環境にあわせて設定してください。)

. . .
using StackExchange.Redis;
. . .

private static IDatabase _cache = null;
private IDatabase Cache
{
  get
  {
    if(_cache == null)
    {
      var con =
        ConnectionMultiplexer.Connect("tsmatsuz01.redis.cache.windows.net:6380,ssl=true,password=PcDPRkroG6…");
      _cache = con.GetDatabase();
    }
    return _cache;
  }
}

public async Task<ActionResult> TestSet()
{
  var cache = Cache;
  await cache.StringSetAsync("key1", "hogehoge");
  await cache.StringSetAsync("key2", 100);
  return View();
}

public async Task<ActionResult> TestGet()
{
  var cache = Cache;
  var key1 = (string) await cache.StringGetAsync("key1");
  var key2 = (int) await cache.StringGetAsync("key2");
  ViewBag.key1 = key1;
  ViewBag.key2 = key2;
  return View();
}
. . .

Redis Cache を ASP.NET の sessionState で使用する場合は、NuGet から RedisSessionStateProvider を取得して使用できます。(Web.config に、下記を使用した sessionState を定義します。)

 

PHP から使う

PHP から使用する場合も、Redis の普通のライブラリー (クライアント) を使用すれば OK です。
今回は、MSDN でも紹介している Predis を使用します。

まず、ここで使用する Predis は SSL に対応していないので、あらかじめ、作成した Redis Cache の SSL の設定で Non-SSL を有効にして保存してください。(下図の [Allow access only via SSL] で [No] を選択します。)
使用する Port 番号も、下図の通り 6379 となります。

Predis を取得 (ダウンロード) します。Composer を使用する場合は、下記のコマンドで取得できます。(実際の開発では、deploy.sh などに記載しておくと良いでしょう。)

curl http://getcomposer.org/installer | php
php composer.phar require predis/predis dev-master

あとは、プログラムを作成するだけです。
この際、上述の通り Non-SSL Port (上図の 6379) を使ってアクセスしてください。

<?php
require "vendor/autoload.php";
PredisAutoloader::register();

$r = getRedis();
$r->set("key1", "hogehoge");
$val = $r->get('key1′);
echo $val;

function getRedis() {
  static $redis = false;
  if ($redis)
    return $redis;
  // set non-ssl host
  $redis =
    new PredisClient("tcp://tsmatsuz01.redis.cache.windows.net:6379");
  // set access key
  $redis->auth("PcDPRkroG6. . .");
  return $redis;
}
?>

Predis 0.8.2 以降では Session Handler も実装されているので、Redis を php の session でも使用できます。(なお、この Session Handler を使用するには PHP 5.4 以上が必要ですので注意してください。)

<?php
require "vendor/autoload.php";
PredisAutoloader::register();
$redis = new PredisClient("tcp://tsmatsuz01.redis.cache.windows.net:6379");
$redis->auth("PcDPRkroG6…");
$handler =
  new PredisSessionHandler($redis, array('gc_maxlifetime' => 1800)); // hold 30 mins
$handler->register();
session_start();
. . .

// use session !
$_SESSION['foo'] = 'hogehoge';
. . .

Node.js から使う

Node.js の場合も同様です。今回は、Node の redis (または node-redis) パッケージ を使います。

redis パッケージも、同様に SSL に対応していないようなので、Redis Cache で Non-SSL を使用できるように設定しておきましょう。(上述)

下記のコマンドを入力して redis パッケージをインストールします。

npm install redis

値の set と get をおこなうには、以下の通りプログラミングします。

var http = require('http');
var redis = require('redis');
var redisClient = redis.createClient(
  6379,
  'tsmatsuz01.redis.cache.windows.net');
redisClient.auth(
  'PcDPRkroG6…',
  function (err) {
    // some step …
  });
http.createServer(function (req, res) {
  redisClient.set('key1′, 'hogehoge', function (err, rply) {
    console.log('set ended');
    console.log(rply);
  });

  redisClient.get('key1′, function (err, rply) {
    // result is in 'rply'
    console.log('get ended');
    console.log(rply);
  });

  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Cache Test');
  res.end();
}).listen(process.env.PORT);

NodeJS でも、同じく、Express の session で Redis を使うことができます。これには、connect-redis というパッケージを使用します。

// install express generator
npm install express-generator -g
// create express files
express -f
// build express using package.json
npm install
// additional install for express-session
npm install express-session
// additional install for redis
npm install redis
// additional install for connect-redis
npm install connect-redis

以下の通りプログラム (app.js) を記述することで、express において、Redis を session として使用できます。

. . .
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
. . .

var app = express();
. . .

app.use(cookieParser());
app.use(session(
 {
    store: new RedisStore({
      host: 'tsmatsuz01.redis.cache.windows.net',
      port: 6379,
      pass: 'PcDPRkroG6…'
    }),
    secret: 'yoursecretcode',
    saveUninitialized: true,
    resave: false
 }
));
. . .

app.use('/settest', function (req, res) {
  req.session.value = 'hogehoge';
  res.send('test value set !');
});
app.use('/gettest', function (req, res) {
  res.send('session value = ' + req.session.value);
});
. . .

 

Redis は「Redis – Clients」に列挙されているような、さまざまな言語環境から使用可能なオープン プラットフォームですので、その他の言語環境でもストレスなく使って頂くことができます。

 

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s