Redis
此引擎允许将 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 服务器地址,您可以忽略端口,默认使用 Redis 端口 6379。db_index
— Redis 数据库索引,范围从 0 到 15,默认为 0。password
— 用户密码,默认为空字符串。pool_size
— Redis 最大连接池大小,默认为 16。primary_key_name
- 列列表中的任何列名。
序列化
PRIMARY KEY
仅支持一列。主键将以二进制形式序列化为 Redis 键。除主键外的其他列将以二进制形式序列化为 Redis 值,并按相应的顺序排列。
参数也可以使用 命名集合 传递。在这种情况下,应分别指定 host
和 port
。建议在生产环境中使用此方法。目前,使用命名集合传递给 redis 的所有参数都是必需的。
过滤
具有 key equals
或 in filtering
的查询将被优化为 Redis 中的多键查找。如果查询没有过滤键,则会发生全表扫描,这是一个繁重的操作。
使用示例
使用普通参数在 ClickHouse 中使用 Redis
引擎创建表
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 数据库。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
,但它有一些限制
- 在极少数情况下,当 Redis 正在重新哈希时,扫描查询可能会产生一些重复的键。有关详细信息,请参阅 Redis Scan。
- 在扫描期间,可能会创建和删除键,因此结果数据集可能无法表示时间点上的有效数据。