跳到主要内容
跳到主要内容

Redis

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 仅支持一列。主键将以二进制形式序列化为 Redis 键。主键以外的列将以二进制形式按相应顺序序列化为 Redis 值。

参数也可以使用命名集合传递。在这种情况下,hostport 应单独指定。建议在生产环境中使用此方法。目前,所有使用命名集合传递给 redis 的参数都是必需的。

过滤

使用键等于或 in 过滤的查询将被优化为从 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>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 正在重新哈希时),扫描查询可能会产生一些重复的键。有关详细信息,请参阅 Redis Scan
  2. 在扫描期间,键可能会被创建和删除,因此结果数据集不能代表有效的时间点。