Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以使为on-topic

2年前关闭。



Improve this question





我正在考虑使用DynamoDB生成用户供稿。
我将用户ID(哈希)与PostId(范围)存储在一起。但是我只需要在数据库中保留最后3000个帖子。因此,我正在考虑进行后台任务以清理表。
这是合理的做法吗?我不确定这种类型的范围查询是否会相当快地工作,因为我有大约2500万用户记录。

请提出可能可行的任何其他选项(redis中的扇出除外)。

最佳答案

您的案例是典型的时序数据场景,随着时间的流逝,记录变得过时了。您需要注意两个主要因素:


确保您的表具有均匀的访问模式


如果将所有帖子放在一个表中,并且最近发布的帖子被更频繁地访问,则预配置的吞吐量将无法有效使用。
您应该将访问量最大的项目分组在一个表中,以便可以针对所需访问权限适当调整预配置的吞吐量。此外,请确保正确定义Hash Key that will allow even distribution of your data across multiple partitions


以最有效的方式(努力,性能和成本合理)删除过时的数据


该文档建议将数据划分到不同的表中,以便一旦记录过时就可以删除或备份整个表(请参阅下面的更多详细信息)。

例如,您可以按月对表进行细分:

Posts_April, Posts_May, etc


或按计数,每个表包含最大记录数:

Posts_1, Posts_2, Posts_3, etc


在这种情况下,一旦当前表达到最大记录数,就创建一个新表,并在需要进行清理时删除/备份最旧的表。

我可能需要有关您的用例的其他信息,以便为您提供有关如何利用这种方法的更好的示例。

在下面找到一些以编程方式创建和删除表所需的操作参考:

建立表格
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html

删除表格
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html

这是文档中介绍与时间序列数据相关的最佳做法的部分:


了解时间序列数据的访问模式

对于您创建的每个表,您指定吞吐量
要求。 DynamoDB分配和保留资源来处理您的
持续低延迟的吞吐量要求。设计时
您的应用程序和表,您应该考虑应用程序的
访问模式以最有效地利用表格的
资源。

假设您设计了一个表格来跟踪您网站上的客户行为,
例如他们点击的网址。您可以使用哈希和
具有客户ID作为哈希属性的范围类型主键,以及
日期/时间作为范围属性。在此应用程序中,客户数据
随着时间的推移无限增长;但是,应用程序可能会显示
表格中所有项目的访问方式不均匀
最新的客户数据更相关,您的应用程序可能
随着时间的流逝,更频繁地访问最新项目
访问较少,最终很少访问较旧的项目。如果
这是一种已知的访问模式,您可以考虑一下
设计表架构时。而不是将所有项目存储在
一个表,则可以使用多个表来存储这些项目。对于
例如,您可以创建表来存储每月或每周数据。对于
该表存储最近一个月或一周中的数据,其中数据
访问速率高,要求更高的吞吐量并用于表存储
较旧的数据,您可以降低吞吐量并节省资源。

您可以通过将“热门”项目存储在一个表中来节省资源
更高的吞吐量设置,并在另一个表中使用“冷”项
较低的吞吐量设置。您可以删除旧项目,只需删除
桌子。您可以选择将这些表备份到其他存储
诸如Amazon Simple Storage Service(Amazon S3)之类的选项。删除
整个表格比删除项目效率更高
一对一,这实际上使写入吞吐量加倍
与删除操作一样多的删除操作。


资源:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

基于其他评论的更新的答案:

“因此,用户ID将是我的哈希键。我需要的是清理过程……显然,基于日期的单独表方法将无法工作,因为数据不是按时间范围而是按计数进行过滤。在其他工作中,我需要x每个用户的最新记录数量。为使记录增长到x数量以上,我需要进行清理。”

在这种情况下,您几乎可以将Hash Key定义为UserId,将PostId定义为Range Key

如果每个用户最多可以有10个帖子,则Range Key最大值为10。当您达到最大数量并且用户添加新帖子时,您将从1开始自动替换该用户的最旧帖子(请参见DynamoDB PutItem操作以获取更多详细信息)。最后,您只是为每个用户创建一个循环发布列表。

这样,您实质上就是在添加新帖子,并通过一次写入操作立即执行清理过程。

您可能需要创建一个支持表,其中包含每个PostId发布的最后一个User。如果您选择仅将哈希键定义为UserId,则可以使用GetItem操作查找特定用户的最后一个PostId(既便宜又快速)。该表的架构可以很简单:

UserIdHash Key

LastPostId(数字属性)-不是范围键

例如,假设您需要从UserId = ABC获取最近的三个最新帖子:

第1步。在提供用户ID GetItemLastPostIds_Table上使用(Hash Key) = "ABC"

如果LastPostId = 4

第2步。在BatchGetItem上使用Posts_Table来获取具有UserId (Hash Key) = "ABC"PostId (Range Key) = 4, 3 and 2的记录。

从返回的PostId中,您会知道4是最新的,而2是最旧的。

警告:使用BatchGetItem返回许多记录may cause sudden bursts of reading activity。通过将读取操作分成几个较小的批次,可以轻松解决此问题。

PutItem有助于实现Post持久性逻辑:


PutItem
创建新项目,或将旧项目替换为新项目。如果
与新项目具有相同主键的项目已存在
在指定的表中,新项目将完全替换现有项目
项目。您可以执行条件投放操作(如果需要,添加新的项目
具有指定主键的一个不存在),或替换一个
现有项目(如果具有某些属性值)。


资料来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html

07-24 09:39
查看更多