Redis データへの SQL アクセス



この記事では、CData ドライバーで Redis および Redis Enterprise に保存されたデータを扱う方法について説明します。従来、Redis のようなキーバリュー型データストアを BI、レポート作成、ETL ツールにインポートすることは困難か、あるいは不可能でした。CData ドライバーを使用すると、従来のデータベースモデルを構築するためのさまざまなアプローチが可能になり、お好みの BI、レポート作成、ETL、カスタムアプリケーションで Redis データを簡単に操作できるようになります。

Redis データの解釈方法

最初の3つのオプションは、従来の Redis 環境で作業するのと同様に、Redis のキーバリューペアを直接操作する場合に便利です。接続プロパティを設定するオプションでは、関連する Redis キーバリューペアがピボットされ、より従来的なデータテーブルモデルに変換されます。それぞれの方法を以下で詳しく説明します。

Redis のデータ型



Redis のデータはキーバリューペアとして保存されますが、単純な文字列に限定されるのではなく、Redis では特定のキーにさまざまなデータ構造を割り当てることができます。以下は、Redis でサポートされているデータ構造(データ型)の一覧です(出典: https://redis.io/topics/data-types-intro)。

  • バイナリセーフ文字列
  • リスト: 挿入順にソートされた文字列要素のコレクション。基本的にはリンクリストです。
  • セット: ユニークでソートされていない文字列要素のコレクション。
  • ソート済みセット(ZSet): セットと似ていますが、すべての文字列要素にスコアと呼ばれる浮動小数点数が関連付けられています。要素は常にスコア順にソートされるため、セットとは異なり、範囲内の要素を取得できます(例: トップ10 またはボトム10 を取得)。
  • ハッシュ: フィールドと値を関連付けたマップ。フィールドと値の両方が文字列です。Ruby や Python のハッシュと非常によく似ています。

この記事では、CData の Redis ドライバーが上記の Redis データ型とどのように連携するかを説明し、ドライバーを使用して Redis データを操作するためのサンプル SQL クエリを紹介します。

Redis キーをテーブル名として使用する



CData ドライバーで Redis データを操作する最も直接的な方法は、Redis キーをテーブル名として使用することです。この方法では、5つのカラム(RedisKey、Value、ValueIndex、RedisType、ValueScore)を持つ小さなテーブルが返されます。これらのカラムの値は、テーブル名として使用される Redis キーに関連付けられた Redis データ型によって異なります。

  • RedisKey - Redis キー
  • Value - RedisKey と ValueIndex に関連付けられた文字列値
  • ValueIndex - データ型によって異なります: 文字列の場合は 1、セット・リスト・ソート済みセットの場合は 1 から始まるインデックス、ハッシュの場合は関連付けられたフィールド名
  • RedisType - Redis のデータ型
  • ValueScore - データ型によって異なります: 文字列・リスト・セット・ハッシュの場合は NULL、ソート済みセットの場合は関連付けられたスコア
以下に、Redis のデータ型に基づいたサンプルデータ、クエリ、結果を示します。

Redis 文字列


Redis で文字列を作成します:

> set mykey somevalue
OK
mykey に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します:

SELECT * FROM mykey

RedisKey ValueIndex Value RedisType ValueScore
mykey 1 somevalue String NULL

Redis リスト


Redis でリストを作成します:

> rpush mylist A B C
(integer) 3
mylist に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します:

SELECT * FROM mylist

RedisKey ValueIndex Value RedisType ValueScore
mylist 1 A List NULL
mylist 2 B List NULL
mylist 3 C List NULL

Redis セット


Redis でセットを作成します:

> sadd myset 1 2 3
(integer) 3
myset に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します(Redis はセットの要素を任意の順序で返す可能性があることに注意してください):

SELECT * FROM myset

RedisKey ValueIndex Value RedisType ValueScore
myset 1 2 Set NULL
myset 2 1 Set NULL
myset 3 3 Set NULL

Redis ソート済みセット


Redis で ZSet(ソート済みセット)を作成します:

> zadd hackers 1940 "Alan Kay" 1957 "Sophie Wilson" 1953 "Richard Stallman" 1949 "Anita Borg"
(integer) 9
hackers に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します:

SELECT * FROM hackers

RedisKey ValueIndex Value RedisType ValueScore
hackers 1 Alan Kay ZSet 1940
hackers 2 Anita Borg ZSet 1949
hackers 3 Richard Stallman ZSet 1953
hackers 4 Sophie Wilson ZSet 1957

Redis ハッシュ


Redis でハッシュを作成します:

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
user:1000 に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します:

SELECT * FROM user:1000

RedisKey ValueIndex Value RedisType ValueScore
user:1000 username antirez Hash NULL
user:1000 birthyear 1977 Hash NULL
user:1000 verified 1 Hash NULL

キーパターンをテーブル名として使用する



同じパターン(例: "user:*")に一致する複数の Redis キーがある場合、そのパターンをテーブル名として使用できます。これにより、複数の Redis キーを一度に取得できます。まず、パターンに一致する複数のキーを Redis に追加してみましょう:

> hmset user:1000 name "John Smith" email "[email protected]" password "s3cret"
OK
> hmset user:1001 name "Mary Jones" password "hidden" email "[email protected]"
OK

user:* をテーブル名として使用すると、ドライバーはパターンに一致するすべての Redis キーバリューペアを取得します。期待される結果を以下に示します:

SELECT * FROM [user:*]

RedisKey ValueIndex Value RedisType ValueScore
user:1000 name John Smith Hash NULL
user:1000 email [email protected] Hash NULL
user:1000 password s3cret Hash NULL
user:1001 name Mary Jones Hash NULL
user:1001 email [email protected] Hash NULL
user:1001 password hidden Hash NULL

SQL クエリの WHERE 句でキーパターンを使用する



パターンに一致する複数の Redis キーがあり、SQL クエリをより詳細に制御したい場合は、WHERE 句の key カラムの条件としてキーパターン(例: "user:*")を使用できます。結果は、キーパターンをテーブル名として使用した場合と同じになります。これにより、複数の Redis キーを一度に取得できます。まず、パターンに一致する複数のキーを追加してみましょう:

> hmset user:1000 name "John Smith" email "[email protected]" password "s3cret"
OK
> hmset user:1001 name "Mary Jones" password "hidden" email "[email protected]"
OK

WHERE 句の key カラムの条件としてテーブルパターンを使用する場合は、テーブル名として "Redis" を使用する必要があります。ドライバーはパターンに一致するすべての Redis キーバリューペアを取得します。期待される結果を以下に示します:

SELECT * FROM Redis WHERE key = 'user:*'

RedisKey ValueIndex Value RedisType ValueScore
user:1000 name John Smith Hash NULL
user:1000 email [email protected] Hash NULL
user:1000 password s3cret Hash NULL
user:1001 name Mary Jones Hash NULL
user:1001 email [email protected] Hash NULL
user:1001 password hidden Hash NULL

接続プロパティを使用する



サードパーティのツールやアプリでドライバーを使用してデータに接続する場合、クエリの形成方法やドライバーへの送信方法を制御できないことがよくあります。このような場合は、接続プロパティを使用してドライバーを直接設定し、データの解釈方法を調整するのが効果的です。Redis ドライバーでは、DefineTablesTablePattern という2つのプロパティを使用します。

このセクションでは、Redis インスタンスに以下のハッシュを作成します:

> hmset user:1000 name "John Smith" email "[email protected]" password "s3cret"
OK
> hmset user:1001 name "Mary Jones" email "[email protected]" password "hidden"
OK
> hmset user:1002 name "Sally Brown" email "[email protected]" password "p4ssw0rd"
OK
> hmset customer:200 name "John Smith" account "123456" balance "543.21"
OK
> hmset customer:201 name "Mary Jones" account "123457" balance "654.32"
OK
> hmset customer:202 name "Sally Brown" account "123458" balance "765.43"
OK

これらのプロパティを使用してドライバーの動作を定義すると、Redis キーがピボットされ、定義内のパターンに一致する各 Redis キーがテーブル内の単一行として表されます。その Redis キーに関連付けられた各値がテーブルのカラムになります。これは各 Redis データ型によって動作が異なりますが、この記事ではハッシュに焦点を当てて説明します。

DefineTables プロパティ

DefineTables 接続プロパティを使用すると、特定のパターンに一致するすべての Redis キーを集約して、さまざまなツールやアプリに表示されるテーブル名を明示的に定義できます。設定するには、プロパティを名前と値のペアをカンマで区切った文字列に設定します。名前はテーブル名、値はそのテーブルに Redis キーを割り当てるために使用するパターンです。

DefineTables=Users=user:*,Customers=customer:*;

上記のようにプロパティを設定すると、使用しているツールやアプリで Users テーブルと Customers テーブルが公開されます。テーブルをクエリすると、以下の結果が表示されます:

SELECT * FROM Users

RedisKey name email password
user:1000 John Smith [email protected] s3cret
user:1001 Mary Jones [email protected] hidden
user:1002 Sally Brown sally.b@example p4ssw0rd

SELECT * FROM Customers

RedisKey name account balance
customer:200 John Smith 123456 543.21
customer:201 Mary Jones 123456 654.32
customer:202 Sally Brown 123456 765.43

TablePattern プロパティ

TablePattern 接続プロパティを使用すると、ドライバーがテーブルを定義する方法を決定するセパレータを定義できます。上記の Redis キーの場合、セパレータが ":" に設定されていると、usercustomer がテーブルとして定義されます。これは、各 Redis キーのユニークな部分が ":" の後に表示されるためです。テーブル構造を異なる方法で構成する必要がある場合、より深く掘り下げるために、セパレータを複数含めることができます。プロパティをテーブル構造を定義するために必要なセパレータを含むパターンに設定してください。以下はデフォルト値です。

TablePattern=*:*;

上記のようにプロパティを設定すると、使用しているツールやアプリで user テーブルと customer テーブルが公開されます。テーブルをクエリすると、以下の結果が表示されます:

SELECT * FROM user

RedisKey name email password
user:1000 John Smith [email protected] s3cret
user:1001 Mary Jones [email protected] hidden
user:1002 Sally Brown sally.b@example p4ssw0rd

SELECT * FROM customer

RedisKey name account balance
customer:200 John Smith 123456 543.21
customer:201 Mary Jones 123456 654.32
customer:202 Sally Brown 123456 765.43

詳細情報と無料トライアル

CData の Redis ドライバーを使用すると、標準ベースの SQL ライクなアクセスで Redis データを操作できます。Redis の高速性と、ADO.NET、JDBC、ODBC などの標準ドライバーテクノロジーの利便性を組み合わせることができます。CData Redis ドライバーの詳細については、製品ページをご覧ください。30日間の無料トライアルでお試しいただけます。ご不明な点がございましたら、サポートチームまでお問い合わせください。

始める準備はできましたか?

Redis 用ドライバーの詳細、または無料トライアルをダウンロード:

今すぐダウンロード