用于缓存应用程序数据的Cassandra架构

用于缓存应用程序数据的Cassandra架构,cassandra,schema,cql3,Cassandra,Schema,Cql3,我有一个程序,可以做一些相当密集的计算,我想把这些计算的结果缓存在Cassandra表中。这样做的最佳模式是什么 目前,我正在使用以下模式: CREATE TABLE raw_data_cache ( id uuid, buckets int, start_time timestamp, end_time timestamp, time timestamp, data list<float>, PRIMARY KEY(id,bu

我有一个程序,可以做一些相当密集的计算,我想把这些计算的结果缓存在Cassandra表中。这样做的最佳模式是什么

目前,我正在使用以下模式:

CREATE TABLE raw_data_cache (
    id uuid,
    buckets int,
    start_time timestamp,
    end_time timestamp,
    time timestamp,
    data list<float>,
    PRIMARY KEY(id,buckets,start_time,end_time,time)
) with GC_Grace_Seconds=1;
这个模式的问题是,我最终得到了一致的读取超时,我认为这是由于墓碑的数量:
read0 live和3777400个墓碑单元格
(取自cqlsh中的“跟踪打开”)

我可以通过使用
nodetool
摆脱所有这些问题,但我不想每隔几分钟就这么做。是否有更好的模式或用法可以改进这种情况

编辑
raw\u data\u cache
是一个表,用于存储经过处理的
raw\u data
。在存储
原始数据时,我遵循了似乎是传统的智慧,除了
列表
(但这是因为我每次有几个不同的输入,我希望一次获得所有输入)。以下是基本时间序列:

CREATE TABLE raw_data(
   id uuid,
   time timestamp,
   data list<float>,
   PRIMARY KEY (id, time)
);
创建表原始数据(
id uuid,
时间戳,
数据列表,
主键(id、时间)
);

我使用
raw\u data\u cache
的目标是将处理过的较小版本的raw\u数据保存几个小时。

我认为您的数据模型并不适合这种使用。我认为你应该使用一种更基于时间序列的方法。包含每个要缓存的时间段的列。我不是100%确定,但认为GC\u Grace\u Seconds=1可能不是您真正想要的

这是Cassandra数据建模的最佳资源之一:。此外,还有3个关于这个主题的视频是由同一位作者拍摄的

如果您想优化以首先获取最新的项目,您可以执行以下操作:

CREATE TABLE raw_data(
   id uuid,
   time timestamp,
   data list<float>,
   PRIMARY KEY (id, time)
) WITH CLUSTERING ORDER BY (event_time DESC);
CREATE TABLE summarized_data_cache(
    id uuid,
    time_bucket text,
    time timestamp,
    data list<float>,
    PRIMARY KEY ((id, time_bucket), time)
);
创建表原始数据(
id uuid,
时间戳,
数据列表,
主键(id、时间)
)按事件时间描述进行聚类;
这将使最新的事件优先,这在缓存中很有用。如果你想要基于小时数的桶。你可以使用之前在日期示例中使用的相同技巧,该日期包括“2013-10-27-12”小时,并且它会将所有时间都包含在该桶中。因此,也许你可以尝试以下方式:

CREATE TABLE raw_data(
   id uuid,
   time timestamp,
   data list<float>,
   PRIMARY KEY (id, time)
) WITH CLUSTERING ORDER BY (event_time DESC);
CREATE TABLE summarized_data_cache(
    id uuid,
    time_bucket text,
    time timestamp,
    data list<float>,
    PRIMARY KEY ((id, time_bucket), time)
);
创建表摘要\u数据\u缓存(
id uuid,
时间(bucket text),,
时间戳,
数据列表,
主键((id,时间段),时间)
);

这样写起来很快,但检索起来也很快,因为所有内容都将存储在一个宽行中。

我已经为有关上下文的问题添加了更多信息。原始数据缓存(或等效缓存)需要存储处理后的原始数据版本,该版本根据您共享的链接进行建模。谢谢嗯,谢谢((),)主键结构。这似乎减少了20%左右的阅读时间。就特定情况而言,除法是任意的(没有小时、分钟或秒的除法),所以我不能预先打破它。整个缓存(对于特定的主键)总是一次读取。