我可以将Clickhouse用作键值存储吗?

时间:2018-12-29 21:52:24

标签: key-value-store clickhouse

是否可以将Clickhouse用作键值存储,数据是否经常被覆盖,但很少读取?如果可能,我应该使用什么引擎?

2 个答案:

答案 0 :(得分:5)

ClickHouse不是针对该用例而构建的,它故意在其文档的首页中对此进行了说明。

  

何时不使用ClickHouse

     
      
  1. 事务性工作负载(OLTP)
  2.   
  3. 具有高请求率的键值访问
  4.   
  5. blob或文档存储
  6.   
  7. 过度标准化的数据
  8.   

但是,如果QPS较低,您仍然可以为点查询获得良好的延迟分数。 ClickHouse还提供了多种词典,可以更好地用作外部键值存储。还有一个StorageJoin引擎,支持joinGet功能,类似于redis的HGET操作。 PR之后,您可以覆盖StorageJoin中的现有密钥。

更新

PR被合并。这是一个孤立的示例。

首先按如下所示填充StorageJoin表:

CREATE TABLE my_fancy_kv_store (s String, x Array(UInt8), k UInt64)
ENGINE = Join(ANY, LEFT, s);

INSERT INTO my_fancy_kv_store VALUES ('abc', [0], 1), ('def', [1, 2], 2);

然后您可以将其用作字典(键值):

SELECT joinGet('my_fancy_kv_store', 'x', 'abc');
SELECT joinGet('my_fancy_kv_store', 'k', 'def');

答案 1 :(得分:0)

EmbeddedRocksDB 表引擎是最近添加的,可以提供帮助。

可以在此处找到更多信息:https://kb.altinity.com/engines/altinity-kb-embeddedrocksdb-and-dictionary

在我的测试中,与 MergeTree 相比,我发现 EmbeddedRocksDB 处理的 QPS 提高了 10-20 倍,响应速度提高了 10-100 倍。

它可能因用例而异,但它足以让我不必费心寻找单独的 Redis / RocksDB / DynamoDB 安装(因为在 CH 内拥有 KV 存储有助于跨 MT 和 EmbeddedRocksDB 加入,我真的不需要扩展到 redis / DDB 的限制)