最近我遇到了一个著名的设计问题。“”
我发现的是为NoSQL星展担保的人,如DynamoDB或Cassandra。我已经读了几天关于Cassandra的文章,我想围绕这个DB为这个特定的问题设计我的解决方案。
创建表UrlMap(tiny_url文本主键,url文本);
这不是会导致很多分区吗?由于分区键可以接受大约68B值(使用6个char base64字符串)
这在某种程度上会影响整体读写性能吗?如果是这样的话,有什么更好的模型来定义表。
发布于 2022-03-05 08:55:19
Cassandra中数据建模的主要原则是为每个应用程序查询设计一个表。
对于URL缩短服务,主要的应用程序查询是为给定的微小URI检索等效的完整URL。在伪代码中,查询如下:
GET long url FROM datastore WHERE uri = ?请注意,为了服务的目的,我们不会存储web域名来使应用程序在任何领域可重用。过滤器(WHERE子句)是URI,所以这就是您想要的分区键,因此我们将相应地设计表:
CREATE TABLE urls_by_uri (
uri text,
long_url text,
PRIMARY KEY(uri)
)如果我们想检索http://tinyu.rl/abc123的URL,CQL查询是:
SELECT long_url FROM urls_by_uri WHERE uri = 'abc123'正如Phact和Andrew所指出的,没有必要担心您将存储在表中的分区(记录)的数量,因为您可以在Cassandra表中存储多达2^128个分区,这实际上是无限的。
在Cassandra中,使用Murmur3哈希算法(默认分区)将每个分区散列为一个令牌值。此实现将每个分区随机分布在集群中的所有节点上。同样的哈希算法用于确定哪个节点“拥有”分区,使得在Cassandra中检索(读取)非常快。
只要将SELECT查询限制在一个分区上,检索数据就会非常快。事实上,我与数百家拥有SLA的公司合作,在6-9毫秒之间读取95%的数据。这在Cassandra中是可以实现的,当您正确地建模数据并正确调整集群的大小时。干杯!
发布于 2022-03-05 02:12:02
很多分区都很好,可以把它看作是使用c*作为一个键值存储。
https://stackoverflow.com/questions/71358726
复制相似问题