缓存添加到(DynamoDB)中的大数据的最佳方式



我目前正在处理存储在DynamoDB中的大量数据。一旦数据进入数据库,它就永远不会改变,但新数据会源源不断地流入数据库。我的问题是如何执行数据缓存(如果可能的话,使用DAX(来限制我必须直接查询数据库的数据量。

例如,如果我想要上午10:00到上午11:00的数据,那么我可以使用以下参数进行查询:

start_time=上午10:00,end_time=上午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 )

基本上,您可以在Cache中拥有一组完整的数据,但除非您使用相同的缓存键(这有助于导致缓存命中(,否则Cache永远不会智能地返回您的"缓存";子集";的完整数据

DynamoDB DAX项目缓存

DyanmoDBDAX带来项目缓存,其中存储单个项目并从DAX返回。然而,Item Cache仅限于GetItemBatchGetItem

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.concepts.html#DAX.concepts.item-缓存

DDB碎片查询

如果DynamoDBDAX不可能,或者需要QueryScan操作。然后下一个更好的侵入性最小的技术是将DDB查询分段/划分为"0";较小的";查询,以便它们将导致更多的缓存命中

例如

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 blocks1 minute blocks甚至seconds block的粒度

但这项技术并非没有Cons,很明显,它现在必须进行的额外跳数/查询数需要考虑

应用程序ORM

解决这样的问题是应用程序ORM真正擅长的,例如Java开发中的Hibernate(但我最后检查了一下,Hibernate还不支持DynamoDB,尽管可以扩展和构建自定义策略(

您可以检查您的应用程序ORM是否支持DynamoDB

https://www.baeldung.com/hibernate-second-level-cache

最新更新