今天的Python学习教程绝对是纯技术的分享, 关于Django项目缓存优化问题的详细讲解! 一起来看看: 一、为什么要使用缓存大家可以想一下Django的请求响应流程: → 用户浏览器输入URL地址 → Web服务器将HTTP请求转发给uWSGI服务器 → uWSGI服务器将Request请求转发给Django应用 → Django中间件处理Request请求 → 视图View处理 → 模型类Models获取数据 → 模板Template渲染 → 再次经过Django中间件返回 → uWSGI服务器将Response返回给Web服务器 → Web服务器响应客户端的HTTP请求。 这其中耗时最多的2个环节通常是视图中业务逻辑处理和从Models获取数据(SQL查询),对于相同目的请求,也就是业务处理逻辑和SQL查询的数据都一样的请求,每次都进行了重复的计算,并且数据是从硬盘读取而非内存。 所以使用缓存有如下好处:
二、如何进行缓存很简单,一个Request请求过来,先去缓存中查询,有就返回;没有就去数据库查询并处理,然后把结果缓存好(供下次请求使用),再返回。用伪代码解释的话就是这样 三、缓存的类型1. Memcached 效率最高,最快的缓存 那么问题来了,我该使用哪种缓存呢? 其实常用的也就2种:Memcached或者Reids,其它基本不用考虑了。Redis国内用得多,支持RDB和AOF两种持久化方式,支持高可用集群,技术和方案很成熟。Memcached是纯内存存储,本身不支持持久化,不支持分布式,但是它内存管理效率高。 四、缓存粒度分类
那么问题又来了,项目中我该选择什么样的缓存粒度? 是否需要缓存很简单,看内容是否变化。如果整个视图的数据通常都不变,就使用视图缓存,某些模板片段的数据不变就使用模板片段缓存等等。所以一个项目里面多种缓存粒度都有的 五、Django缓存设置这里只说一下Redis和Memcached的,其它很少用的就不罗列了,需要注意的是系统上要安装对应的缓存服务,Django开发环境中要安装连接缓存服务的包(比如django-redis或pymemcache) Memcache缓存设置 最简单的,配置地址和端口,不一定是要在本机,也可以是其它网段的服务器或集群 在本机的话,也可以使用unix Socket 也可以使用多态服务器,不同端口缓存 Redis缓存设置 截图一下实战课程中Redis缓存的配置,缓存网站的数据 Django channels频道层的缓存 Celery缓存,broker和任务的执行结果 六、缓存的使用对于Django项目缓存的数据,我们取出来或存进去操作,可以不需要直接操作底层的缓存数据,比如使用原生的Redis或Memcached命令,只需要使用Django提供的缓存API即可。就像我们使用Django ORM一样,无需关注底层数据库是MySQL, PostgreSQL或SQLite,ORM语句都一样。 例如,访问缓存 使用缓存 除了set(), get()还有get_or_set(), get_many(), set_many(), delete(), delete_many(), clear(), touch(), incr(), decr(), close()操作。大家可以去看看官网文档一个个操作下,要注意的是有的API不是每一个Django版本都有,比如cache.touch()是Django 2.1版本才有的。 七、Django缓存优化性能评估缓存使用了,那效果怎么样,有什么指标可以衡量?用什么工具来衡量? Django Debug Toolbar 这点在之前的Python学习教程中有跟大家讲到过! django-debug-toolbar是一个开源的工具,可以在看板上展示django对request/response处理的详细信息,比如当前请求响应的CPU耗时,settings/headers/request信息,当前请求使用的模板文件,静态文件,具体SQL语句和执行时间等等,看板要显示什么信息是可以灵活配置的。 右边的栏目就是django-debug-tool的看板 此页面共有9次SQL查询,耗时8.62毫秒 缓存命中3次,cache.get(),用时约0.91毫秒 Jmeter压力测试 django-debug-tool是开发人员用,从功能角度测试缓存效果。而Jmeter就是专门测试人员用的,用于性能测试和压力测试。项目使用缓存后,整体性能是不是提高了,高负载情况下系统稳定性怎么样。测试方面的知识就不具体展开了,不太清楚的伙伴可以私信或者留言哈!更多的Python学习教程也会继续为大家更新! |
|
来自: 千锋Python学堂 > 《Python基础教程分享》