问题描述
我目前正在处理存储在 DynamoDB 中的大量数据。一旦数据进入数据库,它就永远不会改变,但新数据会不断地流入数据库。我的问题是如何执行数据缓存(如果可能,使用 DAX)来限制我必须直接查询数据库的数据量。
例如,如果我想要从上午 10:00 到上午 11:00 的数据,那么我可以使用以下参数进行查询:
开始时间 = 10:00 AM, 结束时间 = 上午 11:00
来自此查询的响应将缓存在 DAX 中以备后用。我的问题是,当我在上午 10:00 到下午 1:00 之间获取数据时,我必须查询缓存中已有的数据(这是因为缓存是基于参数的,而我有新参数)。
我的第一个想法是将数据缓存在小部分中,然后进行多次查询。例如:
请求上午 10-10:15 的数据和缓存,然后请求上午 10:15-10:30 的数据然后缓存,依此类推。通过这样做,我可以进行许多较小的查询,但我的缓存中不会有重叠的数据。这是最好的方法还是我应该缓存重叠的数据。任何帮助表示赞赏。
解决方法
如果我理解正确:
start_time = 10:00 AM,end_time = 11:00 AM ( Cache has no data,hits DynamoDB )
start_time = 10:00 AM,end_time = 11:00 AM ( Cache has this data,doesn't hit DynamoDB )
start_time = 10:00 AM,end_time = 10:30 AM ( Difference in cache keys,hits DynamoDB )
基本上你可以在缓存中有完整的数据集,但除非你使用相同的缓存键(这有助于导致缓存命中),缓存永远不会聪明地返回完整数据的“子集”来自缓存
DynamoDB DAX 项目缓存
DyanmoDB DAX
带来了项目缓存,其中存储了单个项目并从 DAX 返回。但是 Item Cache
仅限于 GetItem
和 BatchGetItem
分片 DDB 查询
如果 DynamoDB DAX
不可用,或者需要 Query
和 Scan
操作。然后下一个更好的最小侵入技术是将 DDB 查询分段/划分为“更小”的查询,以便它们会导致更多的缓存命中
例如
start_time = 10:00 AM,end_time = 10:15 AM
start_time = 10:15 AM,end_time = 10:30 AM
start_time = 10:30 AM,end_time = 10:45 AM
很少有优秀的第三方应用程序库可用于对查询键进行分区,您可以根据自己的性能选择从 15 minute blocks
到 1 minute blocks
甚至 seconds block
的粒度需要
但是这种技术也不是没有缺点,显然需要考虑它现在必须进行的额外跃点/查询数
应用 ORM
解决这些问题是应用程序 ORM 真正擅长的,例如 Hibernate
在 Java 开发的情况下(但我最后检查过,Hibernate 还没有对 DynamoDB 的支持,尽管它是可以扩展和构建自定义策略)
您可以检查您的应用程序 ORM 是否支持 DynamoDB