このエンジンでは、ClickHouse を Redis と連携できます。Redis はキー・バリューモデルを採用しているため、where k=xx や where k in (xx, xx) のようなポイントクエリでのみ使用することを強く推奨します。
テーブルの作成
CREATE TABLE [IF NOT EXISTS] [db.]table_name
(
name1 [type1],
name2 [type2],
...
) ENGINE = Redis({host:port[, db_index[, password[, pool_size]]] | named_collection[, option=value [,..]] })
PRIMARY KEY(primary_key_name);エンジンパラメータ
host:port— Redis server のアドレスです。port は省略でき、その場合はデフォルトの Redis ポート 6379 が使用されます。db_index— Redis の DB 索引です。範囲は 0〜15 で、デフォルトは 0 です。password— ユーザーパスワードです。デフォルトは空文字列です。pool_size— Redis の最大接続プールサイズです。デフォルトは 16 です。primary_key_name- カラム一覧内の任意のカラム名です。
引数は 名前付きコレクション を使用して渡すこともできます。この場合、host と port は個別に指定する必要があります。この方法は本番環境では推奨されます。現時点では、名前付きコレクション を使用して Redis に渡すすべてのパラメータが必須です。
使用例
通常の引数を使って、Redisエンジンを使用する ClickHouse のテーブルを作成します:
CREATE TABLE redis_table
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = Redis('redis1:6379') PRIMARY KEY(key);または、名前付きコレクションを使用します:
<named_collections>
<redis_creds>
<host>localhost</host>
<port>6379</port>
<password>****</password>
<pool_size>16</pool_size>
<db_index>0</db_index>
</redis_creds>
</named_collections>CREATE TABLE redis_table
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = Redis(redis_creds) PRIMARY KEY(key);挿入:
INSERT INTO redis_table VALUES('1', 1, '1', 1.0), ('2', 2, '2', 2.0);SELECT COUNT(*) FROM redis_table;┌─count()─┐
│ 2 │
└─────────┘SELECT * FROM redis_table WHERE key='1';┌─key─┬─v1─┬─v2─┬─v3─┐
│ 1 │ 1 │ 1 │ 1 │
└─────┴────┴────┴────┘SELECT * FROM redis_table WHERE v1=2;┌─key─┬─v1─┬─v2─┬─v3─┐
│ 2 │ 2 │ 2 │ 2 │
└─────┴────┴────┴────┘更新:
主キーは更新できません。
ALTER TABLE redis_table UPDATE v1=2 WHERE key='1';削除:
ALTER TABLE redis_table DELETE WHERE key='1';Truncate:
Redis DB を非同期に flush します。Truncate は SYNC モードにも対応しています。
TRUNCATE TABLE redis_table SYNC;JOIN:
他のテーブルと結合します。
SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key;制限事項
Redis エンジン は、where k > xx のようなスキャンクエリもサポートしていますが、いくつか制限があります。
- スキャンクエリでは、リハッシュ中のごくまれなケースでキーが重複して返されることがあります。詳細は Redis Scan を参照してください。
- スキャン中にキーが作成または削除される可能性があるため、結果として得られるデータセットは、ある時点における整合した状態を表すものにはなりません。