【问题标题】:Python Django cache vs store in model field? Which is more efficient?Python Django缓存与模型字段中的存储?哪个更有效率?
【发布时间】:2017-11-25 22:11:42
【问题描述】:

我的视图显示了一个数据表(特定于可能有很多用户的客户),这个表占用了大量的计算资源来填充。客户数据每周更改 4/5 次,通常在同一天。

缓存是一个明显的解决方案,但我想知道Django's cache framework 是否比在客户级别创建文本字段并在那里存储数据更有效?

我觉得它更容易实现(并在数据更改时清除文本字段)但是有什么缺点,还有什么我需要注意的吗? (如果数据集太大会出现问题?模型中的其他字段等???)

任何帮助将不胜感激!

【问题讨论】:

    标签: python django caching


    【解决方案1】:

    缓存就是缓存,不管你如何实现它,缓存的主要问题是失效。

    正如 Melvyn 正确回答的那样,缓存框架的情况是它(嗯,可以是,取决于您选择的后端)在您的数据库之外。无论是利还是弊,实际上都取决于您的数据库负载、基础架构和诸如此类的东西……如果您已经使用缓存框架(我的意思是不仅仅是无条件的全页缓存)并且想要最小化数据库上的负载,那么它就是可能值得增加复杂性。

    将您的计算结果存储在数据库中非常简单,不需要额外的服务器、安装等。我个人会选择专用模型 - 以避免数据库级别的不必要开销 - 包括缓存的结果以及此结果所依赖的参数的校验和(规范记忆模式),因此您可以轻松检测是否需要重新计算。我发现这个解决方案比尝试检测每个参数的更改以及“动态”无效/重新计算缓存更容易维护(这会使正确的缓存失效变得困难或至少难以实现)但是这又取决于这些参数是什么以及它们来自哪里。

    【讨论】:

    • 很好的答案,真正的测试是看看如果系统已经处于压力之下,计算需要多长时间。如果超时,您需要考虑在完成之前提供陈旧的数据,这对于缓存字段来说有点困难。不过,对于一个健全的基础设施来说,这是一个极端的案例。
    • 嗨布鲁诺,非常感谢。这是我想采用的方法,所以很高兴听到。您建议为该数据创建一个新模型,将文本字段直接添加到客户表中会不会是个坏主意?我正在阅读here,使用 Postgres(我就是)在这种情况下仍然有效,但我想知道是否还有其他需要考虑的地方?
    • 就我而言,如果只是因为它在语义上不相关,我仍然会将它远离客户表 - 一个实现细节,使用 db 作为一次性数据的位桶 - 你的客户表包含重要的业务数据。不仅如此,我还会在它前面放置一个外观 api,以隐藏它存储在您的数据库中的事实,因此切换到缓存后端或将此表移动到另一个数据库将仍然是非常本地化的实现更改。
    【解决方案2】:

    使用缓存框架的好处是您不必使用数据库。您可以独立于数据库扩展缓存存储,并在不同的物理(或虚拟)机器上运行缓存。

    此外,您不必实现陈旧与新鲜的逻辑,但这是一次性的。

    【讨论】:

      【解决方案3】:

      每周 4-5 次看起来不是什么大挑战,但是除了你之外没有人知道你有什么样的计算,你应该存储多少数据,你有多少用户等等。 如果你想用 TextField 来实现它,它仍然是某种缓存系统,所以我建议先使用 django 的缓存系统和数据库后端https://docs.djangoproject.com/en/1.11/topics/cache/#database-caching 你不能像 TextField 那样用 1 个查询来检索数据,但后来你如有必要,可以用其他层替换数据库。

      【讨论】:

        猜你喜欢
        • 2018-02-16
        • 2016-02-11
        • 2017-08-26
        • 2010-10-12
        • 2017-09-20
        • 2015-08-22
        • 2015-04-19
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多