メインコンテンツまでスキップ
メインコンテンツまでスキップ

Redis

Not supported in ClickHouse Cloud

このエンジンは、ClickHouseをRedisと統合することを可能にします。Redisはkvモデルを使用するため、where k=xxwhere 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サーバーのアドレス。ポートを無視することができ、デフォルトのRedisポート6379が使用されます。
  • db_index — Redisのdbインデックスは0から15の範囲、デフォルトは0です。
  • password — ユーザーパスワード、デフォルトは空文字列です。
  • pool_size — Redisの最大接続プールサイズ、デフォルトは16です。
  • primary_key_name - カラムリストの任意のカラム名。
シリアル化

PRIMARY KEYは1つのカラムのみをサポートします。プライマリキーはRedisキーとしてバイナリにシリアル化されます。 プライマリキー以外のカラムは対応する順序でRedis値としてバイナリにシリアル化されます。

引数はnamed collectionsを使用して渡すこともできます。この場合、hostportは別々に指定する必要があります。このアプローチは、本番環境で推奨されます。この時点で、named collectionsを使用してRedisに渡されるすべてのパラメータは必須です。

フィルタリング

key equalsまたはin filteringを伴うクエリは、Redisからの複数キーのルックアップに最適化されます。フィルタリングキーなしのクエリでは、全テーブルスキャンが発生し、これは重い操作です。

使用例

プレーン引数を使用してRedisエンジンでClickHouseにテーブルを作成します:

CREATE TABLE redis_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = Redis('redis1:6379') PRIMARY KEY(key);

もしくはnamed collectionsを使用して:

<named_collections>
    <redis_creds>
        <host>localhost</host>
        <port>6379</port>
        <password>****</password>
        <pool_size>16</pool_size>
        <db_index>s0</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';

トランケート:

Redis dbを非同期でフラッシュします。また、TruncateはSYNCモードをサポートしています。

TRUNCATE TABLE redis_table SYNC;

結合:

他のテーブルと結合します。

SELECT * FROM redis_table JOIN merge_tree_table ON merge_tree_table.key=redis_table.key;

制限事項

Redisエンジンは、where k > xxのようなスキャンクエリもサポートしていますが、いくつかの制限があります:

  1. スキャンクエリは、リハッシュ中に非常にまれに重複したキーを生成する可能性があります。詳細はRedis Scanを参照してください。
  2. スキャン中にキーが作成され、削除される可能性があるため、結果のデータセットは有効な時点を表さないことがあります。