こんにちは! CDataでテクニカルリードエンジニアをしている杉本です。
今日は去年11月にリリースされたCdata Driver for redisの紹介と共に、内部でCdata Driverがどんな風にNoSQLの構造を咀嚼しているのか、紹介していきたいと思います!
CData Software がRedis Labs とパートナーシップを締結し、Redis Drivers for ODBC/JDBC/ADO.NET をβリリース
CData Redis Driver
Redisって何?
Redisは以下2点を大きな特徴とするNoSQLデータベースです。
・Key-Value型
・In-Memoryで動作
基本的にIn-Memoryで動作し、高速なI/Oを実現できるNoSQLとなっています。
永続化の設定によって定期的、もしくはInputの度にディスクへ書き込むことも可能ですが、その分オーバーヘッドが発生しますので、パフォーマンスやスケールとのバランスを見て、設定する必要がありますね。
このI/Oの速さを活かして、Webサイトのcacheなどで使われることが多いかと思います。AzureでのPaaSスタイルで提供されている、Azure Redis Cacheなどはまさにその用途として結構特化した提供をされているイメージです。
前述の通り、InMemoryで動作するので、ディスクへの書き込み設定をしていなければ、サービス再起動時にデータは消失しますので、その点は注意が必要ですね。
わたしが初めて触ったのは、Azure Redis Cacheだったので、Cacheデータベースとして利用するイメージが強かったですが、リアルタイムで大量のデータが更新されていくオンラインゲームのランキング情報管理としても利用されているようです。
消失してもダメージが少ないけれど、大量のアクセスをさばく必要があるものに向いているという感じですね。
Excelドライバーでアクセスしてみよう
さて、まずは何もともあれ、使ってみましょう!
ローカルへの詳しいインストール方法は私のBlogでも書いているので、どうぞ参考にしてください。
Windows版Redisをインストールして触ってみる
今回は一番手軽に利用できるExcelドライバーを利用してみました。
以下からベータ版がダウンロードできます。
CData Redis Excel-Addin
ちなみに、事前に以下のような5種類のKey-Valueを構成しています。
set mykey somevalue
rpush mylist A B C
sadd myset 1 2 3
zadd hackers 1940 "Alan Kay" 1957 "Sophie Wilson" 1953 "Richard Stallman" 1949 "Anita Borg"
hmset user:1000 username antirez birthyear 1977 verified 1
インストール後、Excelを起動し、CDataタブから[接続元Redis]をクリックします。
初期は接続ウィザードが出てくるので、接続先のRedisに合わせて、任意の接続設定を行いましょう。
ちなみにLocalhostにそのまま構成している場合は、Auth SchemeをNONEに変更し、
Port:6379でServer:localhostを設定すればつながります。
初期状態でKeysテーブルが選択されているかと思います。
とりあえずそのまま、OKをクリック。
以下のような感じでデータの取得ができました!
が、なんだかデータが登録したものより増えているかと思います。
それもそのはず。Cdata Driverでは、Redisの文字列型以外の各型は、すべてSetだろうがhashだろうが1行1行に分解して、ロードする仕組みになっています。
元の登録データ上、Keyは5個しか登録しませんでしたが、最終的に14行のデータとして出力されたのは、この点がCdata Driverによって加味されているからです。
ちなみに、Cdata Redis Driverのカラムはシンプルです。下記の5種類しかありません。
Cdata Redis Driverのテーブルの扱い
とりあえず、ざっくりとCData DriverがKey-Valueのデータをどのように扱っているのか、イメージが掴めたかと思います。
でも、ここで一つ気になります。SQLでは欠かせない要素であるテーブルはどんな扱いなのか?
まず、そもそものRedisのデータ構造をちゃんと確認しておきたいと思いますが、一個前のBlogでも述べた通り、RedisはKey-Value型のとてもシンプルなNoSQLです。
そこにSQLというTableやValue以外のカラムという概念は無く、あつかるデータ構造はシンプルの極みですが、それゆえに高いI/O性能を発揮します。
なので、結論から言ってしまえば、テーブルという概念は無いというか、一個しかありませんよー!
・・・というところなんですが
どうせSQLとして扱うなら、ある程度データを分割して、テーブルライクに扱いたい。特に、以下のようなKeyの命名パターンを用いているなら、最終的にuidでひっかけてユーザーの一覧をぱっと取得したいのが人情というものではないでしょうか。
SET uid:1000:username antirez
SET uid:1000:password p1pp0
そんなSQL的わがままに答えるために、Cdata DriverはKey-Value用にいくつかのテーブル構造化パターンを提供して、redisにアクセスしやすくしています。
ここをもうちょっと詳しく見てみましょう。
Cdata Driver RedisのTable化パターン
ヘルプにも記載していますが、もうちょっと私なりにイメージが湧きやすいように4種類にわけてみました。
CData Redis Help
[全データ取得パターン]
上のExcelでロードしたように、Redisサーバ一台をそのままテーブルに見立ててしまい、すべてのKey-Valueを取得してしまうパターン。
一番シンプルかつわかりやすくデータが取得できるパターンですね。
こんな感じでSelectできます。わかりやすい。
SELECT * FROM [Keys]
[1Key:1Tableパターン]
Fromの指定にKey名を完全一致で指定してしまうパターンです。
Keyが大量のリストやハッシュを保持していたり、ソート済みセットの場合に力を発揮するクエリです。
以下のような感じでFrom句に直接Keyを入力して、リクエストできます。
SELECT * FROM [user:1000]
[Key命名規則Tableパターン]
以下のように、Keyの命名規則でデータ構造を表現した場合に効果を発揮するパターンです。
SET uid:1000:username antirez
SET uid:1000:password p1pp0
From句の中に、ワイルドカードを指定することで、前方一致のKeyを一括取得できます。
↓こんな感じ。
SELECT * FROM [user:*]
ちなみにこのパターンの場合、Cdata Driver接続文字列のTable Patternにコロンで区切る情報が予め登録されているため、テーブルリストにuserが自動的に追加されます。
なので、一番ベーシックなパターンと言えるかもですね。
[SQL Criteria Key抽出パターン]
全データ取得パターンに対して、Where句で無理やり、Keyを指定してしまうパターンです。
Key命名規則Tableパターンに比べて、柔軟にKeyの指定が可能です。
SELECT * FROM [Keys] WHERE [RedisKey] = 'user:1000' or [RedisKey] = 'myset'
以上の4種類でした!
この4パターンによって、SQLに適した形でredisへアクセスが可能になっています。
用途やデータ構造に応じて、適切なものを選択してもらえればと思います。
おわりに
いかがでしたでしょうか。
Key-Value型のNoSQLデータベースを扱うために、色々と面白い実装アプローチをしているのが、少しでも伝われば嬉しいです。
今回はExcelドライバーを使って紹介しましたが、もちろんODBCやADO.NETドライバーも同じ機能を備えてますので、BIやETLを通じて機能を駆使するこも可能です。
是非一度使ってみてください。
関連コンテンツ