如果我理解正确:
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 项目缓存
DyanmoDBDAX
带来了Item Cache,其中单个 Item 被存储并从 DAX 返回。但是Item Cache
仅限于仅GetItem
和BatchGetItem
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.concepts.html#DAX.concepts.item-cache
分段 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
https://www.baeldung.com/hibernate-second-level-cache