我想为我的 django Web 应用程序使用缓存系统,我一直在使用 django-cachepos 用于缓存我的数据,但现在我遇到了一些问题,例如报告的大数据,其中包括很多过滤器,并且在数据更新时应该在线。
现在我的响应时间太长(比如 12 13 秒),我需要你的一些指导来植入缓存系统或缓存策略,以帮助改进我的代码
考虑到应用程序将是一个大型项目,现在有 3 4 个来自所有内部人员的领导,并且不能停止在线
诗。我在其他一些端点上遇到了这个问题,请求的数据量很大
我尝试使用 Redis 函数来设置和获取数据,但我不知道如何将其与过滤器一起使用,甚至缓存响应数据
看起来 django-cachepos 在底层使用了 Redis,这只是一个简单的键/值存储。这意味着对于每个查询,它将创建一个带有编码过滤器的键,并将结果作为值(在“def _cache_key(...)”下阅读here)。还有额外的逻辑用于确定所有需要失效的键(请阅读 invalidation.py here)。您无法控制此行为(例如更新缓存结果而不是驱逐它们),因此考虑其他策略可能意味着放弃 django-cachepos。
您说您的等待时间仍然很长(12-13 秒的请求),您需要进行更多挖掘才能了解原因。 django-cachepos 有用于分析this的统计数据。您应该检查缓存命中与未命中的百分比。我猜测,由于动态数据的性质(键在产生命中之前无效)以及过滤器的数量(如果后续查询在过滤器组合中是唯一的,则您将永远不会获得缓存命中),您的未命中次数多于命中次数并且始终查询数据库而不是缓存)。有限的缓存大小会放大这种行为(更少的空间意味着更多的驱逐,以便为新查询腾出空间)。
经过此分析,您应该考虑三件事:
qs = Article.objects.filter(created_at__gte=thirty_days_ago).cache()
results = [row for row in qs if apply_filters(row, other_filters)]