跳至主要内容

Redis

此引擎允许将 ClickHouse 与 Redis 集成。对于 Redis 使用键值模型,我们强烈建议您仅以点的方式查询它,例如 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 数据库索引,范围从 0 到 15,默认为 0。
  • password — 用户密码,默认为空字符串。
  • pool_size — Redis 最大连接池大小,默认为 16。
  • primary_key_name - 列列表中的任何列名。
序列化

PRIMARY KEY 仅支持一列。主键将以二进制形式序列化为 Redis 键。除主键外的其他列将以二进制形式序列化为 Redis 值,并按相应的顺序排列。

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

过滤

具有 key equalsin 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,但它有一些限制

  1. 在极少数情况下,当 Redis 正在重新哈希时,扫描查询可能会产生一些重复的键。有关详细信息,请参阅 Redis Scan
  2. 在扫描期间,可能会创建和删除键,因此结果数据集可能无法表示时间点上的有效数据。