如何使用缓存系统处理大型动态数据

问题描述 投票:0回答:1

我想为我的 django Web 应用程序使用缓存系统,我一直在使用 django-cachepos 用于缓存我的数据,但现在我遇到了一些问题,例如报告的大数据,其中包括很多过滤器,并且在数据更新时应该在线。

现在我的响应时间太长(比如 12 13 秒),我需要你的一些指导来植入缓存系统或缓存策略,以帮助改进我的代码

考虑到应用程序将是一个大型项目,现在有 3 4 个来自所有内部人员的领导,并且不能停止在线

诗。我在其他一些端点上遇到了这个问题,请求的数据量很大

我尝试使用 Redis 函数来设置和获取数据,但我不知道如何将其与过滤器一起使用,甚至缓存响应数据

python django caching redis
1个回答
0
投票

看起来 django-cachepos 在底层使用了 Redis,这只是一个简单的键/值存储。这意味着对于每个查询,它将创建一个带有编码过滤器的键,并将结果作为值(在“def _cache_key(...)”下阅读here)。还有额外的逻辑用于确定所有需要失效的键(请阅读 invalidation.py here)。您无法控制此行为(例如更新缓存结果而不是驱逐它们),因此考虑其他策略可能意味着放弃 django-cachepos。

您说您的等待时间仍然很长(12-13 秒的请求),您需要进行更多挖掘才能了解原因。 django-cachepos 有用于分析this的统计数据。您应该检查缓存命中与未命中的百分比。我猜测,由于动态数据的性质(键在产生命中之前无效)以及过滤器的数量(如果后续查询在过滤器组合中是唯一的,则您将永远不会获得缓存命中),您的未命中次数多于命中次数并且始终查询数据库而不是缓存)。有限的缓存大小会放大这种行为(更少的空间意味着更多的驱逐,以便为新查询腾出空间)。

经过此分析,您应该考虑三件事:

  1. 保留 django-cacheops 并尝试在代码中应用部分或大部分过滤器(从缓存返回后过滤出更完整/通用的结果集)。一个很好的例子是,如果您总是查询最近 30 天的数据,只将此过滤器发送到 django-cachepos 并在代码中应用其他过滤器,这看起来像:
qs = Article.objects.filter(created_at__gte=thirty_days_ago).cache()
results = [row for row in qs if apply_filters(row, other_filters)]
  1. 放弃 django-cacheops。考虑使用更优化的 Redis datatypes 来满足您的检索需求。您可以学习如何使用为您的项目配置的 python redis 客户端django 缓存 来设置/获取。
  2. 完全放弃键/值缓存,并考虑另一个针对更快地检索动态数据而优化的辅助存储。请注意,这取决于数据(结构化或非结构化、时间序列、您所说的“大数据”有多大?)。我怀疑 elasticsearch/opensearch 将是一个值得考虑的好选择,但您没有提供足够的上下文。
© www.soinside.com 2019 - 2024. All rights reserved.