我刚刚在我的 Web 应用程序中启用了 Django 的每个站点缓存(使用 Redis 作为我的缓存后端)并立即遇到了问题。我的网站包括一个用户个人资料页面,显示用户的照片和他们的个人简介。我还有一个表格,允许他们更改照片和/或个人简介。如果用户上传了一张新照片,我会为该照片创建一个新的唯一名称。如您所料,当用户转到该表单并上传一张新照片并且我重新显示他们的个人资料页面以便他们可以在提交新照片或个人简介之前对其进行审核时,该页面会显示他们的旧照片,因为我已经启用站点缓存。我可以禁用特定视图的缓存(即对于这种情况)还是必须禁用每个站点的缓存并在逐个视图的基础上实现它?这是我第一次使用缓存,我' 我不知道我应该采取什么方法。我有另一个视图/模板,显示当前登录的所有用户,我预计那里会遇到同样的问题,即他们的旧照片在更改后将继续显示。
谢谢你的建议。
自从我昨天发布这个问题以来,我一直在做大量的阅读,我将分享我所学到的。这些是我根据我阅读的内容而不是我的任何经验对您应该如何处理缓存的印象。因此,我可能会弄错一些事情。
首先,您不应该仅仅将缓存作为提高性能的灵丹妙药,尤其是在您不知道自己在做什么的情况下。缓存给你的堆栈增加了更多的复杂性,它会产生另一个故障点,显然它有时会导致难以解决的奇怪问题。在您弄清楚如何衡量您网站的性能、进行一些分析并实际上证明您有性能问题之前,您最好不要进行任何缓存。从我读到的内容来看,在尝试通过 Django 进行缓存之前,您最好专注于优化数据库查询和最小化页面权重。如果您想立即进行任何缓存,请查看通过您的 Web 服务器(Apache、Nginx 等)缓存您的图像、样式表和 JavaScript。
关于我的问题,我认为我对缓存的工作方式有错误的认识。当我在 Django 中启用“每站点”缓存时,我想我对 Django 说的是“将每个页面请求的每个响应存储在您的 Redis 缓存中,直到缓存填满并开始驱逐事物。” 如果请求页面并且该页面仍在缓存中,则缓存不会神奇地知道该页面是否已更改,然后去获取更新的版本(如果已更改)。无论我更改多少次,它都会继续返回该缓存页面(除非它被驱逐)。
作为测试,我所做的是将 @never_cache 装饰器应用于相关视图。这解决了我遇到的问题。然而,正如 Lorenzo 所暗示的,根据具体情况应用缓存可能是更好的方法。如果要缓存特定视图,请使用 @cache_page 装饰器。如果要缓存模板的一部分,请使用 {% cache %}。通过 Django 的低级 API“django.core.cache.caches”缓存计算成本高昂的实际数据。如果您想根据缓存过期和/或验证进行缓存,请通过 @condition 装饰器使用 Django 的“条件视图处理”功能。
如果你是完全陌生的缓存,我强烈建议你阅读马克诺丁汉的缓存教程和赖恩·托马科的事情缓存待办事项。
我希望这有帮助!