Redis データへの SQL アクセス
この記事では、CData ドライバーで Redis および Redis Enterprise に保存されたデータを扱う方法について説明します。従来、Redis のようなキーバリュー型データストアを BI、レポート作成、ETL ツールにインポートすることは困難か、あるいは不可能でした。CData ドライバーを使用すると、従来のデータベースモデルを構築するためのさまざまなアプローチが可能になり、お好みの BI、レポート作成、ETL、カスタムアプリケーションで Redis データを簡単に操作できるようになります。
Redis データの解釈方法
- Redis キーをテーブル名として使用する
- キーパターンをテーブル名として使用する
- SQL クエリの WHERE 句でキーパターンを使用する
- 接続プロパティを使用する: DefineTables と TablePattern
最初の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 で文字列を作成します:
> set mykey somevalue OKmykey に対して SELECT クエリを実行すると、ドライバーは以下の結果を返します:
SELECT * FROM mykey
| RedisKey | ValueIndex | Value | RedisType | ValueScore |
|---|---|---|---|---|
| mykey | 1 | somevalue | String | NULL |
Redis リスト
Redis でリストを作成します:
> rpush mylist A B C (integer) 3mylist に対して 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) 3myset に対して 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) 9hackers に対して 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 OKuser: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 protected] | Hash | NULL | |
| user:1000 | password | s3cret | Hash | NULL |
| user:1001 | name | Mary Jones | Hash | NULL |
| user:1001 | [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 protected] | Hash | NULL | |
| user:1000 | password | s3cret | Hash | NULL |
| user:1001 | name | Mary Jones | Hash | NULL |
| user:1001 | [email protected] | Hash | NULL | |
| user:1001 | password | hidden | Hash | NULL |
接続プロパティを使用する
サードパーティのツールやアプリでドライバーを使用してデータに接続する場合、クエリの形成方法やドライバーへの送信方法を制御できないことがよくあります。このような場合は、接続プロパティを使用してドライバーを直接設定し、データの解釈方法を調整するのが効果的です。Redis ドライバーでは、DefineTables と TablePattern という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 | 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 キーの場合、セパレータが ":" に設定されていると、user と customer がテーブルとして定義されます。これは、各 Redis キーのユニークな部分が ":" の後に表示されるためです。テーブル構造を異なる方法で構成する必要がある場合、より深く掘り下げるために、セパレータを複数含めることができます。プロパティをテーブル構造を定義するために必要なセパレータを含むパターンに設定してください。以下はデフォルト値です。
TablePattern=*:*;
上記のようにプロパティを設定すると、使用しているツールやアプリで user テーブルと customer テーブルが公開されます。テーブルをクエリすると、以下の結果が表示されます:
SELECT * FROM user
| RedisKey | name | 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日間の無料トライアルでお試しいただけます。ご不明な点がございましたら、サポートチームまでお問い合わせください。