首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django缓存性能

Django缓存性能
EN

Stack Overflow用户
提问于 2011-09-02 04:35:12
回答 2查看 1.5K关注 0票数 2

我们现在将Redis用于我们的Django应用程序的内存缓存(我们以前使用过memcached,在性能上没有太大区别,我们使用Redis是因为磁盘转储功能)。

问题是,在我看来,Django缓存的性能非常糟糕。我们有视图,有102次缓存命中(没有未命中),需要81ms(只是缓存部分,用Django调试工具条测量)。在我看来--这是一个巨大的时间。我知道,对数据库进行查询会花费10倍以上的时间(甚至100倍),但即便如此,缓存性能也不是很好。

我们在不同的主机上运行Redis (和之前的memcached ),通过本地网络连接到其他服务器。

有没有办法在Django中调整缓存性能?

EN

回答 2

Stack Overflow用户

发布于 2011-09-06 08:45:07

问题很可能是需要为每个页面检索的项数,而不是缓存本身的性能。102个缓存调用意味着大量的时间损失在网络延迟上。有了对代码的完全控制,你可能可以用多线程或流水线来解决这个问题,但在这种情况下,你没有这个选择-使用框架意味着获得更简单的代码,但代价是在边缘情况下性能较低。

最简单的修复方法可能是将redis缓存移动到web服务器上--本地请求要快得多。这将使使缓存无效变得复杂,但您可能可以使用复制来解决这个问题-要么对主节点执行所有写入并从本地从节点读取,以便所有节点都具有相同的缓存,要么在需要使对象无效时使用主节点在本地写入,用于将del命令复制到所有从节点。

另一件要看的事情是,性能是否真的是一个问题。就单个用户的体验而言,300ms的加载时间并不算太差。只有当它意味着您不能跨所有用户每秒处理超过3个页面时才会有问题-在这种情况下,瓶颈是网络延迟而不是CPU或本地I/O,这是不太可能的。

票数 4
EN

Stack Overflow用户

发布于 2016-03-19 11:13:01

原因可能是主机之间的网络延迟。简单地与本地主机上的Redis通信将花费+200us (微秒)来处理较小的键和值。Memcached还通过网络进行通信,因此也存在同样的延迟问题。根据你分享的数字,每个请求大约需要800us。

并非所有缓存都通过网络进行通信。一种更快的方法是将缓存的部分内存直接映射到进程的内存中。如果你使用多个etc服务器,那么它们每个都有自己的缓存,但是如果你一致地路由请求(通过IP、用户名等)。您可以减少缓存未命中。假设您已经将数据库移动到一个单独的主机上,那么您的got服务器上可能有可用的空闲磁盘周期。

如果您想尝试这种方法,可以考虑使用DiskCache,这是一个Apache2许可的磁盘和文件后备缓存库,用纯Python语言编写,与Django兼容。DiskCache包括多个cache benchmarksDjango cache benchmarks。键和小值被内存映射到Django进程内存中,因此检索速度非常快(比设置快3-12倍)。如基准测试所示,"get“延迟甚至比Memcached (在localhost上)更短。还有许多可调的settings,您可以根据自己的喜好进行定制。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7276176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档