Django网络应用的缓存

4 投票
2 回答
1178 浏览
提问于 2025-04-16 12:15

我想问一下关于在Django中缓存数据库更新的最佳实践。

我正在写一个票务系统。我有一个票务模型(Ticket)和一个更新模型(Update)。每次用户给票务添加更新时,就会创建一个更新,并把它作为外键链接到票务上。

我有一个票务详情视图(TicketDetail),它显示票务的描述和相关的更新。用户可以在这个视图中添加更新。我已经启用了全站缓存,使用的是memcached。

如果用户添加了更新,然后重新加载这个视图,他们会发现更新暂时看不到。我明白这是为什么,因为我需要为每个视图启用缓存,并且要在这个视图中关闭缓存。

但是为了充分利用缓存的速度,我其实希望能够为这个视图启用缓存,但在用户进行更新后立即使缓存失效。

有没有简单的方法可以做到这一点?非常感谢!

2 个回答

0

这可能不是你想要的,但 johnny-cache 可以缓存查询集,并且在写入数据时会自动失效。

它可能已经能满足你的需求了,而且在设置好之后使用起来非常简单。

1

使用memcached来处理过期数据的更新或失效时,会遇到一些问题,主要是因为竞争条件。这是Johnny Cache的一个重要部分。在你的例子中,假设总共有10个更新,然后有两个不同的用户在两个不同的进程中创建了一个工单更新。很可能你最终只会显示11个更新给这两个用户,尽管实际上总共有12个更新:其中一个用户可能会感到非常困惑。

如果你使用memcached作为存储,这种问题在任何模型或查询集失效的解决方案中都会出现。因为你并没有从多个不同的表中连接很多行,所以这不应该被视为一个耗时的查询——你可能只需要依赖数据库就可以了。

不过,由于我不了解你工作的全部情况,所以不太合适建议你这样做。不过,我建议你可以考虑使用mongoDB、Tokyo Cabinet或Redis作为memcached的替代缓存,特别是在你需要对关键用户数据的更新进行精细控制的情况下。

另一个方法是让所有更新这些数据的请求都通过一个只运行在单个进程中的应用实例。这可以完全消除memcached上的更新竞争,这种方法适合读取远多于写入的应用,尽管我能理解这可能会迅速变成开发者的维护噩梦。

撰写回答