Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

NoSQLデータベースのRedisをCData Excel Add-In で触ってみよう。データ構造とかも解説。

11月30日にCdata Driver for redisの日本語ベータ版がリリースされました!

CData Software がRedis Labs とパートナーシップを締結し、Redis Drivers for ODBC/JDBC/ADO.NET をβリリース

www.cdata.com

Cdata DriverのNoSQLラインナップがこれでまた一つ強力になりました!

f:id:sugimomoto:20171201020546p:plain

今日はこのCdata Driver for redisを紹介と共に、内部でCdata Driverがどんな風にNoSQLの構造を咀嚼しているのか、確認していきたいと思います!

ちなみに、Redisってなんぞや? という疑問については、私の前のBlogをどうぞ。

kageura.hatenadiary.jp

とりあえずExcelドライバーでアクセスしてみよう

まずは何もともあれ、使ってみましょう!

今回は一番手軽に利用できるExcelドライバーを利用してみました。

以下からベータ版がダウンロードできます。

www.cdata.com

Redisをローカルに構成する方法は上で紹介している前のBlog記事からどうぞ。今度書きたいと思いますが、Azure Redis Cacheも接続できます。

ちなみに、事前に以下のような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]をクリックします。

f:id:sugimomoto:20171201020657p:plain

初期は接続ウィザードが出てくるので、接続先のRedisに合わせて、任意の接続設定を行いましょう。

ちなみにLocalhostにそのまま構成している場合は、Auth SchemeをNONEに変更し、

Port:6379でServer:localhostを設定すればつながります。

f:id:sugimomoto:20171201020704p:plain

初期状態でKeysテーブルが選択されているかと思います。

とりあえずそのまま、OKをクリック。

f:id:sugimomoto:20171201020711p:plain

以下のような感じでデータの取得ができました!

が、なんだかデータが登録したものより増えているかと思います。

f:id:sugimomoto:20171201020715p:plain

それもそのはず。Cdata Driverでは、Redisの文字列型以外の各型は、すべてSetだろうがhashだろうが1行1行に分解して、ロードする仕組みになっています。

元の登録データ上、Keyは5個しか登録しませんでしたが、最終的に14行のデータとして出力されたのは、この点がCdata Driverによって加味されているからです。

ちなみに、Cdata Redis Driverのカラムはシンプルです。下記の5種類しかありません。

f:id:sugimomoto:20171201020722p:plain

Cdata Redis Driverのテーブルの扱い

とりあえず、ざっくりとCData DriverがKey-Valueのデータをどのように扱っているのか、イメージが掴めたかと思います。

でも、ここで一つ気になります。SQLでは欠かせない要素であるテーブルはどんな扱いなのか?

まず、そもそものRedisのデータ構造をちゃんと確認しておきたいと思いますが、一個前のBlogでも述べた通り、RedisはKey-Value型のとてもシンプルなNoSQLです。

f:id:sugimomoto:20171201020728p:plain

そこに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種類にわけてみました。

cdn.cdata.com


[全データ取得パターン]

上のExcelでロードしたように、Redisサーバ一台をそのままテーブルに見立ててしまい、すべてのKey-Valueを取得してしまうパターン。

一番シンプルかつわかりやすくデータが取得できるパターンですね。

こんな感じでSelectできます。わかりやすい。

SELECT * FROM [Keys]

f:id:sugimomoto:20171201020849p:plain


[1Key:1Tableパターン]

Fromの指定にKey名を完全一致で指定してしまうパターンです。

Keyが大量のリストやハッシュを保持していたり、ソート済みセットの場合に力を発揮するクエリです。

以下のような感じでFrom句に直接Keyを入力して、リクエストできます。

SELECT * FROM [user:1000]

f:id:sugimomoto:20171201020900p:plain


[Key命名規則Tableパターン]

以下のように、Keyの命名規則でデータ構造を表現した場合に効果を発揮するパターンです。

SET uid:1000:username antirez

SET uid:1000:password p1pp0

From句の中に、ワイルドカードを指定することで、前方一致のKeyを一括取得できます。

↓こんな感じ。

SELECT * FROM [user:*]

f:id:sugimomoto:20171201020907p:plain

ちなみにこのパターンの場合、Cdata Driver接続文字列のTable Patternにコロンで区切る情報が予め登録されているため、テーブルリストにuserが自動的に追加されます。

なので、一番ベーシックなパターンと言えるかもですね。


[SQL Criteria Key抽出パターン]

全データ取得パターンに対して、Where句で無理やり、Keyを指定してしまうパターンです。

Key命名規則Tableパターンに比べて、柔軟にKeyの指定が可能です。

SELECT * FROM [Keys] WHERE [RedisKey] = 'user:1000' or [RedisKey] = 'myset'

f:id:sugimomoto:20171201020915p:plain


以上の4種類でした!

この4パターンによって、SQLに適した形でredisへアクセスが可能になっています。

用途やデータ構造に応じて、適切なものを選択してもらえればと思います。

まとめ

いかがでしたでしょうか。

Key-Value型のNoSQLデータベースを扱うために、色々と面白い実装アプローチをしているのが、少しでも伝われば嬉しいです。

今回はExcelドライバーを使って紹介しましたが、もちろんODBCADO.NETドライバーも同じ機能を備えてますので、BIやETLを通じて機能を駆使するこも可能です。

次回はAzure Redis Cacheに繋いで、色々とやってみたいところです。

最後になりましたけど、一応CData Software User Group Advent Calendar 2017の1日目でした!

qiita.com