当前位置: 首页 > 知识库问答 >
问题:

用于维护每个用户的有界列表的最佳Cassandra数据模型

弓宏茂
2023-03-14

我有包含用户与网站交互的Kafka流,因此每个事件都有时间戳和有关事件的信息。对于每个用户,我想将最后K个事件存储在Cassandra中(例如100个事件)。

我们的网站不断遇到机器人/重度用户,这就是我们想要限制事件的原因,只是为了考虑“正常”用户。

我目前在Cassandra中拥有当前的数据模型:

 user_id, event_type, timestamp, event_blob 

在哪里

 <user_id, event_type> = partition key,   timestamp = clustering key

现在,只要有新的事件发生,我们就在Cassandra中写一个新的记录,然后我们去清理“较重的”分区(即事件的计数

对于这种情况,你有什么更好的桌子设计建议吗?有没有办法告诉Cassandra最多只为partition存储K个元素,用FIFO的方式让旧的过期?或者有没有我可以选择的更好的桌子设计?

共有2个答案

籍弘伟
2023-03-14

现有实现的问题在于,删除操作会创建逻辑删除,最终导致读取延迟。不建议创建过多的逻辑删除。

基于计数(每个分区的行数)的 FIFO 实现是不可能的。对于您的用例,更好的方法是不删除同一表中的记录。使用 Spark 将表迁移到新的临时表中,并在迁移过程中删除多余的记录。像这样:

1)创建一个新表

2)使用Spark,从原始表中读取,迁移所有必需的记录(过滤额外的记录)并写入新的临时表。

3)截断原始表格。请注意,截断操作不会创建墓碑。

4) 使用Spark将所有内容从临时表迁移回原始表。

5) 截断临时表。

您可以在应用程序的维护时段内执行此操作(例如每月一次),直到那时您可以使用每个分区限制为 100 来限制读取。

巴英韶
2023-03-14

对于这种情况,你有什么更好的桌子设计建议吗?

当对这样的场景进行数据建模时,我推荐一种模式,它利用了三件事:

  • 表上设置的默认 TTL。
  • 按降序对时间分量进行聚类分析。
  • 调整查询以使用时间戳上的范围,从不查询超过 TTL 的数据。

TTL:

稍后,我们去清理“较重”的分区

清理工作(平均)需要多长时间?我要做的一件事是,在你的团队通常必须清理它们之前,在那张桌子上使用一个TTL来设置大约最大时间量。

聚类键,降序:

所以你的PRIMARY KEY定义看起来像这样:

PRIMARY KEY ((user_id,event_type),timestamp)

确保您也在时间戳上按降序聚类。

WITH CLUSTERING ORDER BY (timestamp DESC)

这对于与您的TTL一起使用很重要。在这里,您的墓碑位于分区的“底部”(在时间戳降序排序时),最近的数据(您关心的数据)位于分区的“顶部”。

范围查询:

最后,确保查询的时间戳上有一个范围组件。

例如:如果今天是11号,而我的TTL是5天,那么我可以在不拉回墓碑的情况下查询最近4天的数据:

SELECT * FROM events
WHERE user_id = 11111 AND event_type = 'B'
AND timestamp > '2020-03-07 00:00:00';
 类似资料:
  • 问题内容: 我有如下内容: 我对基本图片有2个问题: 1.如何获取标签? 通常,我是从dockerhub获得的,也就是说,我可以从dockerhub的openjdk存储库中获得。 如果我可以从任何本地docker命令获取所有标签,那么我不需要访问Web来获取标签,效率真的有点低吗? 2.基本图像安全吗? 我的意思是说我的基本形象是否一直存在? 查看上面的openjdk回购,这是一个官方回购。 我发

  • 我有一个类似于以下内容: 我有2个关于基本图像的问题: 通常,我从dockerhub获取它,比如说,我可以从dockerhub的openjdk存储库中获取它。 如果我可以从任何本地docker命令获取所有标签,那么我就不需要访问web来获取标签,真的有点低效率吗? 我是说如果我的基本形象一直在那里? 看看上面的openjdk repo,它是一个官方的repo。 我发现只有供我选择。但我认为在这个过

  • 我是Cassandra的新手,正在寻找一个关于如何为具有以下一般结构的数据建模的最佳实践: 对于不同的用户,附加的数据字段不一定相同(字段的名称或这些字段的类型) 示例(csv格式:) 我考虑过的几个选择: null 每个User_id创建Keyspace 每个关键字空间创建表“data” 备注: null null 创建多个keyspaces(例如“x”个keyspaces),每个keyspac

  • 问题内容: 我的情况如下:我有一个数据表(少数字段,少于一百行),该数据表在程序中广泛使用。我还需要这些数据具有持久性,因此我将其另存为CSV并在启动时加载。我之所以选择不使用数据库,是因为每个选项(甚至是SQLite)对于我的卑微要求都是过高的(另外- 我希望能够以一种简单的方式离线编辑值,没有什么比记事本更简单的了)。 假设我的数据如下所示(在文件中用逗号分隔,没有标题,这只是一个示例): 笔

  • 我是Cassandra数据建模的新手,如果可能的话,我需要在单行中容纳多维数据(是的,我知道Cassandra是柱状存储)。我的示例数据集(试图简化我的用例,忍受我的格式化) 时间戳、交易id、项目代码、用户id、支付方式 20130304221518,abcd,3,6,信用卡 20130304221519,efgh,4,5,现金配送 20130305180402,ijkl,4,5,现金交付 例如

  • Navicat 为维护 Oracle 用户提供完整的解决方案。 在对象选项卡中选择用户。 右击已选择的用户。 选择“维护”,然后从弹出式菜单中选择一个维护选项。 选项 描述 密码过期 设置用户的密码为过期。 锁定帐号 锁定用户的帐号和禁用访问。 解除锁定帐号 解除锁定用户的帐号和启用访问。