Tam*_*ane 2 database amazon-web-services nosql amazon-dynamodb
我正在考虑使用DynamoDB来生成用户Feed.我将使用PostId(Range)存储UserId(Hash).但我需要在数据库中保留最后3000个帖子.所以我正在考虑有一个后台任务来清理表格.这样做有道理吗?我不确定这种类型的范围查询是否能够合理地快速运行,因为我有大约25mln用户记录.
请建议可能有效的任何其他选项(redis中的扇出除外).
您的案例是典型的时间序列数据场景,随着时间的推移,您的记录将变得过时.您需要注意两个主要因素:
如果您将所有帖子放在一个表中,并且更频繁地访问最新的帖子,则无法有效使用预配置的吞吐量.您应该将访问最多的项目分组到一个表中,以便可以针对所需的访问权限正确调整预配置的吞吐量.此外,请确保正确定义哈希密钥,以便在多个分区之间均匀分布数据.
文档建议将数据分段到不同的表中,以便在记录过时后删除或备份整个表(请参阅下面的详细信息).
例如,您可以按月对表进行分段:
Posts_April, Posts_May, etc
Run Code Online (Sandbox Code Playgroud)
或者通过Count,每个表包含最多记录数:
Posts_1, Posts_2, Posts_3, etc
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一旦当前的表达到最大记录数,就创建一个新表,并在需要进行清理时删除/备份最旧的表.
我可能需要一些有关您的用例的其他信息,以便为您提供有关如何利用此方法的更好示例.
在下面找到一些对以编程方式创建和删除表所需的操作的引用:
创建表 http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html
删除表 http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html
以下是解释与时间序列数据相关的最佳实践的文档部分:
了解时间序列数据的访问模式
对于您创建的每个表,您可以指定吞吐量要求.DynamoDB通过持续的低延迟分配和预留资源来处理吞吐量要求.在设计应用程序和表时,应考虑应用程序的访问模式,以便最有效地使用表的资源.
假设您设计了一个表来跟踪您网站上的客户行为,例如他们点击的网址.您可以使用散列和范围类型主键设计表,其中Customer ID作为散列属性,日期/时间作为range属性.在此应用程序中,客户数据随着时间的推移无限增长; 但是,应用程序可能会在表中的所有项目中显示不均匀的访问模式,其中最新的客户数据更相关,并且您的应用程序可能更频繁地访问最新项目,并且随着时间的推移这些项目访问较少,最终旧项目很少访问.如果这是一种已知的访问模式,则可以在设计表模式时将其考虑在内.您可以使用多个表来存储这些项,而不是将所有项存储在单个表中.例如,您可以创建表来存储月度或每周数据.对于存储数据访问率较高的最近一个月或一周的数据的表,请求更高的吞吐量,对于存储旧数据的表,您可以调低吞吐量并节省资源.
您可以通过将"热"项存储在具有较高吞吐量设置的一个表中,并将"冷"项存储在具有较低吞吐量设置的另一个表中来节省资源.您只需删除表即可删除旧项.您可以选择将这些表备份到其他存储选项,例如Amazon Simple Storage Service(Amazon S3).删除整个表比逐个删除项目效率要高得多,这实际上使写入吞吐量翻了一倍,就像执行put操作一样多的删除操作.
资料来源: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 (这非常便宜且快速).该表的架构可以简单到:
UserId(Hash Key)
LastPostId (数字属性) - 不是范围键
举个例子,假设您需要获取最近三个最近发布的帖子UserId = ABC:
步骤1.使用GetItem上LastPostIds_Table提供用户ID(Hash Key) = "ABC"
如果LastPostId = 4那么
第2步.使用BatchGetItem上Posts_Table与得到记录UserId (Hash Key) = "ABC"和PostId (Range Key) = 4, 3 and 2.
从返回的PostIds中你会知道4是最新的,2是最老的.
警告:使用BatchGetItem返回许多记录可能会导致突然爆发的阅读活动.只需将读取操作分成几个较小的批次即可轻松解决此问题.
这PutItem有助于实现Post持久性逻辑:
PutItem 创建一个新项目,或用新项目替换旧项目.如果指定表中已存在与新项目具有相同主键的项目,则新项目将完全替换现有项目.您可以执行条件put操作(如果不存在具有指定主键的新项,则添加新项),或者如果现有项具有某些属性值,则替换现有项.
资料来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |