缓存添加到 (DynamoDB) 的大数据的最佳方法
Best way to cache large data that is added to (DynamoDB)
我目前正在处理存储在 DynamoDB 中的大量数据。一旦数据进入数据库,它就永远不会改变,但新数据会持续流入数据库。我的问题是如何执行数据缓存(如果可能,使用 DAX)来限制我必须直接查询数据库的数据量。
比如我想要10:00上午到11:00上午的数据,那么我可以用参数查询:
start_time = 10:00 上午,
end_time = 11:00 上午
此查询的响应将缓存在 DAX 中供以后使用。我的问题是,当我在 10:00 AM 和 1:00 PM 之间获取数据时,我必须查询已经在我的缓存中的数据(这是因为缓存是基于参数的,我有新的参数)。
我的第一个想法是将数据分成小部分进行缓存,然后进行多次查询。例如:
请求 10 - 10:15 AM 数据和缓存,然后请求 10:15 - 10:30 AM 数据然后缓存,依此类推。通过这样做,我可以进行许多较小的查询,但不会在我的缓存中有重叠数据。这是最好的方法还是我应该缓存重叠数据。感谢您的帮助。
如果我理解正确的话:
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 )
基本上您可以在缓存中拥有完整的数据集,但除非您使用相同的缓存键(这有助于导致缓存命中),否则缓存永远不会 return 巧妙地为您提供“来自 Cache
的完整数据的子集”
DynamoDB DAX 项目缓存
DyanmoDB DAX
带来了 Item Cache,其中存储了单个项目并从 DAX returned。但是 Item Cache
仅限于 GetItem
和 BatchGetItem
分段 DDB 查询
如果DynamoDBDAX
不行,或者需要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
我目前正在处理存储在 DynamoDB 中的大量数据。一旦数据进入数据库,它就永远不会改变,但新数据会持续流入数据库。我的问题是如何执行数据缓存(如果可能,使用 DAX)来限制我必须直接查询数据库的数据量。
比如我想要10:00上午到11:00上午的数据,那么我可以用参数查询:
start_time = 10:00 上午, end_time = 11:00 上午
此查询的响应将缓存在 DAX 中供以后使用。我的问题是,当我在 10:00 AM 和 1:00 PM 之间获取数据时,我必须查询已经在我的缓存中的数据(这是因为缓存是基于参数的,我有新的参数)。
我的第一个想法是将数据分成小部分进行缓存,然后进行多次查询。例如:
请求 10 - 10:15 AM 数据和缓存,然后请求 10:15 - 10:30 AM 数据然后缓存,依此类推。通过这样做,我可以进行许多较小的查询,但不会在我的缓存中有重叠数据。这是最好的方法还是我应该缓存重叠数据。感谢您的帮助。
如果我理解正确的话:
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 )
基本上您可以在缓存中拥有完整的数据集,但除非您使用相同的缓存键(这有助于导致缓存命中),否则缓存永远不会 return 巧妙地为您提供“来自 Cache
的完整数据的子集”DynamoDB DAX 项目缓存
DyanmoDB DAX
带来了 Item Cache,其中存储了单个项目并从 DAX returned。但是 Item Cache
仅限于 GetItem
和 BatchGetItem
分段 DDB 查询
如果DynamoDBDAX
不行,或者需要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